summaryrefslogtreecommitdiffstats
path: root/src/VBox/Devices/PC/ipxe/src/drivers/usb/usbblk.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/VBox/Devices/PC/ipxe/src/drivers/usb/usbblk.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/VBox/Devices/PC/ipxe/src/drivers/usb/usbblk.h b/src/VBox/Devices/PC/ipxe/src/drivers/usb/usbblk.h
new file mode 100644
index 00000000..65d0705e
--- /dev/null
+++ b/src/VBox/Devices/PC/ipxe/src/drivers/usb/usbblk.h
@@ -0,0 +1,121 @@
+#ifndef _USBBLK_H
+#define _USBBLK_H
+
+/** @file
+ *
+ * USB mass storage driver
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <stdint.h>
+#include <ipxe/usb.h>
+#include <ipxe/scsi.h>
+#include <ipxe/interface.h>
+
+/** Mass storage class code */
+#define USB_CLASS_MSC 0x08
+
+/** SCSI command set subclass code */
+#define USB_SUBCLASS_MSC_SCSI 0x06
+
+/** Bulk-only transport protocol */
+#define USB_PROTOCOL_MSC_BULK 0x50
+
+/** Mass storage reset command */
+#define USBBLK_RESET ( USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \
+ USB_REQUEST_TYPE ( 255 ) )
+
+/** Command block wrapper */
+struct usbblk_command_wrapper {
+ /** Signature */
+ uint32_t signature;
+ /** Tag */
+ uint32_t tag;
+ /** Data transfer length */
+ uint32_t len;
+ /** Flags */
+ uint8_t flags;
+ /** LUN */
+ uint8_t lun;
+ /** Command block length */
+ uint8_t cblen;
+ /** Command block */
+ uint8_t cb[16];
+} __attribute__ (( packed ));
+
+/** Command block wrapper signature */
+#define USBBLK_COMMAND_SIGNATURE 0x43425355UL
+
+/** Command status wrapper */
+struct usbblk_status_wrapper {
+ /** Signature */
+ uint32_t signature;
+ /** Tag */
+ uint32_t tag;
+ /** Data residue */
+ uint32_t residue;
+ /** Status */
+ uint8_t status;
+} __attribute__ (( packed ));
+
+/** Command status wrapper signature */
+#define USBBLK_STATUS_SIGNATURE 0x53425355UL
+
+/** A USB mass storage command */
+struct usbblk_command {
+ /** SCSI command */
+ struct scsi_cmd scsi;
+ /** Command tag (0 for no command in progress) */
+ uint32_t tag;
+ /** Offset within data buffer */
+ size_t offset;
+};
+
+/** A USB mass storage device */
+struct usbblk_device {
+ /** Reference count */
+ struct refcnt refcnt;
+ /** List of devices */
+ struct list_head list;
+
+ /** USB function */
+ struct usb_function *func;
+ /** Bulk OUT endpoint */
+ struct usb_endpoint out;
+ /** Bulk IN endpoint */
+ struct usb_endpoint in;
+
+ /** SCSI command-issuing interface */
+ struct interface scsi;
+ /** SCSI data interface */
+ struct interface data;
+ /** Command process */
+ struct process process;
+ /** Device opened flag */
+ int opened;
+
+ /** Current command (if any) */
+ struct usbblk_command cmd;
+};
+
+/** Command tag magic
+ *
+ * This is a policy decision.
+ */
+#define USBBLK_TAG_MAGIC 0x18ae0000
+
+/** Maximum length of USB data block
+ *
+ * This is a policy decision.
+ */
+#define USBBLK_MAX_LEN 2048
+
+/** Maximum endpoint fill level
+ *
+ * This is a policy decision.
+ */
+#define USBBLK_MAX_FILL 4
+
+#endif /* _USBBLK_H */