Changeset View
Changeset View
Standalone View
Standalone View
head/sys/boot/usb/storage/umass_loader.c
Show First 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | |||||
#include USB_GLOBAL_INCLUDE_FILE | #include USB_GLOBAL_INCLUDE_FILE | ||||
#include "umass_common.h" | #include "umass_common.h" | ||||
static int umass_disk_init(void); | static int umass_disk_init(void); | ||||
static int umass_disk_open(struct open_file *,...); | static int umass_disk_open(struct open_file *,...); | ||||
static int umass_disk_close(struct open_file *); | static int umass_disk_close(struct open_file *); | ||||
static void umass_disk_cleanup(void); | static void umass_disk_cleanup(void); | ||||
static int umass_disk_ioctl(struct open_file *, u_long, void *); | |||||
static int umass_disk_strategy(void *, int, daddr_t, size_t, char *, size_t *); | static int umass_disk_strategy(void *, int, daddr_t, size_t, char *, size_t *); | ||||
static void umass_disk_print(int); | static void umass_disk_print(int); | ||||
struct devsw umass_disk = { | struct devsw umass_disk = { | ||||
.dv_name = "umass", | .dv_name = "umass", | ||||
.dv_type = DEVT_DISK, | .dv_type = DEVT_DISK, | ||||
.dv_init = umass_disk_init, | .dv_init = umass_disk_init, | ||||
.dv_strategy = umass_disk_strategy, | .dv_strategy = umass_disk_strategy, | ||||
.dv_open = umass_disk_open, | .dv_open = umass_disk_open, | ||||
.dv_close = umass_disk_close, | .dv_close = umass_disk_close, | ||||
.dv_ioctl = noioctl, | .dv_ioctl = umass_disk_ioctl, | ||||
.dv_print = umass_disk_print, | .dv_print = umass_disk_print, | ||||
.dv_cleanup = umass_disk_cleanup, | .dv_cleanup = umass_disk_cleanup, | ||||
}; | }; | ||||
static int | static int | ||||
umass_disk_init(void) | umass_disk_init(void) | ||||
{ | { | ||||
uint32_t time; | uint32_t time; | ||||
▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | umass_disk_open(struct open_file *f,...) | ||||
dev = va_arg(ap, struct disk_devdesc *); | dev = va_arg(ap, struct disk_devdesc *); | ||||
va_end(ap); | va_end(ap); | ||||
if (umass_uaa.device == NULL) | if (umass_uaa.device == NULL) | ||||
return (ENXIO); | return (ENXIO); | ||||
if (dev->d_unit != 0) | if (dev->d_unit != 0) | ||||
return (EIO); | return (EIO); | ||||
return (umass_disk_open_sub(dev)); | return (umass_disk_open_sub(dev)); | ||||
} | |||||
static int | |||||
umass_disk_ioctl(struct open_file *f __unused, u_long cmd, void *buf) | |||||
{ | |||||
uint32_t nblock; | |||||
uint32_t blocksize; | |||||
switch (cmd) { | |||||
case IOCTL_GET_BLOCK_SIZE: | |||||
case IOCTL_GET_BLOCKS: | |||||
if (usb_msc_read_capacity(umass_uaa.device, 0, | |||||
&nblock, &blocksize) != 0) | |||||
return (EINVAL); | |||||
if (cmd == IOCTL_GET_BLOCKS) | |||||
*(uint32_t*)buf = nblock; | |||||
else | |||||
*(uint32_t*)buf = blocksize; | |||||
return (0); | |||||
default: | |||||
return (ENXIO); | |||||
} | |||||
} | } | ||||
static int | static int | ||||
umass_disk_close(struct open_file *f) | umass_disk_close(struct open_file *f) | ||||
{ | { | ||||
struct disk_devdesc *dev; | struct disk_devdesc *dev; | ||||
dev = (struct disk_devdesc *)f->f_devdata; | dev = (struct disk_devdesc *)f->f_devdata; | ||||
▲ Show 20 Lines • Show All 54 Lines • Show Last 20 Lines |