diff options
Diffstat (limited to 'payloads/libpayload/drivers')
-rw-r--r-- | payloads/libpayload/drivers/usb/usbmsc.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/payloads/libpayload/drivers/usb/usbmsc.c b/payloads/libpayload/drivers/usb/usbmsc.c index d793e34ba7..2412e99af3 100644 --- a/payloads/libpayload/drivers/usb/usbmsc.c +++ b/payloads/libpayload/drivers/usb/usbmsc.c @@ -157,6 +157,9 @@ reset_transport (usbdev_t *dev) dr.wIndex = 0; dr.wLength = 0; + if (MSC_INST (dev)->quirks & USB_MSC_QUIRK_NO_RESET) + return MSC_COMMAND_FAIL; + /* if any of these fails, detach device, as we are lost */ if (dev->controller->control (dev, OUT, sizeof (dr), &dr, 0, 0) < 0 || clear_stall (MSC_INST (dev)->bulk_in) || @@ -185,7 +188,8 @@ initialize_luns (usbdev_t *dev) dr.wValue = 0; dr.wIndex = 0; dr.wLength = 1; - if (dev->controller->control (dev, IN, sizeof (dr), &dr, + if (MSC_INST (dev)->quirks & USB_MSC_QUIRK_NO_LUNS || + dev->controller->control (dev, IN, sizeof (dr), &dr, sizeof (msc->num_luns), &msc->num_luns) < 0) msc->num_luns = 0; /* assume only 1 lun if req fails */ msc->num_luns++; /* Get Max LUN returns number of last LUN */ @@ -600,14 +604,6 @@ usb_msc_test_unit_ready (usbdev_t *dev) void usb_msc_init (usbdev_t *dev) { - int i; - - /* init .data before setting .destroy */ - dev->data = NULL; - - dev->destroy = usb_msc_destroy; - dev->poll = usb_msc_poll; - configuration_descriptor_t *cd = (configuration_descriptor_t *) dev->configuration; interface_descriptor_t *interface = @@ -634,6 +630,19 @@ usb_msc_init (usbdev_t *dev) return; } + usb_msc_force_init (dev, 0); +} + +void usb_msc_force_init (usbdev_t *dev, u32 quirks) +{ + int i; + + /* init .data before setting .destroy */ + dev->data = NULL; + + dev->destroy = usb_msc_destroy; + dev->poll = usb_msc_poll; + dev->data = malloc (sizeof (usbmsc_inst_t)); if (!dev->data) fatal("Not enough memory for USB MSC device.\n"); @@ -641,6 +650,7 @@ usb_msc_init (usbdev_t *dev) MSC_INST (dev)->bulk_in = 0; MSC_INST (dev)->bulk_out = 0; MSC_INST (dev)->usbdisk_created = 0; + MSC_INST (dev)->quirks = quirks; for (i = 1; i <= dev->num_endp; i++) { if (dev->endpoints[i].endpoint == 0) |