]> git.proxmox.com Git - mirror_edk2.git/blob - EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorageData.h
1. UsbMassStorage: Increase the timeout of USBFloppyRead10 and USBFloppyWrite10 for...
[mirror_edk2.git] / EdkModulePkg / Bus / Usb / UsbMassStorage / Dxe / UsbMassStorageData.h
1 /*++
2 Copyright (c) 2006 - 2007, Intel Corporation
3 All rights reserved. This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
7
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
10
11 Module Name:
12
13 UsbMassStorageData.h
14
15 Abstract:
16
17 Header file for USB Mass Storage Device related Data Structures
18
19 Revision History
20 --*/
21
22 #ifndef _USB_FLP_DATA_H
23 #define _USB_FLP_DATA_H
24
25 //
26 // bit definition
27 //
28 #define bit(a) (1 << (a))
29
30 //
31 // timeout unit is in millisecond.
32 //
33
34 #define STALL_1_MILLI_SECOND 1000
35 #define USBFLPTIMEOUT STALL_1_MILLI_SECOND
36 #define USBDATATIMEOUT 2 * STALL_1_MILLI_SECOND
37 //
38 // ATAPI Packet Command
39 //
40 #pragma pack(1)
41
42 typedef struct {
43 UINT8 opcode;
44 UINT8 reserved_1;
45 UINT8 reserved_2;
46 UINT8 reserved_3;
47 UINT8 reserved_4;
48 UINT8 reserved_5;
49 UINT8 reserved_6;
50 UINT8 reserved_7;
51 UINT8 reserved_8;
52 UINT8 reserved_9;
53 UINT8 reserved_10;
54 UINT8 reserved_11;
55 } TEST_UNIT_READY_CMD;
56
57 typedef struct {
58 UINT8 opcode;
59 UINT8 reserved_1 : 4;
60 UINT8 lun : 4;
61 UINT8 page_code;
62 UINT8 reserved_3;
63 UINT8 allocation_length;
64 UINT8 reserved_5;
65 UINT8 reserved_6;
66 UINT8 reserved_7;
67 UINT8 reserved_8;
68 UINT8 reserved_9;
69 UINT8 reserved_10;
70 UINT8 reserved_11;
71 } INQUIRY_CMD;
72
73 typedef struct {
74 UINT8 opcode;
75 UINT8 reserved_1 : 4;
76 UINT8 lun : 4;
77 UINT8 reserved_2;
78 UINT8 reserved_3;
79 UINT8 allocation_length;
80 UINT8 reserved_5;
81 UINT8 reserved_6;
82 UINT8 reserved_7;
83 UINT8 reserved_8;
84 UINT8 reserved_9;
85 UINT8 reserved_10;
86 UINT8 reserved_11;
87 } REQUEST_SENSE_CMD;
88
89 typedef struct {
90 UINT8 opcode;
91 UINT8 reserved_1 : 4;
92 UINT8 lun : 4;
93 UINT8 page_code : 6;
94 UINT8 page_control : 2;
95 UINT8 reserved_3;
96 UINT8 reserved_4;
97 UINT8 reserved_5;
98 UINT8 reserved_6;
99 UINT8 parameter_list_length_hi;
100 UINT8 parameter_list_length_lo;
101 UINT8 reserved_9;
102 UINT8 reserved_10;
103 UINT8 reserved_11;
104 } MODE_SENSE_CMD_UFI;
105
106 typedef struct {
107 UINT8 opcode;
108 UINT8 reserved_1 : 3;
109 UINT8 dbd : 1;
110 UINT8 reserved_2 : 1;
111 UINT8 lun : 3;
112 UINT8 page_code : 6;
113 UINT8 page_control : 2;
114 UINT8 reserved_3;
115 UINT8 allocation_length;
116 UINT8 control;
117 } MODE_SENSE_CMD_SCSI;
118
119 typedef struct {
120 UINT8 opcode;
121 UINT8 reserved_1 : 5;
122 UINT8 lun : 3;
123 UINT8 Lba0;
124 UINT8 Lba1;
125 UINT8 Lba2;
126 UINT8 Lba3;
127 UINT8 reserved_6;
128 UINT8 TranLen0;
129 UINT8 TranLen1;
130 UINT8 reserved_9;
131 UINT8 reserved_10;
132 UINT8 reserved_11;
133 } READ10_CMD;
134
135 typedef struct {
136 UINT8 opcode;
137 UINT8 reserved_1;
138 UINT8 reserved_2;
139 UINT8 reserved_3;
140 UINT8 reserved_4;
141 UINT8 reserved_5;
142 UINT8 reserved_6;
143 UINT8 allocation_length_hi;
144 UINT8 allocation_length_lo;
145 UINT8 reserved_9;
146 UINT8 reserved_10;
147 UINT8 reserved_11;
148 } READ_FORMAT_CAP_CMD;
149
150 typedef union {
151 UINT16 Data16[6];
152 TEST_UNIT_READY_CMD TestUnitReady;
153 READ10_CMD Read10;
154 REQUEST_SENSE_CMD RequestSense;
155 INQUIRY_CMD Inquiry;
156 MODE_SENSE_CMD_UFI ModeSenseUFI;
157 READ_FORMAT_CAP_CMD ReadFormatCapacity;
158 MODE_SENSE_CMD_SCSI ModeSenseSCSI;
159 } ATAPI_PACKET_COMMAND;
160
161 #pragma pack()
162 //
163 // Packet Command Code
164 //
165 #define TEST_UNIT_READY 0x00
166 #define REZERO 0x01
167 #define REQUEST_SENSE 0x03
168 #define FORMAT_UNIT 0x04
169 #define REASSIGN_BLOCKS 0x07
170 #define INQUIRY 0x12
171 #define START_STOP_UNIT 0x1B
172 #define PREVENT_ALLOW_MEDIA_REMOVAL 0x1E
173 #define READ_FORMAT_CAPACITY 0x23
174 #define OLD_FORMAT_UNIT 0x24
175 #define READ_CAPACITY 0x25
176 #define READ_10 0x28
177 #define WRITE_10 0x2A
178 #define SEEK 0x2B
179 #define SEND_DIAGNOSTICS 0x3D
180 #define WRITE_VERIFY 0x2E
181 #define VERIFY 0x2F
182 #define READ_DEFECT_DATA 0x37
183 #define WRITE_BUFFER 0x38
184 #define READ_BUFFER 0x3C
185 #define READ_LONG 0x3E
186 #define WRITE_LONG 0x3F
187 #define MODE_SELECT 0x55
188 #define UFI_MODE_SENSE5A 0x5A
189 #define SCSI_MODE_SENSE1A 0x1A
190 #define READ_12 0xA8
191 #define WRITE_12 0xAA
192 #define MAX_ATAPI_BYTE_COUNT (0xfffe)
193
194 //
195 // Sense Key
196 //
197 #define REQUEST_SENSE_ERROR (0x70)
198 #define SK_NO_SENSE (0x0)
199 #define SK_RECOVERY_ERROR (0x1)
200 #define SK_NOT_READY (0x2)
201 #define SK_MEDIUM_ERROR (0x3)
202 #define SK_HARDWARE_ERROR (0x4)
203 #define SK_ILLEGAL_REQUEST (0x5)
204 #define SK_UNIT_ATTENTION (0x6)
205 #define SK_DATA_PROTECT (0x7)
206 #define SK_BLANK_CHECK (0x8)
207 #define SK_VENDOR_SPECIFIC (0x9)
208 #define SK_RESERVED_A (0xA)
209 #define SK_ABORT (0xB)
210 #define SK_RESERVED_C (0xC)
211 #define SK_OVERFLOW (0xD)
212 #define SK_MISCOMPARE (0xE)
213 #define SK_RESERVED_F (0xF)
214
215 //
216 // Additional Sense Codes
217 //
218 #define ASC_NOT_READY (0x04)
219 #define ASC_MEDIA_ERR1 (0x10)
220 #define ASC_MEDIA_ERR2 (0x11)
221 #define ASC_MEDIA_ERR3 (0x14)
222 #define ASC_MEDIA_ERR4 (0x30)
223 #define ASC_MEDIA_UPSIDE_DOWN (0x06)
224 #define ASC_INVALID_CMD (0x20)
225 #define ASC_LBA_OUT_OF_RANGE (0x21)
226 #define ASC_INVALID_FIELD (0x24)
227 #define ASC_WRITE_PROTECTED (0x27)
228 #define ASC_MEDIA_CHANGE (0x28)
229 #define ASC_RESET (0x29) /* Power On Reset or Bus Reset occurred */
230 #define ASC_ILLEGAL_FIELD (0x26)
231 #define ASC_NO_MEDIA (0x3A)
232 #define ASC_ILLEGAL_MODE_FOR_THIS_TRACK (0x64)
233 #define ASC_LOGICAL_UNIT_STATUS (0x08)
234
235 //
236 // Additional Sense Code Qualifier
237 //
238 #define ASCQ_IN_PROGRESS (0x01)
239 #define ASCQ_DEVICE_BUSY (0xff)
240 #define ASCQ_LOGICAL_UNIT_FAILURE (0x00)
241 #define ASCQ_LOGICAL_UNIT_TIMEOUT (0x01)
242 #define ASCQ_LOGICAL_UNIT_OVERRUN (0x80)
243
244 #define SETFEATURE TRUE
245 #define CLEARFEATURE FALSE
246
247 //
248 // ATAPI Data structure
249 //
250 #pragma pack(1)
251
252 typedef struct {
253 UINT8 peripheral_type;
254 UINT8 RMB;
255 UINT8 version;
256 UINT8 response_data_format;
257 UINT8 addnl_length;
258 UINT8 reserved_5;
259 UINT8 reserved_6;
260 UINT8 reserved_7;
261 UINT8 vendor_info[8];
262 UINT8 product_id[12];
263 UINT8 eeprom_product_code[4];
264 UINT8 firmware_rev_level[4];
265 } USB_INQUIRY_DATA;
266
267 typedef struct {
268 UINT8 error_code : 7;
269 UINT8 valid : 1;
270 UINT8 reserved_1;
271 UINT8 sense_key : 4;
272 UINT8 reserved_21 : 1;
273 UINT8 ILI : 1;
274 UINT8 reserved_22 : 2;
275 UINT8 vendor_specific_3;
276 UINT8 vendor_specific_4;
277 UINT8 vendor_specific_5;
278 UINT8 vendor_specific_6;
279 UINT8 addnl_sense_length; // n - 7
280 UINT8 vendor_specific_8;
281 UINT8 vendor_specific_9;
282 UINT8 vendor_specific_10;
283 UINT8 vendor_specific_11;
284 UINT8 addnl_sense_code; // mandatory
285 UINT8 addnl_sense_code_qualifier; // mandatory
286 UINT8 field_replaceable_unit_code; // optional
287 UINT8 reserved_15;
288 UINT8 reserved_16;
289 UINT8 reserved_17;
290 //
291 // Followed by additional sense bytes : FIXME
292 //
293 } REQUEST_SENSE_DATA;
294
295 typedef struct {
296 UINT8 LastLba3;
297 UINT8 LastLba2;
298 UINT8 LastLba1;
299 UINT8 LastLba0;
300 UINT8 BlockSize3;
301 UINT8 BlockSize2;
302 UINT8 BlockSize1;
303 UINT8 BlockSize0;
304 } READ_CAPACITY_DATA;
305
306 typedef struct {
307 UINT8 reserved_0;
308 UINT8 reserved_1;
309 UINT8 reserved_2;
310 UINT8 Capacity_Length;
311 UINT8 LastLba3;
312 UINT8 LastLba2;
313 UINT8 LastLba1;
314 UINT8 LastLba0;
315 UINT8 DesCode : 2;
316 UINT8 reserved_9 : 6;
317 UINT8 BlockSize2;
318 UINT8 BlockSize1;
319 UINT8 BlockSize0;
320 } READ_FORMAT_CAPACITY_DATA;
321
322 typedef struct {
323 UINT8 mode_data_len_hi;
324 UINT8 mode_data_len_lo;
325 UINT8 media_type_code;
326 UINT8 reserved_3_0 : 4;
327 UINT8 dpofua : 1;
328 UINT8 reserved_3_1 : 2;
329 UINT8 write_protected : 1;
330 UINT8 reserved_4;
331 UINT8 reserved_5;
332 UINT8 reserved_6;
333 UINT8 reserved_7;
334 } UFI_MODE_PARAMETER_HEADER;
335
336 typedef struct {
337 UINT8 mode_data_len;
338 UINT8 media_type_code;
339 UINT8 speed : 4;
340 UINT8 buffered_mode : 3;
341 UINT8 write_protected : 1;
342 UINT8 block_descritptor_length;
343 } SCSI_MODE_PARAMETER_HEADER6;
344
345 typedef struct {
346 UINT8 page_code : 6;
347 UINT8 reserved_0 : 1;
348 UINT8 parameter_savable : 1;
349 UINT8 page_length;
350 UINT8 transfer_rate_msb;
351 UINT8 transfer_rate_lsb;
352 UINT8 number_of_heads;
353 UINT8 sectors_per_track;
354 UINT8 databytes_per_sector_msb;
355 UINT8 databytes_per_sector_lsb;
356 UINT8 number_of_cylinders_msb;
357 UINT8 number_of_cylinders_lsb;
358 UINT8 reserved_10_18[9];
359 UINT8 motor_on_delay;
360 UINT8 motor_off_delay;
361 UINT8 reserved_21_27[7];
362 UINT8 medium_rotation_rate_msb;
363 UINT8 medium_rotation_rate_lsb;
364 UINT8 reserved_30_31[2];
365 } FLEXIBLE_DISK_PAGE;
366
367 typedef struct {
368 UFI_MODE_PARAMETER_HEADER mode_param_header;
369 FLEXIBLE_DISK_PAGE flex_disk_page;
370 } UFI_MODE_PARAMETER_PAGE_5;
371
372 typedef struct {
373 UINT8 page_code : 6;
374 UINT8 reserved_0 : 1;
375 UINT8 parameter_savable : 1;
376 UINT8 page_length;
377 UINT8 reserved_2;
378 UINT8 inactive_time_multplier : 4;
379 UINT8 reserved_3 : 4;
380 UINT8 software_write_protect : 1;
381 UINT8 disable_media_access : 1;
382 UINT8 reserved_4 : 6;
383 UINT8 reserved_5;
384 UINT8 reserved_6;
385 UINT8 reserved_7;
386 } TIMER_AND_PROTECT_PAGE;
387
388 typedef struct {
389 UFI_MODE_PARAMETER_HEADER mode_param_header;
390 TIMER_AND_PROTECT_PAGE time_and_protect_page;
391 } UFI_MODE_PARAMETER_PAGE_1C;
392
393 #pragma pack()
394
395 #endif