
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@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,
\ -
-# 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@samsung.com)
- Ported to u-boot:
- Andrzej Pietrasiewicz andrzej.p@samsung.com
- Code refactoring & cleanup:
- Łukasz Majewski l.majewski@samsung.com
- Eddie Cai eddie.cai.linux@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,
\ +
+# 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@denx.de