blob: 65d0705e3a7af61f00350ed35335cf8351cf712a [file] [log] [blame]
#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 */