Branch data Line data Source code
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 : : 38 : : struct us_data; 39 : : struct scsi_cmnd; 40 : : 41 : : /* 42 : : * Unusual device list definitions 43 : : */ 44 : : 45 : : struct 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 : : 77 : : typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data*); 78 : : typedef int (*trans_reset)(struct us_data*); 79 : : typedef void (*proto_cmnd)(struct scsi_cmnd*, struct us_data*); 80 : : typedef void (*extra_data_destructor)(void *); /* extra data destructor */ 81 : : typedef 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 */ 87 : : struct 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 : : struct us_unusual_dev *unusual_dev; /* device-filter entry */ 97 : : unsigned long fflags; /* fixed flags from filter */ 98 : : unsigned long dflags; /* dynamic atomic bitflags */ 99 : : unsigned int send_bulk_pipe; /* cached pipe values */ 100 : : unsigned int recv_bulk_pipe; 101 : : unsigned int send_ctrl_pipe; 102 : : unsigned int recv_ctrl_pipe; 103 : : unsigned int recv_intr_pipe; 104 : : 105 : : /* information about the device */ 106 : : char *transport_name; 107 : : char *protocol_name; 108 : : __le32 bcs_signature; 109 : : u8 subclass; 110 : : u8 protocol; 111 : : u8 max_lun; 112 : : 113 : : u8 ifnum; /* interface number */ 114 : : u8 ep_bInterval; /* interrupt interval */ 115 : : 116 : : /* function pointers for this device */ 117 : : trans_cmnd transport; /* transport function */ 118 : : trans_reset transport_reset; /* transport device reset */ 119 : : proto_cmnd proto_handler; /* protocol handler */ 120 : : 121 : : /* SCSI interfaces */ 122 : : struct scsi_cmnd *srb; /* current srb */ 123 : : unsigned int tag; /* current dCBWTag */ 124 : : char scsi_name[32]; /* scsi_host name */ 125 : : 126 : : /* control and bulk communications data */ 127 : : struct urb *current_urb; /* USB requests */ 128 : : struct usb_ctrlrequest *cr; /* control requests */ 129 : : struct usb_sg_request current_sg; /* scatter-gather req. */ 130 : : unsigned char *iobuf; /* I/O buffer */ 131 : : dma_addr_t iobuf_dma; /* buffer DMA addresses */ 132 : : struct task_struct *ctl_thread; /* the control thread */ 133 : : 134 : : /* mutual exclusion and synchronization structures */ 135 : : struct completion cmnd_ready; /* to sleep thread on */ 136 : : struct completion notify; /* thread begin/end */ 137 : : wait_queue_head_t delay_wait; /* wait during reset */ 138 : : struct delayed_work scan_dwork; /* for async scanning */ 139 : : 140 : : /* subdriver information */ 141 : : void *extra; /* Any extra data */ 142 : : extra_data_destructor extra_destructor;/* extra data destructor */ 143 : : #ifdef CONFIG_PM 144 : : pm_hook suspend_resume_hook; 145 : : #endif 146 : : 147 : : /* hacks for READ CAPACITY bug handling */ 148 : : int use_last_sector_hacks; 149 : : int last_sector_retries; 150 : : }; 151 : : 152 : : /* Convert between us_data and the corresponding Scsi_Host */ 153 : 0 : static inline struct Scsi_Host *us_to_host(struct us_data *us) { 154 [ # # # # ]: 0 : return container_of((void *) us, struct Scsi_Host, hostdata); 155 : : } 156 : 0 : static inline struct us_data *host_to_us(struct Scsi_Host *host) { 157 [ # # # # : 0 : return (struct us_data *) host->hostdata; # # ] 158 : : } 159 : : 160 : : /* Function to fill an inquiry response. See usb.c for details */ 161 : : extern void fill_inquiry_response(struct us_data *us, 162 : : unsigned char *data, unsigned int data_len); 163 : : 164 : : /* 165 : : * The scsi_lock() and scsi_unlock() macros protect the sm_state and the 166 : : * single queue element srb for write access 167 : : */ 168 : : #define scsi_unlock(host) spin_unlock_irq(host->host_lock) 169 : : #define scsi_lock(host) spin_lock_irq(host->host_lock) 170 : : 171 : : /* General routines provided by the usb-storage standard core */ 172 : : #ifdef CONFIG_PM 173 : : extern int usb_stor_suspend(struct usb_interface *iface, pm_message_t message); 174 : : extern int usb_stor_resume(struct usb_interface *iface); 175 : : extern int usb_stor_reset_resume(struct usb_interface *iface); 176 : : #else 177 : : #define usb_stor_suspend NULL 178 : : #define usb_stor_resume NULL 179 : : #define usb_stor_reset_resume NULL 180 : : #endif 181 : : 182 : : extern int usb_stor_pre_reset(struct usb_interface *iface); 183 : : extern int usb_stor_post_reset(struct usb_interface *iface); 184 : : 185 : : extern int usb_stor_probe1(struct us_data **pus, 186 : : struct usb_interface *intf, 187 : : const struct usb_device_id *id, 188 : : struct us_unusual_dev *unusual_dev, 189 : : struct scsi_host_template *sht); 190 : : extern int usb_stor_probe2(struct us_data *us); 191 : : extern void usb_stor_disconnect(struct usb_interface *intf); 192 : : 193 : : extern void usb_stor_adjust_quirks(struct usb_device *dev, 194 : : unsigned long *fflags); 195 : : 196 : : #define module_usb_stor_driver(__driver, __sht, __name) \ 197 : : static int __init __driver##_init(void) \ 198 : : { \ 199 : : usb_stor_host_template_init(&(__sht), __name, THIS_MODULE); \ 200 : : return usb_register(&(__driver)); \ 201 : : } \ 202 : : module_init(__driver##_init); \ 203 : : static void __exit __driver##_exit(void) \ 204 : : { \ 205 : : usb_deregister(&(__driver)); \ 206 : : } \ 207 : : module_exit(__driver##_exit) 208 : : 209 : : #endif