diff options
author | Julius Werner <jwerner@chromium.org> | 2019-07-10 15:53:59 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2019-08-22 10:37:26 +0000 |
commit | 277498c2834a11c337faf3677782943f210a5c1f (patch) | |
tree | ef43974418f75584c4a665c7d1a6430ec774bacd /payloads/libpayload/include | |
parent | 182fea717e413bf3c0920920da13a98aa8fe890c (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/include')
-rw-r--r-- | payloads/libpayload/include/usb/usbmsc.h | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/payloads/libpayload/include/usb/usbmsc.h b/payloads/libpayload/include/usb/usbmsc.h index f4562a56d5..8786586e51 100644 --- a/payloads/libpayload/include/usb/usbmsc.h +++ b/payloads/libpayload/include/usb/usbmsc.h @@ -34,13 +34,24 @@ typedef struct { unsigned int numblocks; endpoint_t *bulk_in; endpoint_t *bulk_out; - u8 usbdisk_created; + u8 quirks : 7; + u8 usbdisk_created : 1; s8 ready; u8 lun; u8 num_luns; void *data; /* For use by consumers of libpayload. */ } usbmsc_inst_t; +/* Possible values for quirks field. */ +enum { + /* Don't check for LUNs (force assumption that there's only one LUN). */ + USB_MSC_QUIRK_NO_LUNS = 1 << 0, + /* Never do a BULK_ONLY reset, just continue. This means that the device + cannot recover from phase errors and won't detach automatically for + unrecoverable errors. Do not use unless you have to. */ + USB_MSC_QUIRK_NO_RESET = 1 << 1, +}; + /* Possible values for ready field. */ enum { USB_MSC_DETACHED = -1, /* Disk detached or out to lunch. */ @@ -56,4 +67,8 @@ typedef enum { cbw_direction_data_in = 0x80, cbw_direction_data_out = 0 int readwrite_blocks_512 (usbdev_t *dev, int start, int n, cbw_direction dir, u8 *buf); int readwrite_blocks (usbdev_t *dev, int start, int n, cbw_direction dir, u8 *buf); +/* Force a device to enumerate as MSC, without checking class/protocol types. + It must still have a bulk endpoint pair and respond to MSC commands. */ +void usb_msc_force_init (usbdev_t *dev, u32 quirks); + #endif |