Commit | Line | Data |
---|---|---|
1557a640 | 1 | /* Driver for USB Mass Storage compliant devices */ |
126bb03b AC |
2 | |
3 | #ifndef _USB_H_ | |
4 | #define _USB_H_ | |
5 | ||
6 | #include <linux/usb.h> | |
7 | #include <linux/usb_usual.h> | |
8 | #include <linux/blkdev.h> | |
9 | #include <linux/completion.h> | |
10 | #include <linux/mutex.h> | |
11 | #include <scsi/scsi_host.h> | |
12 | #include "common.h" | |
126bb03b AC |
13 | |
14 | struct us_data; | |
15 | struct scsi_cmnd; | |
16 | ||
17 | /* | |
18 | * Unusual device list definitions | |
19 | */ | |
20 | ||
21 | struct us_unusual_dev { | |
0ea8a165 JS |
22 | const char *vendorName; |
23 | const char *productName; | |
126bb03b AC |
24 | __u8 useProtocol; |
25 | __u8 useTransport; | |
26 | int (*initFunction)(struct us_data *); | |
27 | }; | |
28 | ||
1557a640 | 29 | /* EnE HW Register */ |
126bb03b AC |
30 | #define REG_CARD_STATUS 0xFF83 |
31 | #define REG_HW_TRAP1 0xFF89 | |
32 | ||
1557a640 AG |
33 | /* SRB Status. Refers /usr/include/wine/wine/wnaspi32.h & SCSI sense key */ |
34 | #define SS_SUCCESS 0x00 /* No Sense */ | |
126bb03b AC |
35 | #define SS_NOT_READY 0x02 |
36 | #define SS_MEDIUM_ERR 0x03 | |
37 | #define SS_HW_ERR 0x04 | |
38 | #define SS_ILLEGAL_REQUEST 0x05 | |
39 | #define SS_UNIT_ATTENTION 0x06 | |
40 | ||
1557a640 | 41 | /* ENE Load FW Pattern */ |
126bb03b AC |
42 | #define SD_INIT1_PATTERN 1 |
43 | #define SD_INIT2_PATTERN 2 | |
44 | #define SD_RW_PATTERN 3 | |
45 | #define MS_INIT_PATTERN 4 | |
46 | #define MSP_RW_PATTERN 5 | |
47 | #define MS_RW_PATTERN 6 | |
48 | #define SM_INIT_PATTERN 7 | |
49 | #define SM_RW_PATTERN 8 | |
50 | ||
51 | #define FDIR_WRITE 0 | |
52 | #define FDIR_READ 1 | |
53 | ||
8be88040 | 54 | struct keucr_sd_status { |
432f8574 HS |
55 | u8 Insert:1; |
56 | u8 Ready:1; | |
57 | u8 MediaChange:1; | |
58 | u8 IsMMC:1; | |
59 | u8 HiCapacity:1; | |
60 | u8 HiSpeed:1; | |
61 | u8 WtP:1; | |
62 | u8 Reserved:1; | |
8be88040 | 63 | }; |
126bb03b | 64 | |
8be88040 | 65 | struct keucr_ms_status { |
432f8574 HS |
66 | u8 Insert:1; |
67 | u8 Ready:1; | |
68 | u8 MediaChange:1; | |
69 | u8 IsMSPro:1; | |
70 | u8 IsMSPHG:1; | |
71 | u8 Reserved1:1; | |
72 | u8 WtP:1; | |
73 | u8 Reserved2:1; | |
8be88040 | 74 | }; |
126bb03b | 75 | |
8be88040 | 76 | struct keucr_sm_status { |
432f8574 HS |
77 | u8 Insert:1; |
78 | u8 Ready:1; | |
79 | u8 MediaChange:1; | |
80 | u8 Reserved:3; | |
81 | u8 WtP:1; | |
82 | u8 IsMS:1; | |
8be88040 | 83 | }; |
126bb03b | 84 | |
1557a640 AG |
85 | /* SD Block Length */ |
86 | #define SD_BLOCK_LEN 9 /* 2^9 = 512 Bytes, | |
87 | The HW maximum read/write data length */ | |
126bb03b AC |
88 | |
89 | /* Dynamic bitflag definitions (us->dflags): used in set_bit() etc. */ | |
90 | #define US_FLIDX_URB_ACTIVE 0 /* current_urb is in use */ | |
91 | #define US_FLIDX_SG_ACTIVE 1 /* current_sg is in use */ | |
92 | #define US_FLIDX_ABORTING 2 /* abort is in progress */ | |
93 | #define US_FLIDX_DISCONNECTING 3 /* disconnect in progress */ | |
94 | #define US_FLIDX_RESETTING 4 /* device reset in progress */ | |
95 | #define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */ | |
96 | #define US_FLIDX_DONT_SCAN 6 /* don't scan (disconnect) */ | |
97 | ||
98 | ||
99 | #define USB_STOR_STRING_LEN 32 | |
100 | ||
101 | /* | |
102 | * We provide a DMA-mapped I/O buffer for use with small USB transfers. | |
103 | * It turns out that CB[I] needs a 12-byte buffer and Bulk-only needs a | |
104 | * 31-byte buffer. But Freecom needs a 64-byte buffer, so that's the | |
105 | * size we'll allocate. | |
106 | */ | |
107 | ||
108 | #define US_IOBUF_SIZE 64 /* Size of the DMA-mapped I/O buffer */ | |
109 | #define US_SENSE_SIZE 18 /* Size of the autosense data buffer */ | |
110 | ||
0ea8a165 JS |
111 | typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data *); |
112 | typedef int (*trans_reset)(struct us_data *); | |
113 | typedef void (*proto_cmnd)(struct scsi_cmnd *, struct us_data *); | |
126bb03b AC |
114 | typedef void (*extra_data_destructor)(void *); /* extra data destructor */ |
115 | typedef void (*pm_hook)(struct us_data *, int); /* power management hook */ | |
116 | ||
117 | #define US_SUSPEND 0 | |
118 | #define US_RESUME 1 | |
119 | ||
120 | /* we allocate one of these for every device that we remember */ | |
121 | struct us_data { | |
122 | /* The device we're working with | |
123 | * It's important to note: | |
124 | * (o) you must hold dev_mutex to change pusb_dev | |
125 | */ | |
126 | struct mutex dev_mutex; /* protect pusb_dev */ | |
127 | struct usb_device *pusb_dev; /* this usb_device */ | |
128 | struct usb_interface *pusb_intf; /* this interface */ | |
129 | struct us_unusual_dev *unusual_dev; /* device-filter entry */ | |
130 | unsigned long fflags; /* fixed flags from filter */ | |
131 | unsigned long dflags; /* dynamic atomic bitflags */ | |
132 | unsigned int send_bulk_pipe; /* cached pipe values */ | |
133 | unsigned int recv_bulk_pipe; | |
134 | unsigned int send_ctrl_pipe; | |
135 | unsigned int recv_ctrl_pipe; | |
136 | unsigned int recv_intr_pipe; | |
137 | ||
138 | /* information about the device */ | |
139 | char *transport_name; | |
140 | char *protocol_name; | |
141 | __le32 bcs_signature; | |
142 | u8 subclass; | |
143 | u8 protocol; | |
144 | u8 max_lun; | |
145 | ||
146 | u8 ifnum; /* interface number */ | |
147 | u8 ep_bInterval; /* interrupt interval */ | |
148 | ||
149 | /* function pointers for this device */ | |
150 | trans_cmnd transport; /* transport function */ | |
151 | trans_reset transport_reset; /* transport device reset */ | |
152 | proto_cmnd proto_handler; /* protocol handler */ | |
153 | ||
154 | /* SCSI interfaces */ | |
155 | struct scsi_cmnd *srb; /* current srb */ | |
156 | unsigned int tag; /* current dCBWTag */ | |
157 | ||
158 | /* control and bulk communications data */ | |
159 | struct urb *current_urb; /* USB requests */ | |
160 | struct usb_ctrlrequest *cr; /* control requests */ | |
161 | struct usb_sg_request current_sg; /* scatter-gather req. */ | |
162 | unsigned char *iobuf; /* I/O buffer */ | |
163 | unsigned char *sensebuf; /* sense data buffer */ | |
164 | dma_addr_t cr_dma; /* buffer DMA addresses */ | |
165 | dma_addr_t iobuf_dma; | |
166 | struct task_struct *ctl_thread; /* the control thread */ | |
167 | ||
168 | /* mutual exclusion and synchronization structures */ | |
169 | struct completion cmnd_ready; /* to sleep thread on */ | |
170 | struct completion notify; /* thread begin/end */ | |
171 | wait_queue_head_t delay_wait; /* wait during scan, reset */ | |
172 | struct completion scanning_done; /* wait for scan thread */ | |
173 | ||
174 | /* subdriver information */ | |
175 | void *extra; /* Any extra data */ | |
176 | extra_data_destructor extra_destructor;/* extra data destructor */ | |
177 | #ifdef CONFIG_PM | |
178 | pm_hook suspend_resume_hook; | |
179 | #endif | |
1557a640 | 180 | /* for 6250 code */ |
8be88040 JS |
181 | struct keucr_sd_status SD_Status; |
182 | struct keucr_ms_status MS_Status; | |
183 | struct keucr_sm_status SM_Status; | |
126bb03b | 184 | |
1557a640 AG |
185 | /* ----- SD Control Data ---------------- */ |
186 | /* SD_REGISTER SD_Regs; */ | |
432f8574 HS |
187 | u16 SD_Block_Mult; |
188 | u8 SD_READ_BL_LEN; | |
189 | u16 SD_C_SIZE; | |
190 | u8 SD_C_SIZE_MULT; | |
126bb03b | 191 | |
1557a640 | 192 | /* SD/MMC New spec. */ |
432f8574 HS |
193 | u8 SD_SPEC_VER; |
194 | u8 SD_CSD_VER; | |
195 | u8 SD20_HIGH_CAPACITY; | |
196 | u32 HC_C_SIZE; | |
197 | u8 MMC_SPEC_VER; | |
198 | u8 MMC_BusWidth; | |
199 | u8 MMC_HIGH_CAPACITY; | |
4f3fff72 | 200 | |
1557a640 | 201 | /* ----- MS Control Data ---------------- */ |
432f8574 HS |
202 | bool MS_SWWP; |
203 | u32 MSP_TotalBlock; | |
20c3d7f7 | 204 | /* MS_LibControl MS_Lib; */ |
432f8574 HS |
205 | bool MS_IsRWPage; |
206 | u16 MS_Model; | |
126bb03b | 207 | |
1557a640 | 208 | /* ----- SM Control Data ---------------- */ |
432f8574 HS |
209 | u8 SM_DeviceID; |
210 | u8 SM_CardID; | |
126bb03b | 211 | |
432f8574 HS |
212 | u8 *testbuf; |
213 | u8 BIN_FLAG; | |
214 | u32 bl_num; | |
126bb03b | 215 | int SrbStatus; |
4f3fff72 | 216 | |
1557a640 | 217 | /* ------Power Managerment --------------- */ |
432f8574 | 218 | bool Power_IsResum; |
126bb03b AC |
219 | }; |
220 | ||
221 | /* Convert between us_data and the corresponding Scsi_Host */ | |
c41d74c3 AG |
222 | static inline struct Scsi_Host *us_to_host(struct us_data *us) |
223 | { | |
126bb03b AC |
224 | return container_of((void *) us, struct Scsi_Host, hostdata); |
225 | } | |
c41d74c3 AG |
226 | static inline struct us_data *host_to_us(struct Scsi_Host *host) |
227 | { | |
126bb03b AC |
228 | return (struct us_data *) host->hostdata; |
229 | } | |
230 | ||
231 | /* Function to fill an inquiry response. See usb.c for details */ | |
232 | extern void fill_inquiry_response(struct us_data *us, | |
233 | unsigned char *data, unsigned int data_len); | |
234 | ||
235 | /* The scsi_lock() and scsi_unlock() macros protect the sm_state and the | |
236 | * single queue element srb for write access */ | |
237 | #define scsi_unlock(host) spin_unlock_irq(host->host_lock) | |
238 | #define scsi_lock(host) spin_lock_irq(host->host_lock) | |
239 | ||
240 | #endif |