Message ID | 20170416155414.14746-2-eddie.cai.linux@gmail.com |
---|---|
State | Superseded |
Delegated to: | Marek Vasut |
Headers | show |
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, > 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@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, > 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@denx.de
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@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, 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_ */
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