linux/drivers/usb/storage/usb.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Driver for USB Mass Storage compliant devices
   4 * Main Header File
   5 *
   6 * Current development and maintenance by:
   7 *   (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
   8 *
   9 * Initial work by:
  10 *   (c) 1999 Michael Gee (michael@linuxspecific.com)
  11 *
  12 * This driver is based on the 'USB Mass Storage Class' document. This
  13 * describes in detail the protocol used to communicate with such
  14 * devices.  Clearly, the designers had SCSI and ATAPI commands in
  15 * mind when they created this document.  The commands are all very
  16 * similar to commands in the SCSI-II and ATAPI specifications.
  17 *
  18 * It is important to note that in a number of cases this class
  19 * exhibits class-specific exemptions from the USB specification.
  20 * Notably the usage of NAK, STALL and ACK differs from the norm, in
  21 * that they are used to communicate wait, failed and OK on commands.
  22 *
  23 * Also, for certain devices, the interrupt endpoint is used to convey
  24 * status of a command.
  25 */
  26
  27#ifndef _USB_H_
  28#define _USB_H_
  29
  30#include <linux/usb.h>
  31#include <linux/usb_usual.h>
  32#include <linux/blkdev.h>
  33#include <linux/completion.h>
  34#include <linux/mutex.h>
  35#include <linux/workqueue.h>
  36#include <scsi/scsi_host.h>
  37
  38struct us_data;
  39struct scsi_cmnd;
  40
  41/*
  42 * Unusual device list definitions 
  43 */
  44
  45struct us_unusual_dev {
  46        const char* vendorName;
  47        const char* productName;
  48        __u8  useProtocol;
  49        __u8  useTransport;
  50        int (*initFunction)(struct us_data *);
  51};
  52
  53
  54/* Dynamic bitflag definitions (us->dflags): used in set_bit() etc. */
  55#define US_FLIDX_URB_ACTIVE     0       /* current_urb is in use    */
  56#define US_FLIDX_SG_ACTIVE      1       /* current_sg is in use     */
  57#define US_FLIDX_ABORTING       2       /* abort is in progress     */
  58#define US_FLIDX_DISCONNECTING  3       /* disconnect in progress   */
  59#define US_FLIDX_RESETTING      4       /* device reset in progress */
  60#define US_FLIDX_TIMED_OUT      5       /* SCSI midlayer timed out  */
  61#define US_FLIDX_SCAN_PENDING   6       /* scanning not yet done    */
  62#define US_FLIDX_REDO_READ10    7       /* redo READ(10) command    */
  63#define US_FLIDX_READ10_WORKED  8       /* previous READ(10) succeeded */
  64
  65#define USB_STOR_STRING_LEN 32
  66
  67/*
  68 * We provide a DMA-mapped I/O buffer for use with small USB transfers.
  69 * It turns out that CB[I] needs a 12-byte buffer and Bulk-only needs a
  70 * 31-byte buffer.  But Freecom needs a 64-byte buffer, so that's the
  71 * size we'll allocate.
  72 */
  73
  74#define US_IOBUF_SIZE           64      /* Size of the DMA-mapped I/O buffer */
  75#define US_SENSE_SIZE           18      /* Size of the autosense data buffer */
  76
  77typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data*);
  78typedef int (*trans_reset)(struct us_data*);
  79typedef void (*proto_cmnd)(struct scsi_cmnd*, struct us_data*);
  80typedef void (*extra_data_destructor)(void *);  /* extra data destructor */
  81typedef void (*pm_hook)(struct us_data *, int); /* power management hook */
  82
  83#define US_SUSPEND      0
  84#define US_RESUME       1
  85
  86/* we allocate one of these for every device that we remember */
  87struct us_data {
  88        /*
  89         * The device we're working with
  90         * It's important to note:
  91         *    (o) you must hold dev_mutex to change pusb_dev
  92         */
  93        struct mutex            dev_mutex;       /* protect pusb_dev */
  94        struct usb_device       *pusb_dev;       /* this usb_device */
  95        struct usb_interface    *pusb_intf;      /* this interface */
  96        const struct us_unusual_dev   *unusual_dev;
  97                                                /* device-filter entry     */
  98        unsigned long           fflags;          /* fixed flags from filter */
  99        unsigned long           dflags;          /* dynamic atomic bitflags */
 100        unsigned int            send_bulk_pipe;  /* cached pipe values */
 101        unsigned int            recv_bulk_pipe;
 102        unsigned int            send_ctrl_pipe;
 103        unsigned int            recv_ctrl_pipe;
 104        unsigned int            recv_intr_pipe;
 105
 106        /* information about the device */
 107        char                    *transport_name;
 108        char                    *protocol_name;
 109        __le32                  bcs_signature;
 110        u8                      subclass;
 111        u8                      protocol;
 112        u8                      max_lun;
 113
 114        u8                      ifnum;           /* interface number   */
 115        u8                      ep_bInterval;    /* interrupt interval */
 116
 117        /* function pointers for this device */
 118        trans_cmnd              transport;       /* transport function     */
 119        trans_reset             transport_reset; /* transport device reset */
 120        proto_cmnd              proto_handler;   /* protocol handler       */
 121
 122        /* SCSI interfaces */
 123        struct scsi_cmnd        *srb;            /* current srb         */
 124        unsigned int            tag;             /* current dCBWTag     */
 125        char                    scsi_name[32];   /* scsi_host name      */
 126
 127        /* control and bulk communications data */
 128        struct urb              *current_urb;    /* USB requests         */
 129        struct usb_ctrlrequest  *cr;             /* control requests     */
 130        struct usb_sg_request   current_sg;      /* scatter-gather req.  */
 131        unsigned char           *iobuf;          /* I/O buffer           */
 132        dma_addr_t              iobuf_dma;       /* buffer DMA addresses */
 133        struct task_struct      *ctl_thread;     /* the control thread   */
 134
 135        /* mutual exclusion and synchronization structures */
 136        struct completion       cmnd_ready;      /* to sleep thread on      */
 137        struct completion       notify;          /* thread begin/end        */
 138        wait_queue_head_t       delay_wait;      /* wait during reset       */
 139        struct delayed_work     scan_dwork;      /* for async scanning      */
 140
 141        /* subdriver information */
 142        void                    *extra;          /* Any extra data          */
 143        extra_data_destructor   extra_destructor;/* extra data destructor   */
 144#ifdef CONFIG_PM
 145        pm_hook                 suspend_resume_hook;
 146#endif
 147
 148        /* hacks for READ CAPACITY bug handling */
 149        int                     use_last_sector_hacks;
 150        int                     last_sector_retries;
 151};
 152
 153/* Convert between us_data and the corresponding Scsi_Host */
 154static inline struct Scsi_Host *us_to_host(struct us_data *us) {
 155        return container_of((void *) us, struct Scsi_Host, hostdata);
 156}
 157static inline struct us_data *host_to_us(struct Scsi_Host *host) {
 158        return (struct us_data *) host->hostdata;
 159}
 160
 161/* Function to fill an inquiry response. See usb.c for details */
 162extern void fill_inquiry_response(struct us_data *us,
 163        unsigned char *data, unsigned int data_len);
 164
 165/*
 166 * The scsi_lock() and scsi_unlock() macros protect the sm_state and the
 167 * single queue element srb for write access
 168 */
 169#define scsi_unlock(host)       spin_unlock_irq(host->host_lock)
 170#define scsi_lock(host)         spin_lock_irq(host->host_lock)
 171
 172/* General routines provided by the usb-storage standard core */
 173#ifdef CONFIG_PM
 174extern int usb_stor_suspend(struct usb_interface *iface, pm_message_t message);
 175extern int usb_stor_resume(struct usb_interface *iface);
 176extern int usb_stor_reset_resume(struct usb_interface *iface);
 177#else
 178#define usb_stor_suspend        NULL
 179#define usb_stor_resume         NULL
 180#define usb_stor_reset_resume   NULL
 181#endif
 182
 183extern int usb_stor_pre_reset(struct usb_interface *iface);
 184extern int usb_stor_post_reset(struct usb_interface *iface);
 185
 186extern int usb_stor_probe1(struct us_data **pus,
 187                struct usb_interface *intf,
 188                const struct usb_device_id *id,
 189                const struct us_unusual_dev *unusual_dev,
 190                struct scsi_host_template *sht);
 191extern int usb_stor_probe2(struct us_data *us);
 192extern void usb_stor_disconnect(struct usb_interface *intf);
 193
 194extern void usb_stor_adjust_quirks(struct usb_device *dev,
 195                unsigned long *fflags);
 196
 197#define module_usb_stor_driver(__driver, __sht, __name) \
 198static int __init __driver##_init(void) \
 199{ \
 200        usb_stor_host_template_init(&(__sht), __name, THIS_MODULE); \
 201        return usb_register(&(__driver)); \
 202} \
 203module_init(__driver##_init); \
 204static void __exit __driver##_exit(void) \
 205{ \
 206        usb_deregister(&(__driver)); \
 207} \
 208module_exit(__driver##_exit)
 209
 210#endif
 211