| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* Driver for USB Mass Storage compliant devices | 
|  | 2 | * Main Header File | 
|  | 3 | * | 
|  | 4 | * $Id: usb.h,v 1.21 2002/04/21 02:57:59 mdharm Exp $ | 
|  | 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 | * Please see http://www.one-eyed-alien.net/~mdharm/linux-usb for more | 
|  | 27 | * information about this driver. | 
|  | 28 | * | 
|  | 29 | * This program is free software; you can redistribute it and/or modify it | 
|  | 30 | * under the terms of the GNU General Public License as published by the | 
|  | 31 | * Free Software Foundation; either version 2, or (at your option) any | 
|  | 32 | * later version. | 
|  | 33 | * | 
|  | 34 | * This program is distributed in the hope that it will be useful, but | 
|  | 35 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 36 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | 37 | * General Public License for more details. | 
|  | 38 | * | 
|  | 39 | * You should have received a copy of the GNU General Public License along | 
|  | 40 | * with this program; if not, write to the Free Software Foundation, Inc., | 
|  | 41 | * 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  | 42 | */ | 
|  | 43 |  | 
|  | 44 | #ifndef _USB_H_ | 
|  | 45 | #define _USB_H_ | 
|  | 46 |  | 
|  | 47 | #include <linux/usb.h> | 
| Pete Zaitcev | a00828e | 2005-10-22 20:15:09 -0700 | [diff] [blame] | 48 | #include <linux/usb_usual.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 49 | #include <linux/blkdev.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 50 | #include <linux/completion.h> | 
| Arjan van de Ven | 4186ecf | 2006-01-11 15:55:29 +0100 | [diff] [blame] | 51 | #include <linux/mutex.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 52 | #include <scsi/scsi_host.h> | 
|  | 53 |  | 
|  | 54 | struct us_data; | 
|  | 55 | struct scsi_cmnd; | 
|  | 56 |  | 
|  | 57 | /* | 
|  | 58 | * Unusual device list definitions | 
|  | 59 | */ | 
|  | 60 |  | 
|  | 61 | struct us_unusual_dev { | 
|  | 62 | const char* vendorName; | 
|  | 63 | const char* productName; | 
|  | 64 | __u8  useProtocol; | 
|  | 65 | __u8  useTransport; | 
|  | 66 | int (*initFunction)(struct us_data *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 67 | }; | 
|  | 68 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 |  | 
|  | 70 | /* Dynamic flag definitions: used in set_bit() etc. */ | 
|  | 71 | #define US_FLIDX_URB_ACTIVE	18  /* 0x00040000  current_urb is in use  */ | 
|  | 72 | #define US_FLIDX_SG_ACTIVE	19  /* 0x00080000  current_sg is in use   */ | 
|  | 73 | #define US_FLIDX_ABORTING	20  /* 0x00100000  abort is in progress   */ | 
|  | 74 | #define US_FLIDX_DISCONNECTING	21  /* 0x00200000  disconnect in progress */ | 
|  | 75 | #define ABORTING_OR_DISCONNECTING	((1UL << US_FLIDX_ABORTING) | \ | 
|  | 76 | (1UL << US_FLIDX_DISCONNECTING)) | 
|  | 77 | #define US_FLIDX_RESETTING	22  /* 0x00400000  device reset in progress */ | 
|  | 78 | #define US_FLIDX_TIMED_OUT	23  /* 0x00800000  SCSI midlayer timed out  */ | 
|  | 79 |  | 
|  | 80 |  | 
|  | 81 | #define USB_STOR_STRING_LEN 32 | 
|  | 82 |  | 
|  | 83 | /* | 
|  | 84 | * We provide a DMA-mapped I/O buffer for use with small USB transfers. | 
|  | 85 | * It turns out that CB[I] needs a 12-byte buffer and Bulk-only needs a | 
|  | 86 | * 31-byte buffer.  But Freecom needs a 64-byte buffer, so that's the | 
|  | 87 | * size we'll allocate. | 
|  | 88 | */ | 
|  | 89 |  | 
|  | 90 | #define US_IOBUF_SIZE		64	/* Size of the DMA-mapped I/O buffer */ | 
| Alan Stern | bbafa46 | 2005-10-23 19:40:22 -0700 | [diff] [blame] | 91 | #define US_SENSE_SIZE		18	/* Size of the autosense data buffer */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 92 |  | 
|  | 93 | typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data*); | 
|  | 94 | typedef int (*trans_reset)(struct us_data*); | 
|  | 95 | typedef void (*proto_cmnd)(struct scsi_cmnd*, struct us_data*); | 
| Matthew Dharm | 7931e1c | 2005-12-04 21:56:51 -0800 | [diff] [blame] | 96 | typedef void (*extra_data_destructor)(void *);	/* extra data destructor */ | 
|  | 97 | typedef void (*pm_hook)(struct us_data *, int);	/* power management hook */ | 
|  | 98 |  | 
|  | 99 | #define US_SUSPEND	0 | 
|  | 100 | #define US_RESUME	1 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 101 |  | 
|  | 102 | /* we allocate one of these for every device that we remember */ | 
|  | 103 | struct us_data { | 
|  | 104 | /* The device we're working with | 
|  | 105 | * It's important to note: | 
| Arjan van de Ven | 4186ecf | 2006-01-11 15:55:29 +0100 | [diff] [blame] | 106 | *    (o) you must hold dev_mutex to change pusb_dev | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 107 | */ | 
| Arjan van de Ven | 4186ecf | 2006-01-11 15:55:29 +0100 | [diff] [blame] | 108 | struct mutex		dev_mutex;	 /* protect pusb_dev */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 109 | struct usb_device	*pusb_dev;	 /* this usb_device */ | 
|  | 110 | struct usb_interface	*pusb_intf;	 /* this interface */ | 
|  | 111 | struct us_unusual_dev   *unusual_dev;	 /* device-filter entry     */ | 
|  | 112 | unsigned long		flags;		 /* from filter initially */ | 
|  | 113 | unsigned int		send_bulk_pipe;	 /* cached pipe values */ | 
|  | 114 | unsigned int		recv_bulk_pipe; | 
|  | 115 | unsigned int		send_ctrl_pipe; | 
|  | 116 | unsigned int		recv_ctrl_pipe; | 
|  | 117 | unsigned int		recv_intr_pipe; | 
|  | 118 |  | 
|  | 119 | /* information about the device */ | 
|  | 120 | char			*transport_name; | 
|  | 121 | char			*protocol_name; | 
|  | 122 | __le32			bcs_signature; | 
|  | 123 | u8			subclass; | 
|  | 124 | u8			protocol; | 
|  | 125 | u8			max_lun; | 
|  | 126 |  | 
|  | 127 | u8			ifnum;		 /* interface number   */ | 
|  | 128 | u8			ep_bInterval;	 /* interrupt interval */ | 
|  | 129 |  | 
|  | 130 | /* function pointers for this device */ | 
|  | 131 | trans_cmnd		transport;	 /* transport function	   */ | 
|  | 132 | trans_reset		transport_reset; /* transport device reset */ | 
|  | 133 | proto_cmnd		proto_handler;	 /* protocol handler	   */ | 
|  | 134 |  | 
|  | 135 | /* SCSI interfaces */ | 
|  | 136 | struct scsi_cmnd	*srb;		 /* current srb		*/ | 
| Matthew Dharm | 0f64e07 | 2005-07-28 14:43:08 -0700 | [diff] [blame] | 137 | unsigned int		tag;		 /* current dCBWTag	*/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 138 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 139 | /* control and bulk communications data */ | 
|  | 140 | struct urb		*current_urb;	 /* USB requests	 */ | 
|  | 141 | struct usb_ctrlrequest	*cr;		 /* control requests	 */ | 
|  | 142 | struct usb_sg_request	current_sg;	 /* scatter-gather req.  */ | 
|  | 143 | unsigned char		*iobuf;		 /* I/O buffer		 */ | 
| Alan Stern | bbafa46 | 2005-10-23 19:40:22 -0700 | [diff] [blame] | 144 | unsigned char		*sensebuf;	 /* sense data buffer	 */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 145 | dma_addr_t		cr_dma;		 /* buffer DMA addresses */ | 
|  | 146 | dma_addr_t		iobuf_dma; | 
| Alan Stern | ed76cac | 2007-06-07 17:12:25 -0400 | [diff] [blame] | 147 | struct task_struct	*ctl_thread;	 /* the control thread   */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 148 |  | 
|  | 149 | /* mutual exclusion and synchronization structures */ | 
|  | 150 | struct semaphore	sema;		 /* to sleep thread on	    */ | 
|  | 151 | struct completion	notify;		 /* thread begin/end	    */ | 
|  | 152 | wait_queue_head_t	delay_wait;	 /* wait during scan, reset */ | 
| Alan Stern | 2f67cd5 | 2007-08-16 16:16:00 -0400 | [diff] [blame] | 153 | struct completion	scanning_done;	 /* wait for scan thread    */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 154 |  | 
|  | 155 | /* subdriver information */ | 
|  | 156 | void			*extra;		 /* Any extra data          */ | 
|  | 157 | extra_data_destructor	extra_destructor;/* extra data destructor   */ | 
| Matthew Dharm | 7931e1c | 2005-12-04 21:56:51 -0800 | [diff] [blame] | 158 | #ifdef CONFIG_PM | 
|  | 159 | pm_hook			suspend_resume_hook; | 
|  | 160 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 161 | }; | 
|  | 162 |  | 
|  | 163 | /* Convert between us_data and the corresponding Scsi_Host */ | 
| Jesper Juhl | f274afc | 2006-06-26 19:01:01 +0200 | [diff] [blame] | 164 | static inline struct Scsi_Host *us_to_host(struct us_data *us) { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 165 | return container_of((void *) us, struct Scsi_Host, hostdata); | 
|  | 166 | } | 
| Jesper Juhl | f274afc | 2006-06-26 19:01:01 +0200 | [diff] [blame] | 167 | static inline struct us_data *host_to_us(struct Scsi_Host *host) { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 168 | return (struct us_data *) host->hostdata; | 
|  | 169 | } | 
|  | 170 |  | 
|  | 171 | /* Function to fill an inquiry response. See usb.c for details */ | 
|  | 172 | extern void fill_inquiry_response(struct us_data *us, | 
|  | 173 | unsigned char *data, unsigned int data_len); | 
|  | 174 |  | 
|  | 175 | /* The scsi_lock() and scsi_unlock() macros protect the sm_state and the | 
|  | 176 | * single queue element srb for write access */ | 
|  | 177 | #define scsi_unlock(host)	spin_unlock_irq(host->host_lock) | 
|  | 178 | #define scsi_lock(host)		spin_lock_irq(host->host_lock) | 
|  | 179 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 180 | #endif |