Merge branch 'linus' into cont_syslog
[safe/jmp/linux-2.6] / drivers / scsi / bfa / include / protocol / scsi.h
1 /*
2  * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
3  * All rights reserved
4  * www.brocade.com
5  *
6  * Linux driver for Brocade Fibre Channel Host Bus Adapter.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License (GPL) Version 2 as
10  * published by the Free Software Foundation
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  */
17
18 #ifndef __SCSI_H__
19 #define __SCSI_H__
20
21 #include <protocol/types.h>
22
23 #pragma pack(1)
24
25 /*
26  * generic SCSI cdb definition
27  */
28 #define SCSI_MAX_CDBLEN     16
29 struct scsi_cdb_s{
30         u8         scsi_cdb[SCSI_MAX_CDBLEN];
31 };
32
33 /*
34  * scsi lun serial number definition
35  */
36 #define SCSI_LUN_SN_LEN     32
37 struct scsi_lun_sn_s{
38         u8         lun_sn[SCSI_LUN_SN_LEN];
39 };
40
41 /*
42  * SCSI Direct Access Commands
43  */
44 enum {
45         SCSI_OP_TEST_UNIT_READY         = 0x00,
46         SCSI_OP_REQUEST_SENSE           = 0x03,
47         SCSI_OP_FORMAT_UNIT             = 0x04,
48         SCSI_OP_READ6                   = 0x08,
49         SCSI_OP_WRITE6                  = 0x0A,
50         SCSI_OP_WRITE_FILEMARKS         = 0x10,
51         SCSI_OP_INQUIRY                 = 0x12,
52         SCSI_OP_MODE_SELECT6            = 0x15,
53         SCSI_OP_RESERVE6                = 0x16,
54         SCSI_OP_RELEASE6                = 0x17,
55         SCSI_OP_MODE_SENSE6             = 0x1A,
56         SCSI_OP_START_STOP_UNIT         = 0x1B,
57         SCSI_OP_SEND_DIAGNOSTIC         = 0x1D,
58         SCSI_OP_READ_CAPACITY           = 0x25,
59         SCSI_OP_READ10                  = 0x28,
60         SCSI_OP_WRITE10                 = 0x2A,
61         SCSI_OP_VERIFY10                = 0x2F,
62         SCSI_OP_READ_DEFECT_DATA        = 0x37,
63         SCSI_OP_LOG_SELECT              = 0x4C,
64         SCSI_OP_LOG_SENSE               = 0x4D,
65         SCSI_OP_MODE_SELECT10           = 0x55,
66         SCSI_OP_RESERVE10               = 0x56,
67         SCSI_OP_RELEASE10               = 0x57,
68         SCSI_OP_MODE_SENSE10            = 0x5A,
69         SCSI_OP_PER_RESERVE_IN          = 0x5E,
70         SCSI_OP_PER_RESERVE_OUR         = 0x5E,
71         SCSI_OP_READ16                  = 0x88,
72         SCSI_OP_WRITE16                 = 0x8A,
73         SCSI_OP_VERIFY16                = 0x8F,
74         SCSI_OP_READ_CAPACITY16         = 0x9E,
75         SCSI_OP_REPORT_LUNS             = 0xA0,
76         SCSI_OP_READ12                  = 0xA8,
77         SCSI_OP_WRITE12                 = 0xAA,
78         SCSI_OP_UNDEF                   = 0xFF,
79 };
80
81 /*
82  * SCSI START_STOP_UNIT command
83  */
84 struct scsi_start_stop_unit_s{
85         u8         opcode;
86 #ifdef __BIGENDIAN
87         u8         lun:3;
88         u8         reserved1:4;
89         u8         immed:1;
90 #else
91         u8         immed:1;
92         u8         reserved1:4;
93         u8         lun:3;
94 #endif
95         u8         reserved2;
96         u8         reserved3;
97 #ifdef __BIGENDIAN
98         u8         power_conditions:4;
99         u8         reserved4:2;
100         u8         loEj:1;
101         u8         start:1;
102 #else
103         u8         start:1;
104         u8         loEj:1;
105         u8         reserved4:2;
106         u8         power_conditions:4;
107 #endif
108         u8         control;
109 };
110
111 /*
112  * SCSI SEND_DIAGNOSTIC command
113  */
114 struct scsi_send_diagnostic_s{
115         u8         opcode;
116 #ifdef __BIGENDIAN
117         u8         self_test_code:3;
118         u8         pf:1;
119         u8         reserved1:1;
120         u8         self_test:1;
121         u8         dev_offl:1;
122         u8         unit_offl:1;
123 #else
124         u8         unit_offl:1;
125         u8         dev_offl:1;
126         u8         self_test:1;
127         u8         reserved1:1;
128         u8         pf:1;
129         u8         self_test_code:3;
130 #endif
131         u8         reserved2;
132
133         u8         param_list_length[2];        /* MSB first */
134         u8         control;
135
136 };
137
138 /*
139  * SCSI READ10/WRITE10 commands
140  */
141 struct scsi_rw10_s{
142         u8         opcode;
143 #ifdef __BIGENDIAN
144         u8         lun:3;
145         u8         dpo:1;       /* Disable Page Out */
146         u8         fua:1;       /* Force Unit Access */
147         u8         reserved1:2;
148         u8         rel_adr:1;   /* relative address */
149 #else
150         u8         rel_adr:1;
151         u8         reserved1:2;
152         u8         fua:1;
153         u8         dpo:1;
154         u8         lun:3;
155 #endif
156         u8         lba0;        /* logical block address - MSB */
157         u8         lba1;
158         u8         lba2;
159         u8         lba3;        /* LSB */
160         u8         reserved3;
161         u8         xfer_length0;        /* transfer length in blocks - MSB */
162         u8         xfer_length1;        /* LSB */
163         u8         control;
164 };
165
166 #define SCSI_CDB10_GET_LBA(cdb)                     \
167     (((cdb)->lba0 << 24) | ((cdb)->lba1 << 16) |    \
168      ((cdb)->lba2 << 8) | (cdb)->lba3)
169
170 #define SCSI_CDB10_SET_LBA(cdb, lba) {      \
171     (cdb)->lba0 = lba >> 24;            \
172     (cdb)->lba1 = (lba >> 16) & 0xFF;   \
173     (cdb)->lba2 = (lba >> 8) & 0xFF;    \
174     (cdb)->lba3 = lba & 0xFF;           \
175 }
176
177 #define SCSI_CDB10_GET_TL(cdb)  \
178     ((cdb)->xfer_length0 << 8 | (cdb)->xfer_length1)
179 #define SCSI_CDB10_SET_TL(cdb, tl) {      \
180     (cdb)->xfer_length0 = tl >> 8;       \
181     (cdb)->xfer_length1 = tl & 0xFF;     \
182 }
183
184 /*
185  * SCSI READ6/WRITE6 commands
186  */
187 struct scsi_rw6_s{
188         u8         opcode;
189 #ifdef __BIGENDIAN
190         u8         lun:3;
191         u8         lba0:5;              /* MSb */
192 #else
193         u8         lba0:5;              /* MSb */
194         u8         lun:3;
195 #endif
196         u8         lba1;
197         u8         lba2;                /* LSB */
198         u8         xfer_length;
199         u8         control;
200 };
201
202 #define SCSI_TAPE_CDB6_GET_TL(cdb)              \
203     (((cdb)->tl0 << 16) | ((cdb)->tl1 << 8) | (cdb)->tl2)
204
205 #define SCSI_TAPE_CDB6_SET_TL(cdb, tl) {      \
206     (cdb)->tl0 = tl >> 16;            \
207     (cdb)->tl1 = (tl >> 8) & 0xFF;    \
208     (cdb)->tl2 = tl & 0xFF;           \
209 }
210
211 /*
212  * SCSI sequential (TAPE) wrtie command
213  */
214 struct scsi_tape_wr_s{
215         u8         opcode;
216 #ifdef __BIGENDIAN
217         u8         rsvd:7;
218         u8         fixed:1;     /* MSb */
219 #else
220         u8         fixed:1;     /* MSb */
221         u8         rsvd:7;
222 #endif
223         u8         tl0;         /* Msb */
224         u8         tl1;
225         u8         tl2;         /* Lsb */
226
227         u8         control;
228 };
229
230 #define SCSI_CDB6_GET_LBA(cdb)              \
231     (((cdb)->lba0 << 16) | ((cdb)->lba1 << 8) | (cdb)->lba2)
232
233 #define SCSI_CDB6_SET_LBA(cdb, lba) {      \
234     (cdb)->lba0 = lba >> 16;            \
235     (cdb)->lba1 = (lba >> 8) & 0xFF;    \
236     (cdb)->lba2 = lba & 0xFF;           \
237 }
238
239 #define SCSI_CDB6_GET_TL(cdb) ((cdb)->xfer_length)
240 #define SCSI_CDB6_SET_TL(cdb, tl) {      \
241     (cdb)->xfer_length = tl;         \
242 }
243
244 /*
245  * SCSI sense data format
246  */
247 struct scsi_sense_s{
248 #ifdef __BIGENDIAN
249         u8         valid:1;
250         u8         rsp_code:7;
251 #else
252         u8         rsp_code:7;
253         u8         valid:1;
254 #endif
255         u8         seg_num;
256 #ifdef __BIGENDIAN
257         u8         file_mark:1;
258         u8         eom:1;               /* end of media */
259         u8         ili:1;               /* incorrect length indicator */
260         u8         reserved:1;
261         u8         sense_key:4;
262 #else
263         u8         sense_key:4;
264         u8         reserved:1;
265         u8         ili:1;               /* incorrect length indicator */
266         u8         eom:1;               /* end of media */
267         u8         file_mark:1;
268 #endif
269         u8         information[4];      /* device-type or command specific info
270                                          */
271         u8         add_sense_length;
272                                         /* additional sense length */
273         u8         command_info[4];/* command specific information
274                                                  */
275         u8         asc;         /* additional sense code */
276         u8         ascq;                /* additional sense code qualifier */
277         u8         fru_code;    /* field replaceable unit code */
278 #ifdef __BIGENDIAN
279         u8         sksv:1;              /* sense key specific valid */
280         u8         c_d:1;               /* command/data bit */
281         u8         res1:2;
282         u8         bpv:1;               /* bit pointer valid */
283         u8         bpointer:3;  /* bit pointer */
284 #else
285         u8         bpointer:3;  /* bit pointer */
286         u8         bpv:1;               /* bit pointer valid */
287         u8         res1:2;
288         u8         c_d:1;               /* command/data bit */
289         u8         sksv:1;              /* sense key specific valid */
290 #endif
291         u8         fpointer[2]; /* field pointer */
292 };
293
294 #define SCSI_SENSE_CUR_ERR          0x70
295 #define SCSI_SENSE_DEF_ERR          0x71
296
297 /*
298  * SCSI sense key values
299  */
300 #define SCSI_SK_NO_SENSE        0x0
301 #define SCSI_SK_REC_ERR         0x1     /* recovered error */
302 #define SCSI_SK_NOT_READY       0x2
303 #define SCSI_SK_MED_ERR         0x3     /* medium error */
304 #define SCSI_SK_HW_ERR          0x4     /* hardware error */
305 #define SCSI_SK_ILLEGAL_REQ     0x5
306 #define SCSI_SK_UNIT_ATT        0x6     /* unit attention */
307 #define SCSI_SK_DATA_PROTECT    0x7
308 #define SCSI_SK_BLANK_CHECK     0x8
309 #define SCSI_SK_VENDOR_SPEC     0x9
310 #define SCSI_SK_COPY_ABORTED    0xA
311 #define SCSI_SK_ABORTED_CMND    0xB
312 #define SCSI_SK_VOL_OVERFLOW    0xD
313 #define SCSI_SK_MISCOMPARE      0xE
314
315 /*
316  * SCSI additional sense codes
317  */
318 #define SCSI_ASC_NO_ADD_SENSE           0x00
319 #define SCSI_ASC_LUN_NOT_READY          0x04
320 #define SCSI_ASC_LUN_COMMUNICATION      0x08
321 #define SCSI_ASC_WRITE_ERROR            0x0C
322 #define SCSI_ASC_INVALID_CMND_CODE      0x20
323 #define SCSI_ASC_BAD_LBA                0x21
324 #define SCSI_ASC_INVALID_FIELD_IN_CDB   0x24
325 #define SCSI_ASC_LUN_NOT_SUPPORTED      0x25
326 #define SCSI_ASC_LUN_WRITE_PROTECT      0x27
327 #define SCSI_ASC_POWERON_BDR            0x29    /* power on reset, bus reset,
328                                                  * bus device reset
329                                                  */
330 #define SCSI_ASC_PARAMS_CHANGED         0x2A
331 #define SCSI_ASC_CMND_CLEARED_BY_A_I    0x2F
332 #define SCSI_ASC_SAVING_PARAM_NOTSUPP   0x39
333 #define SCSI_ASC_TOCC                   0x3F    /* target operating condtions
334                                                  * changed
335                                                  */
336 #define SCSI_ASC_PARITY_ERROR           0x47
337 #define SCSI_ASC_CMND_PHASE_ERROR       0x4A
338 #define SCSI_ASC_DATA_PHASE_ERROR       0x4B
339 #define SCSI_ASC_VENDOR_SPEC            0x7F
340
341 /*
342  * SCSI additional sense code qualifiers
343  */
344 #define SCSI_ASCQ_CAUSE_NOT_REPORT      0x00
345 #define SCSI_ASCQ_BECOMING_READY        0x01
346 #define SCSI_ASCQ_INIT_CMD_REQ          0x02
347 #define SCSI_ASCQ_FORMAT_IN_PROGRESS    0x04
348 #define SCSI_ASCQ_OPERATION_IN_PROGRESS 0x07
349 #define SCSI_ASCQ_SELF_TEST_IN_PROGRESS 0x09
350 #define SCSI_ASCQ_WR_UNEXP_UNSOL_DATA   0x0C
351 #define SCSI_ASCQ_WR_NOTENG_UNSOL_DATA  0x0D
352
353 #define SCSI_ASCQ_LBA_OUT_OF_RANGE      0x00
354 #define SCSI_ASCQ_INVALID_ELEMENT_ADDR  0x01
355
356 #define SCSI_ASCQ_LUN_WRITE_PROTECTED       0x00
357 #define SCSI_ASCQ_LUN_HW_WRITE_PROTECTED    0x01
358 #define SCSI_ASCQ_LUN_SW_WRITE_PROTECTED    0x02
359
360 #define SCSI_ASCQ_POR   0x01    /* power on reset */
361 #define SCSI_ASCQ_SBR   0x02    /* scsi bus reset */
362 #define SCSI_ASCQ_BDR   0x03    /* bus device reset */
363 #define SCSI_ASCQ_DIR   0x04    /* device internal reset */
364
365 #define SCSI_ASCQ_MODE_PARAMS_CHANGED       0x01
366 #define SCSI_ASCQ_LOG_PARAMS_CHANGED        0x02
367 #define SCSI_ASCQ_RESERVATIONS_PREEMPTED    0x03
368 #define SCSI_ASCQ_RESERVATIONS_RELEASED     0x04
369 #define SCSI_ASCQ_REGISTRATIONS_PREEMPTED   0x05
370
371 #define SCSI_ASCQ_MICROCODE_CHANGED 0x01
372 #define SCSI_ASCQ_CHANGED_OPER_COND 0x02
373 #define SCSI_ASCQ_INQ_CHANGED       0x03        /* inquiry data changed */
374 #define SCSI_ASCQ_DI_CHANGED        0x05        /* device id changed */
375 #define SCSI_ASCQ_RL_DATA_CHANGED   0x0E        /* report luns data changed */
376
377 #define SCSI_ASCQ_DP_CRC_ERR            0x01    /* data phase crc error */
378 #define SCSI_ASCQ_DP_SCSI_PARITY_ERR    0x02    /* data phase scsi parity error
379                                                  */
380 #define SCSI_ASCQ_IU_CRC_ERR            0x03    /* information unit crc error */
381 #define SCSI_ASCQ_PROTO_SERV_CRC_ERR    0x05
382
383 #define SCSI_ASCQ_LUN_TIME_OUT          0x01
384
385 /* ------------------------------------------------------------
386  * SCSI INQUIRY
387  * ------------------------------------------------------------*/
388
389 struct scsi_inquiry_s{
390         u8         opcode;
391 #ifdef __BIGENDIAN
392         u8         lun:3;
393         u8         reserved1:3;
394         u8         cmd_dt:1;
395         u8         evpd:1;
396 #else
397         u8         evpd:1;
398         u8         cmd_dt:1;
399         u8         reserved1:3;
400         u8         lun:3;
401 #endif
402         u8         page_code;
403         u8         reserved2;
404         u8         alloc_length;
405         u8         control;
406 };
407
408 struct scsi_inquiry_vendor_s{
409         u8         vendor_id[8];
410 };
411
412 struct scsi_inquiry_prodid_s{
413         u8         product_id[16];
414 };
415
416 struct scsi_inquiry_prodrev_s{
417         u8         product_rev[4];
418 };
419
420 struct scsi_inquiry_data_s{
421 #ifdef __BIGENDIAN
422         u8         peripheral_qual:3;   /* peripheral qualifier */
423         u8         device_type:5;               /* peripheral device type */
424
425         u8         rmb:1;                       /* removable medium bit */
426         u8         device_type_mod:7;   /* device type modifier */
427
428         u8         version;
429
430         u8         aenc:1;              /* async event notification capability
431                                          */
432         u8         trm_iop:1;   /* terminate I/O process */
433         u8         norm_aca:1;  /* normal ACA supported */
434         u8         hi_support:1;        /* SCSI-3: supports REPORT LUNS */
435         u8         rsp_data_format:4;
436
437         u8         additional_len;
438         u8         sccs:1;
439         u8         reserved1:7;
440
441         u8         reserved2:1;
442         u8         enc_serv:1;  /* enclosure service component */
443         u8         reserved3:1;
444         u8         multi_port:1;        /* multi-port device */
445         u8         m_chngr:1;   /* device in medium transport element */
446         u8         ack_req_q:1; /* SIP specific bit */
447         u8         addr32:1;    /* SIP specific bit */
448         u8         addr16:1;    /* SIP specific bit */
449
450         u8         rel_adr:1;   /* relative address */
451         u8         w_bus32:1;
452         u8         w_bus16:1;
453         u8         synchronous:1;
454         u8         linked_commands:1;
455         u8         trans_dis:1;
456         u8         cmd_queue:1; /* command queueing supported */
457         u8         soft_reset:1;        /* soft reset alternative (VS) */
458 #else
459         u8         device_type:5;       /* peripheral device type */
460         u8         peripheral_qual:3;
461                                         /* peripheral qualifier */
462
463         u8         device_type_mod:7;
464                                         /* device type modifier */
465         u8         rmb:1;               /* removable medium bit */
466
467         u8         version;
468
469         u8         rsp_data_format:4;
470         u8         hi_support:1;        /* SCSI-3: supports REPORT LUNS */
471         u8         norm_aca:1;  /* normal ACA supported */
472         u8         terminate_iop:1;/* terminate I/O process */
473         u8         aenc:1;              /* async event notification capability
474                                          */
475
476         u8         additional_len;
477         u8         reserved1:7;
478         u8         sccs:1;
479
480         u8         addr16:1;    /* SIP specific bit */
481         u8         addr32:1;    /* SIP specific bit */
482         u8         ack_req_q:1; /* SIP specific bit */
483         u8         m_chngr:1;   /* device in medium transport element */
484         u8         multi_port:1;        /* multi-port device */
485         u8         reserved3:1; /* TBD - Vendor Specific */
486         u8         enc_serv:1;  /* enclosure service component */
487         u8         reserved2:1;
488
489         u8         soft_seset:1;        /* soft reset alternative (VS) */
490         u8         cmd_queue:1; /* command queueing supported */
491         u8         trans_dis:1;
492         u8         linked_commands:1;
493         u8         synchronous:1;
494         u8         w_bus16:1;
495         u8         w_bus32:1;
496         u8         rel_adr:1;   /* relative address */
497 #endif
498         struct scsi_inquiry_vendor_s vendor_id;
499         struct scsi_inquiry_prodid_s product_id;
500         struct scsi_inquiry_prodrev_s product_rev;
501         u8         vendor_specific[20];
502         u8         reserved4[40];
503 };
504
505 /*
506  * inquiry.peripheral_qual field values
507  */
508 #define SCSI_DEVQUAL_DEFAULT        0
509 #define SCSI_DEVQUAL_NOT_CONNECTED  1
510 #define SCSI_DEVQUAL_NOT_SUPPORTED  3
511
512 /*
513  * inquiry.device_type field values
514  */
515 #define SCSI_DEVICE_DIRECT_ACCESS       0x00
516 #define SCSI_DEVICE_SEQ_ACCESS          0x01
517 #define SCSI_DEVICE_ARRAY_CONTROLLER    0x0C
518 #define SCSI_DEVICE_UNKNOWN             0x1F
519
520 /*
521  * inquiry.version
522  */
523 #define SCSI_VERSION_ANSI_X3131     2   /* ANSI X3.131 SCSI-2 */
524 #define SCSI_VERSION_SPC            3   /* SPC (SCSI-3), ANSI X3.301:1997 */
525 #define SCSI_VERSION_SPC_2          4   /* SPC-2 */
526
527 /*
528  * response data format
529  */
530 #define SCSI_RSP_DATA_FORMAT        2   /* SCSI-2 & SPC */
531
532 /*
533  * SCSI inquiry page codes
534  */
535 #define SCSI_INQ_PAGE_VPD_PAGES     0x00        /* supported vpd pages */
536 #define SCSI_INQ_PAGE_USN_PAGE      0x80        /* unit serial number page */
537 #define SCSI_INQ_PAGE_DEV_IDENT     0x83        /* device indentification page
538                                                  */
539 #define SCSI_INQ_PAGES_MAX          3
540
541 /*
542  * supported vital product data pages
543  */
544 struct scsi_inq_page_vpd_pages_s{
545 #ifdef __BIGENDIAN
546         u8         peripheral_qual:3;
547         u8         device_type:5;
548 #else
549         u8         device_type:5;
550         u8         peripheral_qual:3;
551 #endif
552         u8         page_code;
553         u8         reserved;
554         u8         page_length;
555         u8         pages[SCSI_INQ_PAGES_MAX];
556 };
557
558 /*
559  * Unit serial number page
560  */
561 #define SCSI_INQ_USN_LEN 32
562
563 struct scsi_inq_usn_s{
564         char            usn[SCSI_INQ_USN_LEN];
565 };
566
567 struct scsi_inq_page_usn_s{
568 #ifdef __BIGENDIAN
569         u8         peripheral_qual:3;
570         u8         device_type:5;
571 #else
572         u8         device_type:5;
573         u8         peripheral_qual:3;
574 #endif
575         u8         page_code;
576         u8         reserved1;
577         u8         page_length;
578         struct scsi_inq_usn_s  usn;
579 };
580
581 enum {
582         SCSI_INQ_DIP_CODE_BINARY = 1,   /* identifier has binary value */
583         SCSI_INQ_DIP_CODE_ASCII = 2,    /* identifier has ascii value */
584 };
585
586 enum {
587         SCSI_INQ_DIP_ASSOC_LUN = 0,     /* id is associated with device */
588         SCSI_INQ_DIP_ASSOC_PORT = 1,    /* id is associated with port that
589                                          * received the request
590                                          */
591 };
592
593 enum {
594         SCSI_INQ_ID_TYPE_VENDOR = 1,
595         SCSI_INQ_ID_TYPE_IEEE = 2,
596         SCSI_INQ_ID_TYPE_FC_FS = 3,
597         SCSI_INQ_ID_TYPE_OTHER = 4,
598 };
599
600 struct scsi_inq_dip_desc_s{
601 #ifdef __BIGENDIAN
602         u8         res0:4;
603         u8         code_set:4;
604         u8         res1:2;
605         u8         association:2;
606         u8         id_type:4;
607 #else
608         u8         code_set:4;
609         u8         res0:4;
610         u8         id_type:4;
611         u8         association:2;
612         u8         res1:2;
613 #endif
614         u8         res2;
615         u8         id_len;
616         struct scsi_lun_sn_s   id;
617 };
618
619 /*
620  * Device indentification page
621  */
622 struct scsi_inq_page_dev_ident_s{
623 #ifdef __BIGENDIAN
624         u8         peripheral_qual:3;
625         u8         device_type:5;
626 #else
627         u8         device_type:5;
628         u8         peripheral_qual:3;
629 #endif
630         u8         page_code;
631         u8         reserved1;
632         u8         page_length;
633         struct scsi_inq_dip_desc_s desc;
634 };
635
636 /* ------------------------------------------------------------
637  * READ CAPACITY
638  * ------------------------------------------------------------
639  */
640
641 struct scsi_read_capacity_s{
642         u8         opcode;
643 #ifdef __BIGENDIAN
644         u8         lun:3;
645         u8         reserved1:4;
646         u8         rel_adr:1;
647 #else
648         u8         rel_adr:1;
649         u8         reserved1:4;
650         u8         lun:3;
651 #endif
652         u8         lba0;        /* MSB */
653         u8         lba1;
654         u8         lba2;
655         u8         lba3;        /* LSB */
656         u8         reserved2;
657         u8         reserved3;
658 #ifdef __BIGENDIAN
659         u8         reserved4:7;
660         u8         pmi:1;       /* partial medium indicator */
661 #else
662         u8         pmi:1;       /* partial medium indicator */
663         u8         reserved4:7;
664 #endif
665         u8         control;
666 };
667
668 struct scsi_read_capacity_data_s{
669         u32        max_lba;     /* maximum LBA available */
670         u32        block_length;        /* in bytes */
671 };
672
673 struct scsi_read_capacity16_data_s{
674         u64        lba; /* maximum LBA available */
675         u32        block_length;        /* in bytes */
676 #ifdef __BIGENDIAN
677         u8         reserved1:4,
678                         p_type:3,
679                         prot_en:1;
680         u8              reserved2:4,
681                         lb_pbe:4;       /* logical blocks per physical block
682                                          * exponent */
683         u16     reserved3:2,
684                         lba_align:14;   /* lowest aligned logical block
685                                          * address */
686 #else
687         u16     lba_align:14,   /* lowest aligned logical block
688                                          * address */
689                         reserved3:2;
690         u8              lb_pbe:4,       /* logical blocks per physical block
691                                          * exponent */
692                         reserved2:4;
693         u8              prot_en:1,
694                         p_type:3,
695                         reserved1:4;
696 #endif
697         u64     reserved4;
698         u64     reserved5;
699 };
700
701 /* ------------------------------------------------------------
702  * REPORT LUNS command
703  * ------------------------------------------------------------
704  */
705
706 struct scsi_report_luns_s{
707         u8         opcode;              /* A0h - REPORT LUNS opCode */
708         u8         reserved1[5];
709         u8         alloc_length[4];/* allocation length MSB first */
710         u8         reserved2;
711         u8         control;
712 };
713
714 #define SCSI_REPORT_LUN_ALLOC_LENGTH(rl)                                \
715     ((rl->alloc_length[0] << 24) | (rl->alloc_length[1] << 16) |        \
716      (rl->alloc_length[2] << 8) | (rl->alloc_length[3]))
717
718 #define SCSI_REPORT_LUNS_SET_ALLOCLEN(rl, alloc_len) {      \
719     (rl)->alloc_length[0] = (alloc_len) >> 24;                          \
720     (rl)->alloc_length[1] = ((alloc_len) >> 16) & 0xFF;                 \
721     (rl)->alloc_length[2] = ((alloc_len) >> 8) & 0xFF;                  \
722     (rl)->alloc_length[3] = (alloc_len) & 0xFF;                         \
723 }
724
725 struct scsi_report_luns_data_s{
726         u32        lun_list_length;     /* length of LUN list length */
727         u32        reserved;
728         lun_t           lun[1];                 /* first LUN in lun list */
729 };
730
731 /* -------------------------------------------------------------
732  * SCSI mode  parameters
733  * -----------------------------------------------------------
734  */
735 enum {
736         SCSI_DA_MEDIUM_DEF = 0, /* direct access default medium type */
737         SCSI_DA_MEDIUM_SS = 1,  /* direct access single sided */
738         SCSI_DA_MEDIUM_DS = 2,  /* direct access double sided */
739 };
740
741 /*
742  * SCSI Mode Select(6) cdb
743  */
744 struct scsi_mode_select6_s{
745         u8         opcode;
746 #ifdef __BIGENDIAN
747         u8         reserved1:3;
748         u8         pf:1;                /* page format */
749         u8         reserved2:3;
750         u8         sp:1;                /* save pages if set to 1 */
751 #else
752         u8         sp:1;        /* save pages if set to 1 */
753         u8         reserved2:3;
754         u8         pf:1;        /* page format */
755         u8         reserved1:3;
756 #endif
757         u8         reserved3[2];
758         u8         alloc_len;
759         u8         control;
760 };
761
762 /*
763  * SCSI Mode Select(10) cdb
764  */
765 struct scsi_mode_select10_s{
766         u8         opcode;
767 #ifdef __BIGENDIAN
768         u8         reserved1:3;
769         u8         pf:1;        /* page format */
770         u8         reserved2:3;
771         u8         sp:1;        /* save pages if set to 1 */
772 #else
773         u8         sp:1;        /* save pages if set to 1 */
774         u8         reserved2:3;
775         u8         pf:1;        /* page format */
776         u8         reserved1:3;
777 #endif
778         u8         reserved3[5];
779         u8         alloc_len_msb;
780         u8         alloc_len_lsb;
781         u8         control;
782 };
783
784 /*
785  * SCSI Mode Sense(6) cdb
786  */
787 struct scsi_mode_sense6_s{
788         u8         opcode;
789 #ifdef __BIGENDIAN
790         u8         reserved1:4;
791         u8         dbd:1;       /* disable block discriptors if set to 1 */
792         u8         reserved2:3;
793
794         u8         pc:2;        /* page control */
795         u8         page_code:6;
796 #else
797         u8         reserved2:3;
798         u8         dbd:1;       /* disable block descriptors if set to 1 */
799         u8         reserved1:4;
800
801         u8         page_code:6;
802         u8         pc:2;        /* page control */
803 #endif
804         u8         reserved3;
805         u8         alloc_len;
806         u8         control;
807 };
808
809 /*
810  * SCSI Mode Sense(10) cdb
811  */
812 struct scsi_mode_sense10_s{
813         u8         opcode;
814 #ifdef __BIGENDIAN
815         u8         reserved1:3;
816         u8         LLBAA:1;     /* long LBA accepted if set to 1 */
817         u8         dbd:1;               /* disable block descriptors if set
818                                          * to 1
819                                          */
820         u8         reserved2:3;
821
822         u8         pc:2;                /* page control */
823         u8         page_code:6;
824 #else
825         u8         reserved2:3;
826         u8         dbd:1;               /* disable block descriptors if set to
827                                          * 1
828                                          */
829         u8         LLBAA:1;     /* long LBA accepted if set to 1 */
830         u8         reserved1:3;
831
832         u8         page_code:6;
833         u8         pc:2;                /* page control */
834 #endif
835         u8         reserved3[4];
836         u8         alloc_len_msb;
837         u8         alloc_len_lsb;
838         u8         control;
839 };
840
841 #define SCSI_CDB10_GET_AL(cdb)                                          \
842     ((cdb)->alloc_len_msb << 8 | (cdb)->alloc_len_lsb)
843
844 #define SCSI_CDB10_SET_AL(cdb, al) {      \
845     (cdb)->alloc_len_msb = al >> 8;                                     \
846     (cdb)->alloc_len_lsb = al & 0xFF;                                   \
847 }
848
849 #define SCSI_CDB6_GET_AL(cdb) ((cdb)->alloc_len)
850
851 #define SCSI_CDB6_SET_AL(cdb, al) {      \
852     (cdb)->alloc_len = al;                                              \
853 }
854
855 /*
856  * page control field values
857  */
858 #define SCSI_PC_CURRENT_VALUES       0x0
859 #define SCSI_PC_CHANGEABLE_VALUES    0x1
860 #define SCSI_PC_DEFAULT_VALUES       0x2
861 #define SCSI_PC_SAVED_VALUES         0x3
862
863 /*
864  * SCSI mode page codes
865  */
866 #define SCSI_MP_VENDOR_SPEC     0x00
867 #define SCSI_MP_DISC_RECN       0x02    /* disconnect-reconnect page */
868 #define SCSI_MP_FORMAT_DEVICE   0x03
869 #define SCSI_MP_RDG             0x04    /* rigid disk geometry page */
870 #define SCSI_MP_FDP             0x05    /* flexible disk page */
871 #define SCSI_MP_CACHING         0x08    /* caching page */
872 #define SCSI_MP_CONTROL         0x0A    /* control mode page */
873 #define SCSI_MP_MED_TYPES_SUP   0x0B    /* medium types supported page */
874 #define SCSI_MP_INFO_EXCP_CNTL  0x1C    /* informational exception control */
875 #define SCSI_MP_ALL             0x3F    /* return all pages - mode sense only */
876
877 /*
878  * mode parameter header
879  */
880 struct scsi_mode_param_header6_s{
881         u8         mode_datalen;
882         u8         medium_type;
883
884         /*
885          * device specific parameters expanded for direct access devices
886          */
887 #ifdef __BIGENDIAN
888         u32        wp:1;                /* write protected */
889         u32        reserved1:2;
890         u32        dpofua:1;    /* disable page out + force unit access
891                                          */
892         u32        reserved2:4;
893 #else
894         u32        reserved2:4;
895         u32        dpofua:1;    /* disable page out + force unit access
896                                          */
897         u32        reserved1:2;
898         u32        wp:1;                /* write protected */
899 #endif
900
901         u8         block_desclen;
902 };
903
904 struct scsi_mode_param_header10_s{
905         u32        mode_datalen:16;
906         u32        medium_type:8;
907
908         /*
909          * device specific parameters expanded for direct access devices
910          */
911 #ifdef __BIGENDIAN
912         u32        wp:1;                /* write protected */
913         u32        reserved1:2;
914         u32        dpofua:1;    /* disable page out + force unit access
915                                          */
916         u32        reserved2:4;
917 #else
918         u32        reserved2:4;
919         u32        dpofua:1;    /* disable page out + force unit access
920                                          */
921         u32        reserved1:2;
922         u32        wp:1;                /* write protected */
923 #endif
924
925 #ifdef __BIGENDIAN
926         u32        reserved3:7;
927         u32        longlba:1;
928 #else
929         u32        longlba:1;
930         u32        reserved3:7;
931 #endif
932         u32        reserved4:8;
933         u32        block_desclen:16;
934 };
935
936 /*
937  * mode parameter block descriptor
938  */
939 struct scsi_mode_param_desc_s{
940         u32        nblks;
941         u32        density_code:8;
942         u32        block_length:24;
943 };
944
945 /*
946  * Disconnect-reconnect mode page format
947  */
948 struct scsi_mp_disc_recn_s{
949 #ifdef __BIGENDIAN
950         u8         ps:1;
951         u8         reserved1:1;
952         u8         page_code:6;
953 #else
954         u8         page_code:6;
955         u8         reserved1:1;
956         u8         ps:1;
957 #endif
958         u8         page_len;
959         u8         buf_full_ratio;
960         u8         buf_empty_ratio;
961
962         u8         bil_msb;     /* bus inactivity limit -MSB */
963         u8         bil_lsb;     /* bus inactivity limit -LSB */
964
965         u8         dtl_msb;     /* disconnect time limit - MSB */
966         u8         dtl_lsb;     /* disconnect time limit - LSB */
967
968         u8         ctl_msb;     /* connect time limit - MSB */
969         u8         ctl_lsb;     /* connect time limit - LSB */
970
971         u8         max_burst_len_msb;
972         u8         max_burst_len_lsb;
973 #ifdef __BIGENDIAN
974         u8         emdp:1;      /* enable modify data pointers */
975         u8         fa:3;        /* fair arbitration */
976         u8         dimm:1;      /* disconnect immediate */
977         u8         dtdc:3;      /* data transfer disconnect control */
978 #else
979         u8         dtdc:3;      /* data transfer disconnect control */
980         u8         dimm:1;      /* disconnect immediate */
981         u8         fa:3;        /* fair arbitration */
982         u8         emdp:1;      /* enable modify data pointers */
983 #endif
984
985         u8         reserved3;
986
987         u8         first_burst_len_msb;
988         u8         first_burst_len_lsb;
989 };
990
991 /*
992  * SCSI format device mode page
993  */
994 struct scsi_mp_format_device_s{
995 #ifdef __BIGENDIAN
996         u32        ps:1;
997         u32        reserved1:1;
998         u32        page_code:6;
999 #else
1000         u32        page_code:6;
1001         u32        reserved1:1;
1002         u32        ps:1;
1003 #endif
1004         u32        page_len:8;
1005         u32        tracks_per_zone:16;
1006
1007         u32        a_sec_per_zone:16;
1008         u32        a_tracks_per_zone:16;
1009
1010         u32        a_tracks_per_lun:16; /* alternate tracks/lun-MSB */
1011         u32        sec_per_track:16;    /* sectors/track-MSB */
1012
1013         u32        bytes_per_sector:16;
1014         u32        interleave:16;
1015
1016         u32        tsf:16;                      /* track skew factor-MSB */
1017         u32        csf:16;                      /* cylinder skew factor-MSB */
1018
1019 #ifdef __BIGENDIAN
1020         u32        ssec:1;      /* soft sector formatting */
1021         u32        hsec:1;      /* hard sector formatting */
1022         u32        rmb:1;       /* removable media */
1023         u32        surf:1;      /* surface */
1024         u32        reserved2:4;
1025 #else
1026         u32        reserved2:4;
1027         u32        surf:1;      /* surface */
1028         u32        rmb:1;       /* removable media */
1029         u32        hsec:1;      /* hard sector formatting */
1030         u32        ssec:1;      /* soft sector formatting */
1031 #endif
1032         u32        reserved3:24;
1033 };
1034
1035 /*
1036  * SCSI rigid disk device geometry page
1037  */
1038 struct scsi_mp_rigid_device_geometry_s{
1039 #ifdef __BIGENDIAN
1040         u32        ps:1;
1041         u32        reserved1:1;
1042         u32        page_code:6;
1043 #else
1044         u32        page_code:6;
1045         u32        reserved1:1;
1046         u32        ps:1;
1047 #endif
1048         u32        page_len:8;
1049         u32        num_cylinders0:8;
1050         u32        num_cylinders1:8;
1051
1052         u32        num_cylinders2:8;
1053         u32        num_heads:8;
1054         u32        scwp0:8;
1055         u32        scwp1:8;
1056
1057         u32        scwp2:8;
1058         u32        scrwc0:8;
1059         u32        scrwc1:8;
1060         u32        scrwc2:8;
1061
1062         u32        dsr:16;
1063         u32        lscyl0:8;
1064         u32        lscyl1:8;
1065
1066         u32        lscyl2:8;
1067 #ifdef __BIGENDIAN
1068         u32        reserved2:6;
1069         u32        rpl:2;       /* rotational position locking */
1070 #else
1071         u32        rpl:2;       /* rotational position locking */
1072         u32        reserved2:6;
1073 #endif
1074         u32        rot_off:8;
1075         u32        reserved3:8;
1076
1077         u32        med_rot_rate:16;
1078         u32        reserved4:16;
1079 };
1080
1081 /*
1082  * SCSI caching mode page
1083  */
1084 struct scsi_mp_caching_s{
1085 #ifdef __BIGENDIAN
1086         u8         ps:1;
1087         u8         res1:1;
1088         u8         page_code:6;
1089 #else
1090         u8         page_code:6;
1091         u8         res1:1;
1092         u8         ps:1;
1093 #endif
1094         u8         page_len;
1095 #ifdef __BIGENDIAN
1096         u8         ic:1;        /* initiator control */
1097         u8         abpf:1;      /* abort pre-fetch */
1098         u8         cap:1;       /* caching analysis permitted */
1099         u8         disc:1;      /* discontinuity */
1100         u8         size:1;      /* size enable */
1101         u8         wce:1;       /* write cache enable */
1102         u8         mf:1;        /* multiplication factor */
1103         u8         rcd:1;       /* read cache disable */
1104
1105         u8         drrp:4;      /* demand read retention priority */
1106         u8         wrp:4;       /* write retention priority */
1107 #else
1108         u8         rcd:1;       /* read cache disable */
1109         u8         mf:1;        /* multiplication factor */
1110         u8         wce:1;       /* write cache enable */
1111         u8         size:1;      /* size enable */
1112         u8         disc:1;      /* discontinuity */
1113         u8         cap:1;       /* caching analysis permitted */
1114         u8         abpf:1;      /* abort pre-fetch */
1115         u8         ic:1;        /* initiator control */
1116
1117         u8         wrp:4;       /* write retention priority */
1118         u8         drrp:4;      /* demand read retention priority */
1119 #endif
1120         u8         dptl[2];/* disable pre-fetch transfer length */
1121         u8         min_prefetch[2];
1122         u8         max_prefetch[2];
1123         u8         max_prefetch_limit[2];
1124 #ifdef __BIGENDIAN
1125         u8         fsw:1;       /* force sequential write */
1126         u8         lbcss:1;/* logical block cache segment size */
1127         u8         dra:1;       /* disable read ahead */
1128         u8         vs:2;        /* vendor specific */
1129         u8         res2:3;
1130 #else
1131         u8         res2:3;
1132         u8         vs:2;        /* vendor specific */
1133         u8         dra:1;       /* disable read ahead */
1134         u8         lbcss:1;/* logical block cache segment size */
1135         u8         fsw:1;       /* force sequential write */
1136 #endif
1137         u8         num_cache_segs;
1138
1139         u8         cache_seg_size[2];
1140         u8         res3;
1141         u8         non_cache_seg_size[3];
1142 };
1143
1144 /*
1145  * SCSI control mode page
1146  */
1147 struct scsi_mp_control_page_s{
1148 #ifdef __BIGENDIAN
1149 u8         ps:1;
1150 u8         reserved1:1;
1151 u8         page_code:6;
1152 #else
1153 u8         page_code:6;
1154 u8         reserved1:1;
1155 u8         ps:1;
1156 #endif
1157         u8         page_len;
1158 #ifdef __BIGENDIAN
1159         u8         tst:3;               /* task set type */
1160         u8         reserved3:3;
1161         u8         gltsd:1;     /* global logging target save disable */
1162         u8         rlec:1;              /* report log exception condition */
1163
1164         u8         qalgo_mod:4; /* queue alogorithm modifier */
1165         u8         reserved4:1;
1166         u8         qerr:2;              /* queue error management */
1167         u8         dque:1;              /* disable queuing */
1168
1169         u8         reserved5:1;
1170         u8         rac:1;               /* report a check */
1171         u8         reserved6:2;
1172         u8         swp:1;               /* software write protect */
1173         u8         raerp:1;     /* ready AER permission */
1174         u8         uaaerp:1;    /* unit attenstion AER permission */
1175         u8         eaerp:1;     /* error AER permission */
1176
1177         u8         reserved7:5;
1178         u8         autoload_mod:3;
1179 #else
1180         u8         rlec:1;              /* report log exception condition */
1181         u8         gltsd:1;     /* global logging target save disable */
1182         u8         reserved3:3;
1183         u8         tst:3;               /* task set type */
1184
1185         u8         dque:1;              /* disable queuing */
1186         u8         qerr:2;              /* queue error management */
1187         u8         reserved4:1;
1188         u8         qalgo_mod:4; /* queue alogorithm modifier */
1189
1190         u8         eaerp:1;     /* error AER permission */
1191         u8         uaaerp:1;    /* unit attenstion AER permission */
1192         u8         raerp:1;     /* ready AER permission */
1193         u8         swp:1;               /* software write protect */
1194         u8         reserved6:2;
1195         u8         rac:1;               /* report a check */
1196         u8         reserved5:1;
1197
1198         u8         autoload_mod:3;
1199         u8         reserved7:5;
1200 #endif
1201         u8         rahp_msb;    /* ready AER holdoff period - MSB */
1202         u8         rahp_lsb;    /* ready AER holdoff period - LSB */
1203
1204         u8         busy_timeout_period_msb;
1205         u8         busy_timeout_period_lsb;
1206
1207         u8         ext_selftest_compl_time_msb;
1208         u8         ext_selftest_compl_time_lsb;
1209 };
1210
1211 /*
1212  * SCSI medium types supported mode page
1213  */
1214 struct scsi_mp_medium_types_sup_s{
1215 #ifdef __BIGENDIAN
1216         u8         ps:1;
1217         u8         reserved1:1;
1218         u8         page_code:6;
1219 #else
1220         u8         page_code:6;
1221         u8         reserved1:1;
1222         u8         ps:1;
1223 #endif
1224         u8         page_len;
1225
1226         u8         reserved3[2];
1227         u8         med_type1_sup;       /* medium type one supported */
1228         u8         med_type2_sup;       /* medium type two supported */
1229         u8         med_type3_sup;       /* medium type three supported */
1230         u8         med_type4_sup;       /* medium type four supported */
1231 };
1232
1233 /*
1234  * SCSI informational exception control mode page
1235  */
1236 struct scsi_mp_info_excpt_cntl_s{
1237 #ifdef __BIGENDIAN
1238         u8         ps:1;
1239         u8         reserved1:1;
1240         u8         page_code:6;
1241 #else
1242         u8         page_code:6;
1243         u8         reserved1:1;
1244         u8         ps:1;
1245 #endif
1246         u8         page_len;
1247 #ifdef __BIGENDIAN
1248         u8         perf:1;              /* performance */
1249         u8         reserved3:1;
1250         u8         ebf:1;               /* enable background fucntion */
1251         u8         ewasc:1;     /* enable warning */
1252         u8         dexcpt:1;    /* disable exception control */
1253         u8         test:1;              /* enable test device failure
1254                                          * notification
1255                                          */
1256         u8         reserved4:1;
1257         u8         log_error:1;
1258
1259         u8         reserved5:4;
1260         u8         mrie:4;              /* method of reporting info
1261                                          * exceptions
1262                                          */
1263 #else
1264         u8         log_error:1;
1265         u8         reserved4:1;
1266         u8         test:1;              /* enable test device failure
1267                                          * notification
1268                                          */
1269         u8         dexcpt:1;    /* disable exception control */
1270         u8         ewasc:1;     /* enable warning */
1271         u8         ebf:1;               /* enable background fucntion */
1272         u8         reserved3:1;
1273         u8         perf:1;              /* performance */
1274
1275         u8         mrie:4;              /* method of reporting info
1276                                          * exceptions
1277                                          */
1278         u8         reserved5:4;
1279 #endif
1280         u8         interval_timer_msb;
1281         u8         interval_timer_lsb;
1282
1283         u8         report_count_msb;
1284         u8         report_count_lsb;
1285 };
1286
1287 /*
1288  * Methods of reporting informational exceptions
1289  */
1290 #define SCSI_MP_IEC_NO_REPORT       0x0 /* no reporting of exceptions */
1291 #define SCSI_MP_IEC_AER             0x1 /* async event reporting */
1292 #define SCSI_MP_IEC_UNIT_ATTN       0x2 /* generate unit attenstion */
1293 #define SCSI_MO_IEC_COND_REC_ERR    0x3 /* conditionally generate recovered
1294                                          * error
1295                                          */
1296 #define SCSI_MP_IEC_UNCOND_REC_ERR  0x4 /* unconditionally generate recovered
1297                                          * error
1298                                          */
1299 #define SCSI_MP_IEC_NO_SENSE        0x5 /* generate no sense */
1300 #define SCSI_MP_IEC_ON_REQUEST      0x6 /* only report exceptions on request */
1301
1302 /*
1303  * SCSI flexible disk page
1304  */
1305 struct scsi_mp_flexible_disk_s{
1306 #ifdef __BIGENDIAN
1307         u8         ps:1;
1308         u8         reserved1:1;
1309         u8         page_code:6;
1310 #else
1311         u8         page_code:6;
1312         u8         reserved1:1;
1313         u8         ps:1;
1314 #endif
1315         u8         page_len;
1316
1317         u8         transfer_rate_msb;
1318         u8         transfer_rate_lsb;
1319
1320         u8         num_heads;
1321         u8         num_sectors;
1322
1323         u8         bytes_per_sector_msb;
1324         u8         bytes_per_sector_lsb;
1325
1326         u8         num_cylinders_msb;
1327         u8         num_cylinders_lsb;
1328
1329         u8         sc_wpc_msb;  /* starting cylinder-write
1330                                          * precompensation msb
1331                                          */
1332         u8         sc_wpc_lsb;  /* starting cylinder-write
1333                                          * precompensation lsb
1334                                          */
1335         u8         sc_rwc_msb;  /* starting cylinder-reduced write
1336                                          * current msb
1337                                          */
1338         u8         sc_rwc_lsb;  /* starting cylinder-reduced write
1339                                          * current lsb
1340                                          */
1341
1342         u8         dev_step_rate_msb;
1343         u8         dev_step_rate_lsb;
1344
1345         u8         dev_step_pulse_width;
1346
1347         u8         head_sd_msb; /* head settle delay msb */
1348         u8         head_sd_lsb; /* head settle delay lsb */
1349
1350         u8         motor_on_delay;
1351         u8         motor_off_delay;
1352 #ifdef __BIGENDIAN
1353         u8         trdy:1;              /* true ready bit */
1354         u8         ssn:1;               /* start sector number bit */
1355         u8         mo:1;                /* motor on bit */
1356         u8         reserved3:5;
1357
1358         u8         reserved4:4;
1359         u8         spc:4;               /* step pulse per cylinder */
1360 #else
1361         u8         reserved3:5;
1362         u8         mo:1;                /* motor on bit */
1363         u8         ssn:1;               /* start sector number bit */
1364         u8         trdy:1;              /* true ready bit */
1365
1366         u8         spc:4;               /* step pulse per cylinder */
1367         u8         reserved4:4;
1368 #endif
1369         u8         write_comp;
1370         u8         head_load_delay;
1371         u8         head_unload_delay;
1372 #ifdef __BIGENDIAN
1373         u8         pin34:4;     /* pin34 usage */
1374         u8         pin2:4;              /* pin2 usage */
1375
1376         u8         pin4:4;              /* pin4 usage */
1377         u8         pin1:4;              /* pin1 usage */
1378 #else
1379         u8         pin2:4;              /* pin2 usage */
1380         u8         pin34:4;     /* pin34 usage */
1381
1382         u8         pin1:4;              /* pin1 usage */
1383         u8         pin4:4;              /* pin4 usage */
1384 #endif
1385         u8         med_rot_rate_msb;
1386         u8         med_rot_rate_lsb;
1387
1388         u8         reserved5[2];
1389 };
1390
1391 struct scsi_mode_page_format_data6_s{
1392         struct scsi_mode_param_header6_s mph;   /* mode page header */
1393         struct scsi_mode_param_desc_s desc;     /* block descriptor */
1394         struct scsi_mp_format_device_s format;  /* format device data */
1395 };
1396
1397 struct scsi_mode_page_format_data10_s{
1398         struct scsi_mode_param_header10_s mph;  /* mode page header */
1399         struct scsi_mode_param_desc_s desc;     /* block descriptor */
1400         struct scsi_mp_format_device_s format;  /* format device data */
1401 };
1402
1403 struct scsi_mode_page_rdg_data6_s{
1404         struct scsi_mode_param_header6_s mph;   /* mode page header */
1405         struct scsi_mode_param_desc_s desc;     /* block descriptor */
1406         struct scsi_mp_rigid_device_geometry_s rdg;
1407                                         /* rigid geometry data */
1408 };
1409
1410 struct scsi_mode_page_rdg_data10_s{
1411         struct scsi_mode_param_header10_s mph;  /* mode page header */
1412         struct scsi_mode_param_desc_s desc;     /* block descriptor */
1413         struct scsi_mp_rigid_device_geometry_s rdg;
1414                                         /* rigid geometry data */
1415 };
1416
1417 struct scsi_mode_page_cache6_s{
1418         struct scsi_mode_param_header6_s mph;   /* mode page header */
1419         struct scsi_mode_param_desc_s desc;     /* block descriptor */
1420         struct scsi_mp_caching_s cache; /* cache page data */
1421 };
1422
1423 struct scsi_mode_page_cache10_s{
1424         struct scsi_mode_param_header10_s mph;  /* mode page header */
1425         struct scsi_mode_param_desc_s desc;     /* block descriptor */
1426         struct scsi_mp_caching_s cache; /* cache page data */
1427 };
1428
1429 /* --------------------------------------------------------------
1430  * Format Unit command
1431  * ------------------------------------------------------------
1432  */
1433
1434 /*
1435  * Format Unit CDB
1436  */
1437 struct scsi_format_unit_s{
1438         u8         opcode;
1439 #ifdef __BIGENDIAN
1440         u8         res1:3;
1441         u8         fmtdata:1;   /* if set, data out phase has format
1442                                          * data
1443                                          */
1444         u8         cmplst:1;    /* if set, defect list is complete */
1445         u8         def_list:3;  /* format of defect descriptor is
1446                                          * fmtdata =1
1447                                          */
1448 #else
1449         u8         def_list:3;  /* format of defect descriptor is
1450                                          * fmtdata = 1
1451                                          */
1452         u8         cmplst:1;    /* if set, defect list is complete */
1453         u8         fmtdata:1;   /* if set, data out phase has format
1454                                          * data
1455                                          */
1456         u8         res1:3;
1457 #endif
1458         u8         interleave_msb;
1459         u8         interleave_lsb;
1460         u8         vendor_spec;
1461         u8         control;
1462 };
1463
1464 /*
1465  * h
1466  */
1467 struct scsi_reserve6_s{
1468         u8         opcode;
1469 #ifdef __BIGENDIAN
1470         u8         reserved:3;
1471         u8         obsolete:4;
1472         u8         extent:1;
1473 #else
1474         u8         extent:1;
1475         u8         obsolete:4;
1476         u8         reserved:3;
1477 #endif
1478         u8         reservation_id;
1479         u16        param_list_len;
1480         u8         control;
1481 };
1482
1483 /*
1484  * h
1485  */
1486 struct scsi_release6_s{
1487         u8         opcode;
1488 #ifdef __BIGENDIAN
1489         u8         reserved1:3;
1490         u8         obsolete:4;
1491         u8         extent:1;
1492 #else
1493         u8         extent:1;
1494         u8         obsolete:4;
1495         u8         reserved1:3;
1496 #endif
1497         u8         reservation_id;
1498         u16        reserved2;
1499         u8         control;
1500 };
1501
1502 /*
1503  * h
1504  */
1505 struct scsi_reserve10_s{
1506         u8         opcode;
1507 #ifdef __BIGENDIAN
1508         u8         reserved1:3;
1509         u8         third_party:1;
1510         u8         reserved2:2;
1511         u8         long_id:1;
1512         u8         extent:1;
1513 #else
1514         u8         extent:1;
1515         u8         long_id:1;
1516         u8         reserved2:2;
1517         u8         third_party:1;
1518         u8         reserved1:3;
1519 #endif
1520         u8         reservation_id;
1521         u8         third_pty_dev_id;
1522         u8         reserved3;
1523         u8         reserved4;
1524         u8         reserved5;
1525         u16        param_list_len;
1526         u8         control;
1527 };
1528
1529 struct scsi_release10_s{
1530         u8         opcode;
1531 #ifdef __BIGENDIAN
1532         u8         reserved1:3;
1533         u8         third_party:1;
1534         u8         reserved2:2;
1535         u8         long_id:1;
1536         u8         extent:1;
1537 #else
1538         u8         extent:1;
1539         u8         long_id:1;
1540         u8         reserved2:2;
1541         u8         third_party:1;
1542         u8         reserved1:3;
1543 #endif
1544         u8         reservation_id;
1545         u8         third_pty_dev_id;
1546         u8         reserved3;
1547         u8         reserved4;
1548         u8         reserved5;
1549         u16        param_list_len;
1550         u8         control;
1551 };
1552
1553 struct scsi_verify10_s{
1554         u8         opcode;
1555 #ifdef __BIGENDIAN
1556         u8         lun:3;
1557         u8         dpo:1;
1558         u8         reserved:2;
1559         u8         bytchk:1;
1560         u8         reladdr:1;
1561 #else
1562         u8         reladdr:1;
1563         u8         bytchk:1;
1564         u8         reserved:2;
1565         u8         dpo:1;
1566         u8         lun:3;
1567 #endif
1568         u8         lba0;
1569         u8         lba1;
1570         u8         lba2;
1571         u8         lba3;
1572         u8         reserved1;
1573         u8         verification_len0;
1574         u8         verification_len1;
1575         u8         control_byte;
1576 };
1577
1578 struct scsi_request_sense_s{
1579         u8         opcode;
1580 #ifdef __BIGENDIAN
1581         u8         lun:3;
1582         u8         reserved:5;
1583 #else
1584         u8         reserved:5;
1585         u8         lun:3;
1586 #endif
1587         u8         reserved0;
1588         u8         reserved1;
1589         u8         alloc_len;
1590         u8         control_byte;
1591 };
1592
1593 /* ------------------------------------------------------------
1594  * SCSI status byte values
1595  * ------------------------------------------------------------
1596  */
1597 #define SCSI_STATUS_GOOD                   0x00
1598 #define SCSI_STATUS_CHECK_CONDITION        0x02
1599 #define SCSI_STATUS_CONDITION_MET          0x04
1600 #define SCSI_STATUS_BUSY                   0x08
1601 #define SCSI_STATUS_INTERMEDIATE           0x10
1602 #define SCSI_STATUS_ICM                    0x14 /* intermediate condition met */
1603 #define SCSI_STATUS_RESERVATION_CONFLICT   0x18
1604 #define SCSI_STATUS_COMMAND_TERMINATED     0x22
1605 #define SCSI_STATUS_QUEUE_FULL             0x28
1606 #define SCSI_STATUS_ACA_ACTIVE             0x30
1607
1608 #define SCSI_MAX_ALLOC_LEN              0xFF    /* maximum allocarion length
1609                                                  * in CDBs
1610                                                  */
1611
1612 #define SCSI_OP_WRITE_VERIFY10      0x2E
1613 #define SCSI_OP_WRITE_VERIFY12      0xAE
1614 #define SCSI_OP_UNDEF               0xFF
1615
1616 /*
1617  * SCSI WRITE-VERIFY(10) command
1618  */
1619 struct scsi_write_verify10_s{
1620         u8         opcode;
1621 #ifdef __BIGENDIAN
1622         u8         reserved1:3;
1623         u8         dpo:1;               /* Disable Page Out */
1624         u8         reserved2:1;
1625         u8         ebp:1;               /* erse by-pass */
1626         u8         bytchk:1;    /* byte check */
1627         u8         rel_adr:1;   /* relative address */
1628 #else
1629         u8         rel_adr:1;   /* relative address */
1630         u8         bytchk:1;    /* byte check */
1631         u8         ebp:1;               /* erse by-pass */
1632         u8         reserved2:1;
1633         u8         dpo:1;               /* Disable Page Out */
1634         u8         reserved1:3;
1635 #endif
1636         u8         lba0;                /* logical block address - MSB */
1637         u8         lba1;
1638         u8         lba2;
1639         u8         lba3;                /* LSB */
1640         u8         reserved3;
1641         u8         xfer_length0;        /* transfer length in blocks - MSB */
1642         u8         xfer_length1;        /* LSB */
1643         u8         control;
1644 };
1645
1646 #pragma pack()
1647
1648 #endif /* __SCSI_H__ */