[U-Boot] [U-Boot PATCH V2 1/9] usb: ums: split macro and data struct in storage_common.c

Lukasz Majewski lukma at denx.de
Wed Apr 19 15:19:30 UTC 2017


Hi Eddie,

Sorry for late reply - the Easter break.


I would prefer to keep things as they are now.

The reason is that f_mass_storage gadget in Linux has the same file
structure as u-boot -
e.g. ./drivers/usb/gadget/function/storage_common.c in Linux tree.

It would be easier then to update the u-boot to Linux code if needed
(or ported to DM).

Best regards,
Łukasz Majewski

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




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de


More information about the U-Boot mailing list