[U-Boot] [U-Boot PATCH V2 1/9] usb: ums: split macro and data struct in storage_common.c
Lukasz Majewski
lukma at denx.de
Wed Apr 19 15:19:30 UTC 2017
Hi Eddie,
Sorry for late reply - the Easter break.
I would prefer to keep things as they are now.
The reason is that f_mass_storage gadget in Linux has the same file
structure as u-boot -
e.g. ./drivers/usb/gadget/function/storage_common.c in Linux tree.
It would be easier then to update the u-boot to Linux code if needed
(or ported to DM).
Best regards,
Łukasz Majewski
> split the macro and data struct in storage_common.c to
> f_mass_storage.h
>
> Signed-off-by: Eddie Cai <eddie.cai.linux at gmail.com>
> ---
> drivers/usb/gadget/storage_common.c | 380
> +---------------------------------
> include/f_mass_storage.h | 393
> ++++++++++++++++++++++++++++++++++++ 2 files changed, 394
> insertions(+), 379 deletions(-) create mode 100644
> include/f_mass_storage.h
>
> diff --git a/drivers/usb/gadget/storage_common.c
> b/drivers/usb/gadget/storage_common.c index b6df130..bea7607 100644
> --- a/drivers/usb/gadget/storage_common.c
> +++ b/drivers/usb/gadget/storage_common.c
> @@ -14,385 +14,7 @@
> * SPDX-License-Identifier: GPL-2.0+
> */
>
> -
> -/*
> - * This file requires the following identifiers used in USB strings
> to
> - * be defined (each of type pointer to char):
> - * - fsg_string_manufacturer -- name of the manufacturer
> - * - fsg_string_product -- name of the product
> - * - fsg_string_serial -- product's serial
> - * - fsg_string_config -- name of the configuration
> - * - fsg_string_interface -- name of the interface
> - * The first four are only needed when FSG_DESCRIPTORS_DEVICE_STRINGS
> - * macro is defined prior to including this file.
> - */
> -
> -/*
> - * When FSG_NO_INTR_EP is defined fsg_fs_intr_in_desc and
> - * fsg_hs_intr_in_desc objects as well as
> - * FSG_FS_FUNCTION_PRE_EP_ENTRIES and FSG_HS_FUNCTION_PRE_EP_ENTRIES
> - * macros are not defined.
> - *
> - * When FSG_NO_DEVICE_STRINGS is defined FSG_STRING_MANUFACTURER,
> - * FSG_STRING_PRODUCT, FSG_STRING_SERIAL and FSG_STRING_CONFIG are
> not
> - * defined (as well as corresponding entries in string tables are
> - * missing) and FSG_STRING_INTERFACE has value of zero.
> - *
> - * When FSG_NO_OTG is defined fsg_otg_desc won't be defined.
> - */
> -
> -/*
> - * When FSG_BUFFHD_STATIC_BUFFER is defined when this file is
> included
> - * the fsg_buffhd structure's buf field will be an array of
> FSG_BUFLEN
> - * characters rather then a pointer to void.
> - */
> -
> -
> -/* #include <asm/unaligned.h> */
> -
> -
> -/*
> - * Thanks to NetChip Technologies for donating this product ID.
> - *
> - * DO NOT REUSE THESE IDs with any other driver!! Ever!!
> - * Instead: allocate your own, using normal USB-IF procedures.
> - */
> -#define FSG_VENDOR_ID 0x0525 /* NetChip */
> -#define FSG_PRODUCT_ID 0xa4a5 /* Linux-USB File-backed
> Storage Gadget */ -
> -/*-------------------------------------------------------------------------*/
> -
> -#ifndef DEBUG
> -#undef VERBOSE_DEBUG
> -#undef DUMP_MSGS
> -#endif /* !DEBUG */
> -
> -#ifdef VERBOSE_DEBUG
> -#define VLDBG LDBG
> -#else
> -#define VLDBG(lun, fmt, args...) do { } while (0)
> -#endif /* VERBOSE_DEBUG */
> -
> -/*
> -#define LDBG(lun, fmt, args...) dev_dbg (&(lun)->dev, fmt, ## args)
> -#define LERROR(lun, fmt, args...) dev_err (&(lun)->dev, fmt, ## args)
> -#define LWARN(lun, fmt, args...) dev_warn(&(lun)->dev, fmt, ## args)
> -#define LINFO(lun, fmt, args...) dev_info(&(lun)->dev, fmt, ## args)
> -*/
> -
> -#define LDBG(lun, fmt, args...) do { } while (0)
> -#define LERROR(lun, fmt, args...) do { } while (0)
> -#define LWARN(lun, fmt, args...) do { } while (0)
> -#define LINFO(lun, fmt, args...) do { } while (0)
> -
> -/*
> - * Keep those macros in sync with those in
> - * include/linux/usb/composite.h or else GCC will complain. If they
> - * are identical (the same names of arguments, white spaces in the
> - * same places) GCC will allow redefinition otherwise (even if some
> - * white space is removed or added) warning will be issued.
> - *
> - * Those macros are needed here because File Storage Gadget does not
> - * include the composite.h header. For composite gadgets those
> macros
> - * are redundant since composite.h is included any way.
> - *
> - * One could check whether those macros are already defined (which
> - * would indicate composite.h had been included) or not (which would
> - * indicate we were in FSG) but this is not done because a warning is
> - * desired if definitions here differ from the ones in composite.h.
> - *
> - * We want the definitions to match and be the same in File Storage
> - * Gadget as well as Mass Storage Function (and so composite gadgets
> - * using MSF). If someone changes them in composite.h it will
> produce
> - * a warning in this file when building MSF.
> - */
> -
> -#define DBG(d, fmt, args...) debug(fmt , ## args)
> -#define VDBG(d, fmt, args...) debug(fmt , ## args)
> -/* #define ERROR(d, fmt, args...) printf(fmt , ## args) */
> -/* #define WARNING(d, fmt, args...) printf(fmt , ## args) */
> -/* #define INFO(d, fmt, args...) printf(fmt , ## args) */
> -
> -/* #define DBG(d, fmt, args...) do { } while (0) */
> -/* #define VDBG(d, fmt, args...) do { } while (0) */
> -#define ERROR(d, fmt, args...) do { } while (0)
> -#define WARNING(d, fmt, args...) do { } while (0)
> -#define INFO(d, fmt, args...) do { } while (0)
> -
> -#ifdef DUMP_MSGS
> -
> -/* dump_msg(fsg, const char * label, const u8 * buf, unsigned
> length); */ -# define dump_msg(fsg, label, buf, length) do
> { \
> - if (length < 512)
> { \
> - DBG(fsg, "%s, length %u:\n", label,
> length); \
> - print_hex_dump(KERN_DEBUG, "",
> DUMP_PREFIX_OFFSET, \
> - 16, 1, buf, length,
> 0); \
> - }
> \ -} while (0)
> -
> -# define dump_cdb(fsg) do { } while (0)
> -
> -#else
> -
> -# define dump_msg(fsg, /* const char * */ label, \
> - /* const u8 * */ buf, /* unsigned */ length) do
> { } while (0) -
> -# ifdef VERBOSE_DEBUG
> -
> -# define
> dump_cdb(fsg) \
> - print_hex_dump(KERN_DEBUG, "SCSI CDB: ",
> DUMP_PREFIX_NONE, \
> - 16, 1, (fsg)->cmnd, (fsg)->cmnd_size,
> 0) \ -
> -# else
> -
> -# define dump_cdb(fsg) do { } while (0)
> -
> -# endif /* VERBOSE_DEBUG */
> -
> -#endif /* DUMP_MSGS */
> -
> -/*-------------------------------------------------------------------------*/
> -
> -/* SCSI device types */
> -#define TYPE_DISK 0x00
> -#define TYPE_CDROM 0x05
> -
> -/* USB protocol value = the transport method */
> -#define USB_PR_CBI 0x00 /*
> Control/Bulk/Interrupt */ -#define USB_PR_CB
> 0x01 /* Control/Bulk w/o interrupt */ -#define
> USB_PR_BULK 0x50 /* Bulk-only */ -
> -/* USB subclass value = the protocol encapsulation */
> -#define USB_SC_RBC 0x01 /* Reduced Block
> Commands (flash) */ -#define USB_SC_8020
> 0x02 /* SFF-8020i, MMC-2, ATAPI (CD-ROM) */ -#define
> USB_SC_QIC 0x03 /* QIC-157 (tape) */ -#define
> USB_SC_UFI 0x04 /* UFI (floppy) */ -#define
> USB_SC_8070 0x05 /* SFF-8070i (removable) */
> -#define USB_SC_SCSI 0x06 /* Transparent SCSI
> */ - -/* Bulk-only data structures */
> -
> -/* Command Block Wrapper */
> -struct fsg_bulk_cb_wrap {
> - __le32 Signature; /* Contains 'USBC' */
> - u32 Tag; /* Unique per command
> id */
> - __le32 DataTransferLength; /* Size of the data
> */
> - u8 Flags; /* Direction in bit
> 7 */
> - u8 Lun; /* LUN (normally 0) */
> - u8 Length; /* Of the CDB, <=
> MAX_COMMAND_SIZE */
> - u8 CDB[16]; /* Command Data Block */
> -};
> -
> -#define USB_BULK_CB_WRAP_LEN 31
> -#define USB_BULK_CB_SIG 0x43425355 /* Spells
> out USBC */ -#define USB_BULK_IN_FLAG 0x80
> -
> -/* Command Status Wrapper */
> -struct bulk_cs_wrap {
> - __le32 Signature; /* Should = 'USBS' */
> - u32 Tag; /* Same as original
> command */
> - __le32 Residue; /* Amount not
> transferred */
> - u8 Status; /* See below */
> -};
> -
> -#define USB_BULK_CS_WRAP_LEN 13
> -#define USB_BULK_CS_SIG 0x53425355 /* Spells
> out 'USBS' */ -#define USB_STATUS_PASS 0
> -#define USB_STATUS_FAIL 1
> -#define USB_STATUS_PHASE_ERROR 2
> -
> -/* Bulk-only class specific requests */
> -#define USB_BULK_RESET_REQUEST 0xff
> -#define USB_BULK_GET_MAX_LUN_REQUEST 0xfe
> -
> -/* CBI Interrupt data structure */
> -struct interrupt_data {
> - u8 bType;
> - u8 bValue;
> -};
> -
> -#define CBI_INTERRUPT_DATA_LEN 2
> -
> -/* CBI Accept Device-Specific Command request */
> -#define USB_CBI_ADSC_REQUEST 0x00
> -
> -/* Length of a SCSI Command Data Block */
> -#define MAX_COMMAND_SIZE 16
> -
> -/* SCSI commands that we recognize */
> -#define SC_FORMAT_UNIT 0x04
> -#define SC_INQUIRY 0x12
> -#define SC_MODE_SELECT_6 0x15
> -#define SC_MODE_SELECT_10 0x55
> -#define SC_MODE_SENSE_6 0x1a
> -#define SC_MODE_SENSE_10 0x5a
> -#define SC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
> -#define SC_READ_6 0x08
> -#define SC_READ_10 0x28
> -#define SC_READ_12 0xa8
> -#define SC_READ_CAPACITY 0x25
> -#define SC_READ_FORMAT_CAPACITIES 0x23
> -#define SC_READ_HEADER 0x44
> -#define SC_READ_TOC 0x43
> -#define SC_RELEASE 0x17
> -#define SC_REQUEST_SENSE 0x03
> -#define SC_RESERVE 0x16
> -#define SC_SEND_DIAGNOSTIC 0x1d
> -#define SC_START_STOP_UNIT 0x1b
> -#define SC_SYNCHRONIZE_CACHE 0x35
> -#define SC_TEST_UNIT_READY 0x00
> -#define SC_VERIFY 0x2f
> -#define SC_WRITE_6 0x0a
> -#define SC_WRITE_10 0x2a
> -#define SC_WRITE_12 0xaa
> -
> -/* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */
> -#define SS_NO_SENSE 0
> -#define SS_COMMUNICATION_FAILURE 0x040800
> -#define SS_INVALID_COMMAND 0x052000
> -#define SS_INVALID_FIELD_IN_CDB 0x052400
> -#define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x052100
> -#define SS_LOGICAL_UNIT_NOT_SUPPORTED 0x052500
> -#define SS_MEDIUM_NOT_PRESENT 0x023a00
> -#define SS_MEDIUM_REMOVAL_PREVENTED 0x055302
> -#define SS_NOT_READY_TO_READY_TRANSITION 0x062800
> -#define SS_RESET_OCCURRED 0x062900
> -#define SS_SAVING_PARAMETERS_NOT_SUPPORTED 0x053900
> -#define SS_UNRECOVERED_READ_ERROR 0x031100
> -#define SS_WRITE_ERROR 0x030c02
> -#define SS_WRITE_PROTECTED 0x072700
> -
> -#define SK(x) ((u8) ((x) >> 16)) /* Sense Key
> byte, etc. */ -#define ASC(x) ((u8) ((x) >> 8))
> -#define ASCQ(x) ((u8) (x))
> -
> -struct device_attribute { int i; };
> -#define ETOOSMALL 525
> -
> -#include <usb_mass_storage.h>
> -
> -/*-------------------------------------------------------------------------*/
> -
> -struct fsg_lun {
> - loff_t file_length;
> - loff_t num_sectors;
> -
> - unsigned int initially_ro:1;
> - unsigned int ro:1;
> - unsigned int removable:1;
> - unsigned int cdrom:1;
> - unsigned int prevent_medium_removal:1;
> - unsigned int registered:1;
> - unsigned int info_valid:1;
> - unsigned int nofua:1;
> -
> - u32 sense_data;
> - u32 sense_data_info;
> - u32 unit_attention_data;
> -
> - struct device dev;
> -};
> -
> -#define fsg_lun_is_open(curlun) ((curlun)->filp != NULL)
> -#if 0
> -static struct fsg_lun *fsg_lun_from_dev(struct device *dev)
> -{
> - return container_of(dev, struct fsg_lun, dev);
> -}
> -#endif
> -
> -/* Big enough to hold our biggest descriptor */
> -#define EP0_BUFSIZE 256
> -#define DELAYED_STATUS (EP0_BUFSIZE + 999) /* An
> impossibly large value */ -
> -/* Number of buffers we will use. 2 is enough for double-buffering
> */ -#define FSG_NUM_BUFFERS 2
> -
> -/* Default size of buffer length. */
> -#define FSG_BUFLEN ((u32)16384)
> -
> -/* Maximal number of LUNs supported in mass storage function */
> -#define FSG_MAX_LUNS 8
> -
> -enum fsg_buffer_state {
> - BUF_STATE_EMPTY = 0,
> - BUF_STATE_FULL,
> - BUF_STATE_BUSY
> -};
> -
> -struct fsg_buffhd {
> -#ifdef FSG_BUFFHD_STATIC_BUFFER
> - char buf[FSG_BUFLEN];
> -#else
> - void *buf;
> -#endif
> - enum fsg_buffer_state state;
> - struct fsg_buffhd *next;
> -
> - /*
> - * The NetChip 2280 is faster, and handles some protocol
> faults
> - * better, if we don't submit any short bulk-out read
> requests.
> - * So we will record the intended request length here.
> - */
> - unsigned int bulk_out_intended_length;
> -
> - struct usb_request *inreq;
> - int inreq_busy;
> - struct usb_request *outreq;
> - int outreq_busy;
> -};
> -
> -enum fsg_state {
> - /* This one isn't used anywhere */
> - FSG_STATE_COMMAND_PHASE = -10,
> - FSG_STATE_DATA_PHASE,
> - FSG_STATE_STATUS_PHASE,
> -
> - FSG_STATE_IDLE = 0,
> - FSG_STATE_ABORT_BULK_OUT,
> - FSG_STATE_RESET,
> - FSG_STATE_INTERFACE_CHANGE,
> - FSG_STATE_CONFIG_CHANGE,
> - FSG_STATE_DISCONNECT,
> - FSG_STATE_EXIT,
> - FSG_STATE_TERMINATED
> -};
> -
> -enum data_direction {
> - DATA_DIR_UNKNOWN = 0,
> - DATA_DIR_FROM_HOST,
> - DATA_DIR_TO_HOST,
> - DATA_DIR_NONE
> -};
> -
> -/*-------------------------------------------------------------------------*/
> -
> -static inline u32 get_unaligned_be24(u8 *buf)
> -{
> - return 0xffffff & (u32) get_unaligned_be32(buf - 1);
> -}
> -
> -/*-------------------------------------------------------------------------*/
> -
> -enum {
> -#ifndef FSG_NO_DEVICE_STRINGS
> - FSG_STRING_MANUFACTURER = 1,
> - FSG_STRING_PRODUCT,
> - FSG_STRING_SERIAL,
> - FSG_STRING_CONFIG,
> -#endif
> - FSG_STRING_INTERFACE
> -};
> -
> -#ifndef FSG_NO_OTG
> -static struct usb_otg_descriptor
> -fsg_otg_desc = {
> - .bLength = sizeof fsg_otg_desc,
> - .bDescriptorType = USB_DT_OTG,
> -
> - .bmAttributes = USB_OTG_SRP,
> -};
> -#endif
> +#include <f_mass_storage.h>
>
> /* There is only one interface. */
>
> diff --git a/include/f_mass_storage.h b/include/f_mass_storage.h
> new file mode 100644
> index 0000000..679f242
> --- /dev/null
> +++ b/include/f_mass_storage.h
> @@ -0,0 +1,393 @@
> +/*
> + * f_mass_storage.h -- Common definitions for mass storage
> functionality
> + *
> + * Copyright (C) 2003-2008 Alan Stern
> + * Copyeight (C) 2009 Samsung Electronics
> + * Author: Michal Nazarewicz (m.nazarewicz at samsung.com)
> + *
> + * Ported to u-boot:
> + * Andrzej Pietrasiewicz <andrzej.p at samsung.com>
> + *
> + * Code refactoring & cleanup:
> + * Łukasz Majewski <l.majewski at samsung.com>
> + * Eddie Cai <eddie.cai.linux at gmail.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#ifndef __F_MASS_STORAGE_H_
> +#define __F_MASS_STORAGE_H_
> +#include <usb_mass_storage.h>
> +
> +/*
> + * This file requires the following identifiers used in USB strings
> to
> + * be defined (each of type pointer to char):
> + * - fsg_string_manufacturer -- name of the manufacturer
> + * - fsg_string_product -- name of the product
> + * - fsg_string_serial -- product's serial
> + * - fsg_string_config -- name of the configuration
> + * - fsg_string_interface -- name of the interface
> + * The first four are only needed when FSG_DESCRIPTORS_DEVICE_STRINGS
> + * macro is defined prior to including this file.
> + */
> +
> +/*
> + * When FSG_NO_INTR_EP is defined fsg_fs_intr_in_desc and
> + * fsg_hs_intr_in_desc objects as well as
> + * FSG_FS_FUNCTION_PRE_EP_ENTRIES and FSG_HS_FUNCTION_PRE_EP_ENTRIES
> + * macros are not defined.
> + *
> + * When FSG_NO_DEVICE_STRINGS is defined FSG_STRING_MANUFACTURER,
> + * FSG_STRING_PRODUCT, FSG_STRING_SERIAL and FSG_STRING_CONFIG are
> not
> + * defined (as well as corresponding entries in string tables are
> + * missing) and FSG_STRING_INTERFACE has value of zero.
> + *
> + * When FSG_NO_OTG is defined fsg_otg_desc won't be defined.
> + */
> +
> +/*
> + * When FSG_BUFFHD_STATIC_BUFFER is defined when this file is
> included
> + * the fsg_buffhd structure's buf field will be an array of
> FSG_BUFLEN
> + * characters rather then a pointer to void.
> + */
> +
> +
> +/* #include <asm/unaligned.h> */
> +
> +
> +/*
> + * Thanks to NetChip Technologies for donating this product ID.
> + *
> + * DO NOT REUSE THESE IDs with any other driver!! Ever!!
> + * Instead: allocate your own, using normal USB-IF procedures.
> + */
> +#define FSG_VENDOR_ID 0x0525 /* NetChip */
> +#define FSG_PRODUCT_ID 0xa4a5 /* Linux-USB File-backed
> Storage Gadget */ +
> +/*-------------------------------------------------------------------------*/
> +
> +#ifndef DEBUG
> +#undef VERBOSE_DEBUG
> +#undef DUMP_MSGS
> +#endif /* !DEBUG */
> +
> +#ifdef VERBOSE_DEBUG
> +#define VLDBG LDBG
> +#else
> +#define VLDBG(lun, fmt, args...) do { } while (0)
> +#endif /* VERBOSE_DEBUG */
> +
> +/*
> +#define LDBG(lun, fmt, args...) dev_dbg (&(lun)->dev, fmt, ## args)
> +#define LERROR(lun, fmt, args...) dev_err (&(lun)->dev, fmt, ## args)
> +#define LWARN(lun, fmt, args...) dev_warn(&(lun)->dev, fmt, ## args)
> +#define LINFO(lun, fmt, args...) dev_info(&(lun)->dev, fmt, ## args)
> +*/
> +
> +#define LDBG(lun, fmt, args...) do { } while (0)
> +#define LERROR(lun, fmt, args...) do { } while (0)
> +#define LWARN(lun, fmt, args...) do { } while (0)
> +#define LINFO(lun, fmt, args...) do { } while (0)
> +
> +/*
> + * Keep those macros in sync with those in
> + * include/linux/usb/composite.h or else GCC will complain. If they
> + * are identical (the same names of arguments, white spaces in the
> + * same places) GCC will allow redefinition otherwise (even if some
> + * white space is removed or added) warning will be issued.
> + *
> + * Those macros are needed here because File Storage Gadget does not
> + * include the composite.h header. For composite gadgets those
> macros
> + * are redundant since composite.h is included any way.
> + *
> + * One could check whether those macros are already defined (which
> + * would indicate composite.h had been included) or not (which would
> + * indicate we were in FSG) but this is not done because a warning is
> + * desired if definitions here differ from the ones in composite.h.
> + *
> + * We want the definitions to match and be the same in File Storage
> + * Gadget as well as Mass Storage Function (and so composite gadgets
> + * using MSF). If someone changes them in composite.h it will
> produce
> + * a warning in this file when building MSF.
> + */
> +
> +#define DBG(d, fmt, args...) debug(fmt , ## args)
> +#define VDBG(d, fmt, args...) debug(fmt , ## args)
> +/* #define ERROR(d, fmt, args...) printf(fmt , ## args) */
> +/* #define WARNING(d, fmt, args...) printf(fmt , ## args) */
> +/* #define INFO(d, fmt, args...) printf(fmt , ## args) */
> +
> +/* #define DBG(d, fmt, args...) do { } while (0) */
> +/* #define VDBG(d, fmt, args...) do { } while (0) */
> +#define ERROR(d, fmt, args...) do { } while (0)
> +#define WARNING(d, fmt, args...) do { } while (0)
> +#define INFO(d, fmt, args...) do { } while (0)
> +
> +#ifdef DUMP_MSGS
> +
> +/* dump_msg(fsg, const char * label, const u8 * buf, unsigned
> length); */ +# define dump_msg(fsg, label, buf, length) do
> { \
> + if (length < 512)
> { \
> + DBG(fsg, "%s, length %u:\n", label,
> length); \
> + print_hex_dump(KERN_DEBUG, "",
> DUMP_PREFIX_OFFSET, \
> + 16, 1, buf, length,
> 0); \
> + }
> \ +} while (0)
> +
> +# define dump_cdb(fsg) do { } while (0)
> +
> +#else
> +
> +# define dump_msg(fsg, /* const char * */ label, \
> + /* const u8 * */ buf, /* unsigned */ length) do
> { } while (0) +
> +# ifdef VERBOSE_DEBUG
> +
> +# define
> dump_cdb(fsg) \
> + print_hex_dump(KERN_DEBUG, "SCSI CDB: ",
> DUMP_PREFIX_NONE, \
> + 16, 1, (fsg)->cmnd, (fsg)->cmnd_size,
> 0) \ +
> +# else
> +
> +# define dump_cdb(fsg) do { } while (0)
> +
> +# endif /* VERBOSE_DEBUG */
> +
> +#endif /* DUMP_MSGS */
> +
> +/*-------------------------------------------------------------------------*/
> +
> +/* SCSI device types */
> +#define TYPE_DISK 0x00
> +#define TYPE_CDROM 0x05
> +
> +/* USB protocol value = the transport method */
> +#define USB_PR_CBI 0x00 /*
> Control/Bulk/Interrupt */ +#define USB_PR_CB
> 0x01 /* Control/Bulk w/o interrupt */ +#define
> USB_PR_BULK 0x50 /* Bulk-only */ +
> +/* USB subclass value = the protocol encapsulation */
> +#define USB_SC_RBC 0x01 /* Reduced Block
> Commands (flash) */ +#define USB_SC_8020
> 0x02 /* SFF-8020i, MMC-2, ATAPI (CD-ROM) */ +#define
> USB_SC_QIC 0x03 /* QIC-157 (tape) */ +#define
> USB_SC_UFI 0x04 /* UFI (floppy) */ +#define
> USB_SC_8070 0x05 /* SFF-8070i (removable) */
> +#define USB_SC_SCSI 0x06 /* Transparent SCSI
> */ + +/* Bulk-only data structures */
> +
> +/* Command Block Wrapper */
> +struct fsg_bulk_cb_wrap {
> + __le32 Signature; /* Contains 'USBC' */
> + u32 Tag; /* Unique per command
> id */
> + __le32 DataTransferLength; /* Size of the data
> */
> + u8 Flags; /* Direction in bit
> 7 */
> + u8 Lun; /* LUN (normally 0) */
> + u8 Length; /* Of the CDB, <=
> MAX_COMMAND_SIZE */
> + u8 CDB[16]; /* Command Data Block */
> +};
> +
> +#define USB_BULK_CB_WRAP_LEN 31
> +#define USB_BULK_CB_SIG 0x43425355 /* Spells
> out USBC */ +#define USB_BULK_IN_FLAG 0x80
> +
> +/* Command Status Wrapper */
> +struct bulk_cs_wrap {
> + __le32 Signature; /* Should = 'USBS' */
> + u32 Tag; /* Same as original
> command */
> + __le32 Residue; /* Amount not
> transferred */
> + u8 Status; /* See below */
> +};
> +
> +#define USB_BULK_CS_WRAP_LEN 13
> +#define USB_BULK_CS_SIG 0x53425355 /* Spells
> out 'USBS' */ +#define USB_STATUS_PASS 0
> +#define USB_STATUS_FAIL 1
> +#define USB_STATUS_PHASE_ERROR 2
> +
> +/* Bulk-only class specific requests */
> +#define USB_BULK_RESET_REQUEST 0xff
> +#define USB_BULK_GET_MAX_LUN_REQUEST 0xfe
> +
> +/* CBI Interrupt data structure */
> +struct interrupt_data {
> + u8 bType;
> + u8 bValue;
> +};
> +
> +#define CBI_INTERRUPT_DATA_LEN 2
> +
> +/* CBI Accept Device-Specific Command request */
> +#define USB_CBI_ADSC_REQUEST 0x00
> +
> +/* Length of a SCSI Command Data Block */
> +#define MAX_COMMAND_SIZE 16
> +
> +/* SCSI commands that we recognize */
> +#define SC_FORMAT_UNIT 0x04
> +#define SC_INQUIRY 0x12
> +#define SC_MODE_SELECT_6 0x15
> +#define SC_MODE_SELECT_10 0x55
> +#define SC_MODE_SENSE_6 0x1a
> +#define SC_MODE_SENSE_10 0x5a
> +#define SC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
> +#define SC_READ_6 0x08
> +#define SC_READ_10 0x28
> +#define SC_READ_12 0xa8
> +#define SC_READ_CAPACITY 0x25
> +#define SC_READ_FORMAT_CAPACITIES 0x23
> +#define SC_READ_HEADER 0x44
> +#define SC_READ_TOC 0x43
> +#define SC_RELEASE 0x17
> +#define SC_REQUEST_SENSE 0x03
> +#define SC_RESERVE 0x16
> +#define SC_SEND_DIAGNOSTIC 0x1d
> +#define SC_START_STOP_UNIT 0x1b
> +#define SC_SYNCHRONIZE_CACHE 0x35
> +#define SC_TEST_UNIT_READY 0x00
> +#define SC_VERIFY 0x2f
> +#define SC_WRITE_6 0x0a
> +#define SC_WRITE_10 0x2a
> +#define SC_WRITE_12 0xaa
> +
> +/* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */
> +#define SS_NO_SENSE 0
> +#define SS_COMMUNICATION_FAILURE 0x040800
> +#define SS_INVALID_COMMAND 0x052000
> +#define SS_INVALID_FIELD_IN_CDB 0x052400
> +#define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x052100
> +#define SS_LOGICAL_UNIT_NOT_SUPPORTED 0x052500
> +#define SS_MEDIUM_NOT_PRESENT 0x023a00
> +#define SS_MEDIUM_REMOVAL_PREVENTED 0x055302
> +#define SS_NOT_READY_TO_READY_TRANSITION 0x062800
> +#define SS_RESET_OCCURRED 0x062900
> +#define SS_SAVING_PARAMETERS_NOT_SUPPORTED 0x053900
> +#define SS_UNRECOVERED_READ_ERROR 0x031100
> +#define SS_WRITE_ERROR 0x030c02
> +#define SS_WRITE_PROTECTED 0x072700
> +
> +#define SK(x) ((u8) ((x) >> 16)) /* Sense Key
> byte, etc. */ +#define ASC(x) ((u8) ((x) >> 8))
> +#define ASCQ(x) ((u8) (x))
> +
> +struct device_attribute { int i; };
> +#define ETOOSMALL 525
> +
> +
> +/*-------------------------------------------------------------------------*/
> +
> +struct fsg_lun {
> + loff_t file_length;
> + loff_t num_sectors;
> +
> + unsigned int initially_ro:1;
> + unsigned int ro:1;
> + unsigned int removable:1;
> + unsigned int cdrom:1;
> + unsigned int prevent_medium_removal:1;
> + unsigned int registered:1;
> + unsigned int info_valid:1;
> + unsigned int nofua:1;
> +
> + u32 sense_data;
> + u32 sense_data_info;
> + u32 unit_attention_data;
> +
> + struct device dev;
> +};
> +
> +#define fsg_lun_is_open(curlun) ((curlun)->filp != NULL)
> +/* Big enough to hold our biggest descriptor */
> +#define EP0_BUFSIZE 256
> +#define DELAYED_STATUS (EP0_BUFSIZE + 999) /* An
> impossibly large value */ +
> +/* Number of buffers we will use. 2 is enough for double-buffering
> */ +#define FSG_NUM_BUFFERS 2
> +
> +/* Default size of buffer length. */
> +#define FSG_BUFLEN ((u32)16384)
> +
> +/* Maximal number of LUNs supported in mass storage function */
> +#define FSG_MAX_LUNS 8
> +
> +enum fsg_buffer_state {
> + BUF_STATE_EMPTY = 0,
> + BUF_STATE_FULL,
> + BUF_STATE_BUSY
> +};
> +
> +struct fsg_buffhd {
> +#ifdef FSG_BUFFHD_STATIC_BUFFER
> + char buf[FSG_BUFLEN];
> +#else
> + void *buf;
> +#endif
> + enum fsg_buffer_state state;
> + struct fsg_buffhd *next;
> +
> + /*
> + * The NetChip 2280 is faster, and handles some protocol
> faults
> + * better, if we don't submit any short bulk-out read
> requests.
> + * So we will record the intended request length here.
> + */
> + unsigned int bulk_out_intended_length;
> +
> + struct usb_request *inreq;
> + int inreq_busy;
> + struct usb_request *outreq;
> + int outreq_busy;
> +};
> +
> +enum fsg_state {
> + /* This one isn't used anywhere */
> + FSG_STATE_COMMAND_PHASE = -10,
> + FSG_STATE_DATA_PHASE,
> + FSG_STATE_STATUS_PHASE,
> +
> + FSG_STATE_IDLE = 0,
> + FSG_STATE_ABORT_BULK_OUT,
> + FSG_STATE_RESET,
> + FSG_STATE_INTERFACE_CHANGE,
> + FSG_STATE_CONFIG_CHANGE,
> + FSG_STATE_DISCONNECT,
> + FSG_STATE_EXIT,
> + FSG_STATE_TERMINATED
> +};
> +
> +enum data_direction {
> + DATA_DIR_UNKNOWN = 0,
> + DATA_DIR_FROM_HOST,
> + DATA_DIR_TO_HOST,
> + DATA_DIR_NONE
> +};
> +
> +/*-------------------------------------------------------------------------*/
> +
> +static inline u32 get_unaligned_be24(u8 *buf)
> +{
> + return 0xffffff & (u32) get_unaligned_be32(buf - 1);
> +}
> +
> +/*-------------------------------------------------------------------------*/
> +
> +enum {
> +#ifndef FSG_NO_DEVICE_STRINGS
> + FSG_STRING_MANUFACTURER = 1,
> + FSG_STRING_PRODUCT,
> + FSG_STRING_SERIAL,
> + FSG_STRING_CONFIG,
> +#endif
> + FSG_STRING_INTERFACE
> +};
> +
> +#ifndef FSG_NO_OTG
> +static struct usb_otg_descriptor
> +fsg_otg_desc = {
> + .bLength = sizeof(fsg_otg_desc),
> + .bDescriptorType = USB_DT_OTG,
> +
> + .bmAttributes = USB_OTG_SRP,
> +};
> +#endif
> +
> +#endif /* __F_MASS_STORAGE_H_ */
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
More information about the U-Boot
mailing list