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.li...@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.nazarew...@samsung.com)
> + *
> + * Ported to u-boot:
> + * Andrzej Pietrasiewicz <andrze...@samsung.com>
> + *
> + * Code refactoring & cleanup:
> + * Łukasz Majewski <l.majew...@samsung.com>
> + * Eddie Cai <eddie.cai.li...@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: w...@denx.de
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to