summaryrefslogtreecommitdiff
path: root/payloads/libpayload/drivers/usb
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2019-07-10 15:53:59 -0700
committerPatrick Georgi <pgeorgi@google.com>2019-08-22 10:37:26 +0000
commit277498c2834a11c337faf3677782943f210a5c1f (patch)
treeef43974418f75584c4a665c7d1a6430ec774bacd /payloads/libpayload/drivers/usb
parent182fea717e413bf3c0920920da13a98aa8fe890c (diff)
libpayload: usbmsc: Factor out usb_msc_force_init() function
We're planning to have a use case with a custom USB device that implements the USB mass storage protocol on its bulk endpoints, but does not have the normal MSC class/protocol interface descriptors and does not support class-specific control requests (Get Max LUN and Bulk-Only Reset). We'd like to identify/enumerate the device via usb_generic_create() in our payload but then reuse all the normal MSC driver code. In order to make that possible, this patch factors a new usb_msc_force_init() function out of usb_msc_init() which will initialize an MSC device without checking its descriptors. It also adds some "quirks" flags that allow devices registered this way to customize behavior of the MSC stack. Change-Id: I50392128409cb2a879954f234149a5e3b060a229 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/34227 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'payloads/libpayload/drivers/usb')
-rw-r--r--payloads/libpayload/drivers/usb/usbmsc.c28
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)