|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * File: scsi.h
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 9/90
30: *
31: * Definitions of the SCSI-1 Standard
32: */
33:
34: #ifndef _SCSI_SCSI_H_
35: #define _SCSI_SCSI_H_
36:
37: #include <nscsi.h>
38: #include <scsi/scsi_endian.h>
39:
40: /*
41: * Bus phases
42: */
43:
44: #define SCSI_IO 0x01 /* Input/Output */
45: #define SCSI_CD 0x02 /* Command/Data */
46: #define SCSI_MSG 0x04 /* Message */
47:
48: #define SCSI_PHASE_MASK 0x07
49: #define SCSI_PHASE(x) ((x)&SCSI_PHASE_MASK)
50:
51: #define SCSI_PHASE_DATAO 0x00 /* 0 */
52: #define SCSI_PHASE_DATAI SCSI_IO /* 1 */
53: #define SCSI_PHASE_CMD SCSI_CD /* 2 */
54: #define SCSI_PHASE_STATUS (SCSI_CD|SCSI_IO) /* 3 */
55: /* 4..5 ANSI reserved */
56: #define SCSI_PHASE_MSG_OUT (SCSI_MSG|SCSI_CD) /* 6 */
57: #define SCSI_PHASE_MSG_IN (SCSI_MSG|SCSI_CD|SCSI_IO) /* 7 */
58:
59: /*
60: * Single byte messages
61: *
62: * originator: I-nitiator T-arget
63: * T-support: M-andatory O-ptional
64: */
65:
66: #define SCSI_COMMAND_COMPLETE 0x00 /* M T */
67: #define SCSI_EXTENDED_MESSAGE 0x01 /* IT */
68: #define SCSI_SAVE_DATA_POINTER 0x02 /* O T */
69: #define SCSI_RESTORE_POINTERS 0x03 /* O T */
70: #define SCSI_DISCONNECT 0x04 /* O T */
71: #define SCSI_I_DETECTED_ERROR 0x05 /* M I */
72: #define SCSI_ABORT 0x06 /* M I */
73: #define SCSI_MESSAGE_REJECT 0x07 /* M IT */
74: #define SCSI_NOP 0x08 /* M I */
75: #define SCSI_MSG_PARITY_ERROR 0x09 /* M I */
76: #define SCSI_LNKD_CMD_COMPLETE 0x0a /* O T */
77: #define SCSI_LNKD_CMD_COMPLETE_F 0x0b /* O T */
78: #define SCSI_BUS_DEVICE_RESET 0x0c /* M I */
79: /* 0x0d..0x11 scsi2 */
80: /* 0x12..0x1f reserved */
81: #define SCSI_IDENTIFY 0x80 /* IT */
82: # define SCSI_IFY_ENABLE_DISCONNECT 0x40 /* I */
83: # define SCSI_IFY_LUNTAR 0x20 /* IT */
84: # define SCSI_IFY_LUN_MASK 0x07 /* IT */
85:
86:
87: /* Message codes 0x30..0x7f are reserved */
88:
89: /*
90: * Extended messages, codes and formats
91: */
92:
93: #define SCSI_MODIFY_DATA_PTR 0x00 /* T */
94: typedef struct {
95: unsigned char xtn_msg_tag; /* const 0x01 */
96: unsigned char xtn_msg_len; /* const 0x05 */
97: unsigned char xtn_msg_code; /* const 0x00 */
98: unsigned char xtn_msg_arg_1000; /* MSB, signed 2cmpl */
99: unsigned char xtn_msg_arg_0200;
100: unsigned char xtn_msg_arg_0030;
101: unsigned char xtn_msg_arg_0004; /* LSB */
102: } scsi_mod_ptr_t;
103:
104: #define SCSI_SYNC_XFER_REQUEST 0x01 /* IT */
105: typedef struct {
106: unsigned char xtn_msg_tag; /* const 0x01 */
107: unsigned char xtn_msg_len; /* const 0x03 */
108: unsigned char xtn_msg_code; /* const 0x01 */
109: unsigned char xtn_msg_xfer_period; /* times 4nsecs */
110: unsigned char xtn_msg_xfer_offset; /* pending ack window */
111: #define SCSI_SYNCH_XFER_OFFANY 0xff /* T unlimited */
112: } scsi_synch_xfer_req_t;
113:
114: #define SCSI_XTN_IDENTIFY 0x02 /* IT -2 */
115: typedef struct {
116: unsigned char xtn_msg_tag; /* const 0x01 */
117: unsigned char xtn_msg_len; /* const 0x02 */
118: unsigned char xtn_msg_code; /* const 0x02 */
119: unsigned char xtn_msg_sublun;
120: } scsi_xtn_identify_t;
121:
122: /* 0x03..0x7f reserved */
123:
124: #define SCSI_XTN_VENDOR_UQE 0x80 /* vendor unique bit */
125: typedef struct {
126: unsigned char xtn_msg_tag; /* const 0x01 */
127: unsigned char xtn_msg_len; /* args' len+1 (0-->256)*/
128: unsigned char xtn_msg_code; /* const 0x80..0xff */
129: unsigned char xtn_msg_args[1]; /* 0..255 bytes */
130: } scsi_xtn_vedor_unique_t;
131:
132:
133: /*
134: * Commands, generic structures
135: */
136:
137: /* SIX byte commands */
138: typedef struct {
139: unsigned char scsi_cmd_code; /* group(7..5) and command(4..1) */
140: #define SCSI_CODE_GROUP 0xe0
141: #define SCSI_CODE_CMD 0x1f
142: unsigned char scsi_cmd_lun_and_lba1; /* lun(7..5) and block# msb[20..16] */
143: #define SCSI_LUN_MASK 0xe0
144: #define SCSI_LBA_MASK 0x1f
145: #define SCSI_LUN_SHIFT 5
146: unsigned char scsi_cmd_lba2; /* block#[15.. 8] */
147: unsigned char scsi_cmd_lba3; /* block#[ 7.. 0] */
148: unsigned char scsi_cmd_xfer_len; /* if required */
149: unsigned char scsi_cmd_ctrl_byte; /* contains: */
150: #define SCSI_CTRL_VUQ 0xc0 /* vendor unique bits */
151: #define SCSI_CTRL_RESVD 0x3c /* reserved, mbz */
152: #define SCSI_CTRL_FLAG 0x02 /* send a complete_with_flag at end */
153: #define SCSI_CTRL_LINK 0x01 /* link this command with next */
154: } scsi_command_group_0;
155:
156: /* TEN byte commands */
157: typedef struct {
158: unsigned char scsi_cmd_code; /* group(7..5) and command(4..1) */
159: unsigned char scsi_cmd_lun_and_relbit;/* lun(7..5) and RelAdr(0) */
160: #define SCSI_RELADR 0x01
161: unsigned char scsi_cmd_lba1; /* block#[31..24] */
162: unsigned char scsi_cmd_lba2; /* block#[23..16] */
163: unsigned char scsi_cmd_lba3; /* block#[15.. 8] */
164: unsigned char scsi_cmd_lba4; /* block#[ 7.. 0] */
165: unsigned char scsi_cmd_xxx; /* reserved, mbz */
166: unsigned char scsi_cmd_xfer_len_1; /* if required */
167: unsigned char scsi_cmd_xfer_len_2; /* if required */
168: unsigned char scsi_cmd_ctrl_byte; /* see above */
169: } scsi_command_group_1,
170: scsi_command_group_2;
171:
172: /* TWELVE byte commands */
173: typedef struct {
174: unsigned char scsi_cmd_code; /* group(7..5) and command(4..1) */
175: unsigned char scsi_cmd_lun_and_relbit;/* lun(7..5) and RelAdr(0) */
176: unsigned char scsi_cmd_lba1; /* block#[31..24] */
177: unsigned char scsi_cmd_lba2; /* block#[23..16] */
178: unsigned char scsi_cmd_lba3; /* block#[15.. 8] */
179: unsigned char scsi_cmd_lba4; /* block#[ 7.. 0] */
180: unsigned char scsi_cmd_xfer_len_1; /* if required */
181: unsigned char scsi_cmd_xfer_len_2; /* if required */
182: unsigned char scsi_cmd_xfer_len_3; /* if required */
183: unsigned char scsi_cmd_xfer_len_4; /* if required */
184: unsigned char scsi_cmd_xxx1; /* reserved, mbz */
185: unsigned char scsi_cmd_ctrl_byte; /* see above */
186: } scsi_command_group_5;
187:
188:
189: /*
190: * Commands, codes and aliases
191: */
192:
193: /* GROUP 0 */
194: #define SCSI_CMD_TEST_UNIT_READY 0x00 /* O all 2M all */
195: #define scsi_cmd_test_unit_ready_t scsi_command_group_0
196:
197: #define SCSI_CMD_REZERO_UNIT 0x01 /* O disk worm rom */
198: #define SCSI_CMD_REWIND 0x01 /* M tape */
199: #define scsi_cmd_rewind_t scsi_command_group_0
200: #define scsi_cmd_rezero_t scsi_command_group_0
201: # define SCSI_CMD_REW_IMMED 0x01
202:
203: /* 0x02 vendor unique */
204:
205: #define SCSI_CMD_REQUEST_SENSE 0x03 /* M all */
206: #define scsi_cmd_request_sense_t scsi_command_group_0
207: # define scsi_cmd_allocation_length scsi_cmd_xfer_len
208:
209: #define SCSI_CMD_FORMAT_UNIT 0x04 /* M disk O prin */
210: #define scsi_cmd_format_t scsi_command_group_0
211: # define SCSI_CMD_FMT_FMTDATA 0x10
212: # define SCSI_CMD_FMT_CMPLIST 0x08
213: # define SCSI_CMD_FMT_LIST_TYPE 0x07
214: # define scsi_cmd_intleave1 scsi_cmd_lba3
215: # define scsi_cmd_intleave2 scsi_cmd_xfer_len
216:
217: #define SCSI_CMD_READ_BLOCK_LIMITS 0x05 /* E tape */
218: #define scsi_cmd_block_limits_t scsi_command_group_0
219:
220: /* 0x06 vendor unique */
221:
222: #define SCSI_CMD_REASSIGN_BLOCKS 0x07 /* O disk worm */
223: #define scsi_cmd_reassign_blocks_t scsi_command_group_0
224:
225: #define SCSI_CMD_READ 0x08 /* M disk tape O worm rom */
226: #define SCSI_CMD_RECEIVE 0x08 /* O proc */
227: #define SCSI_CMD_GET_MESSAGE 0x08 /* M comm */
228: #define scsi_cmd_read_t scsi_command_group_0
229: # define SCSI_CMD_TP_FIXED 0x01 /* tape */
230: # define scsi_cmd_tp_len1 scsi_cmd_lba2
231: # define scsi_cmd_tp_len2 scsi_cmd_lba3
232: # define scsi_cmd_tp_len3 scsi_cmd_xfer_len
233: /* largest addressable blockno */
234: #define SCSI_CMD_READ_MAX_LBA ((1 << 21) - 1)
235:
236: /* 0x09 vendor unique */
237:
238: #define SCSI_CMD_WRITE 0x0a /* M disk tape O worm */
239: #define SCSI_CMD_PRINT 0x0a /* M prin */
240: #define SCSI_CMD_SEND 0x0a /* M proc */
241: #define SCSI_CMD_SEND_MESSAGE 0x0a /* M comm */
242: #define scsi_cmd_write_t scsi_command_group_0
243:
244: #define SCSI_CMD_SEEK 0x0b /* O disk worm rom */
245: #define SCSI_CMD_TRACK_SELECT 0x0b /* O tape */
246: #define SCSI_CMD_SLEW_AND_PRINT 0x0b /* O prin */
247: #define scsi_cmd_seek_t scsi_command_group_0
248: # define SCSI_CMD_SLW_CHANNEL 0x01
249: # define scsi_cmd_tp_trackno scsi_cmd_xfer_len
250: # define scsi_cmd_slew_value scsi_cmd_lba2
251:
252: /* 0x0c..0x0e vendor unique */
253:
254: #define SCSI_CMD_READ_REVERSE 0x0f /* O tape */
255: #define scsi_cmd_rev_read_t scsi_command_group_0
256:
257: #define SCSI_CMD_WRITE_FILEMARKS 0x10 /* M tape */
258: #define SCSI_CMD_FLUSH_BUFFER 0x10 /* M prin */
259: #define scsi_cmd_write_fil_t scsi_command_group_0
260:
261: #define SCSI_CMD_SPACE 0x11 /* O tape */
262: #define scsi_cmd_space_t scsi_command_group_0
263: # define SCSI_CMD_SP_BLOCKS 0x00
264: # define SCSI_CMD_SP_FIL 0x01
265: # define SCSI_CMD_SP_SEQ_FIL 0x02
266: # define SCSI_CMD_SP_EOT 0x03
267:
268: #define SCSI_CMD_INQUIRY 0x12 /* E all (2M all) */
269: #define scsi_cmd_inquiry_t scsi_command_group_0
270: # define SCSI_CMD_INQ_EVPD 0x01 /* 2 */
271: # define scsi_cmd_page_code scsi_cmd_lba2 /* 2 */
272:
273: #define SCSI_CMD_VERIFY_0 0x13 /* O tape */
274: #define scsi_cmd_verify_t scsi_command_group_0
275: # define SCSI_CMD_VFY_BYTCMP 0x02
276:
277: #define SCSI_CMD_RECOVER_BUFFERED_DATA 0x14 /* O tape prin */
278: #define scsi_cmd_recover_buffer_t scsi_command_group_0
279:
280: #define SCSI_CMD_MODE_SELECT 0x15 /* O disk tape prin worm rom */
281: # define SCSI_CMD_MSL_PF 0x10
282: # define SCSI_CMD_MSL_SP 0x01
283: #define scsi_cmd_mode_select_t scsi_command_group_0
284:
285: #define SCSI_CMD_RESERVE 0x16 /* O disk tape prin worm rom */
286: #define scsi_cmd_reserve_t scsi_command_group_0
287: # define SCSI_CMD_RES_3RDPTY 0x10
288: # define SCSI_CMD_RES_3RDPTY_DEV 0x0e
289: # define SCSI_CMD_RES_EXTENT 0x01
290: # define scsi_cmd_reserve_id scsi_cmd_lba2
291: # define scsi_cmd_extent_llen1 scsi_cmd_lba3
292: # define scsi_cmd_extent_llen2 scsi_cmd_xfer_len
293:
294: #define SCSI_CMD_RELEASE 0x17 /* O disk tape prin worm rom */
295: #define scsi_cmd_release_t scsi_command_group_0
296:
297: #define SCSI_CMD_COPY 0x18 /* O all */
298: #define scsi_cmd_copy_t scsi_command_group_0
299: # define SCSI_CMD_CPY_PAD 0x01 /* 2 */
300: # define scsi_cmd_paraml_len0 scsi_cmd_lba2
301: # define scsi_cmd_paraml_len1 scsi_cmd_lba3
302: # define scsi_cmd_paraml_len2 scsi_cmd_xfer_len
303:
304: #define SCSI_CMD_ERASE 0x19 /* O tape */
305: #define scsi_cmd_erase_t scsi_command_group_0
306: # define SCSI_CMD_ER_LONG 0x01
307:
308: #define SCSI_CMD_MODE_SENSE 0x1a /* O disk tape prin worm rom */
309: #define scsi_cmd_mode_sense_t scsi_command_group_0
310: # define scsi_cmd_ms_pagecode scsi_cmd_lba2
311:
312: #define SCSI_CMD_START_STOP_UNIT 0x1b /* O disk prin worm rom */
313: #define SCSI_CMD_LOAD_UNLOAD 0x1b /* O tape */
314: #define scsi_cmd_start_t scsi_command_group_0
315: # define SCSI_CMD_SS_IMMED 0x01
316: # define scsi_cmd_ss_flags scsi_cmd_xfer_len
317: # define SCSI_CMD_SS_START 0x01
318: # define SCSI_CMD_SS_RETEN 0x02
319: # define SCSI_CMD_SS_RETAIN 0x01
320: # define SCSI_CMD_SS_EJECT 0x02
321:
322: #define SCSI_CMD_RECEIVE_DIAG_RESULTS 0x1c /* O all */
323: #define scsi_cmd_receive_diag_t scsi_command_group_0
324: # define scsi_cmd_allocation_length1 scsi_cmd_lba3
325: # define scsi_cmd_allocation_length2 scsi_cmd_xfer_len
326:
327: #define SCSI_CMD_SEND_DIAGNOSTICS 0x1d /* O all */
328: #define scsi_cmd_send_diag_t scsi_command_group_0
329: # define SCSI_CMD_DIAG_SELFTEST 0x04
330: # define SCSI_CMD_DIAG_DEVOFFL 0x02
331: # define SCSI_CMD_DIAG_UNITOFFL 0x01
332:
333: #define SCSI_CMD_PREVENT_ALLOW_REMOVAL 0x1e /* O disk tape worm rom */
334: #define scsi_cmd_medium_removal_t scsi_command_group_0
335: # define scsi_cmd_pa_prevent scsi_cmd_xfer_len /* 0x1 */
336:
337: /* 0x1f reserved */
338:
339: /* GROUP 1 */
340: /* 0x20..0x24 vendor unique */
341:
342: #define SCSI_CMD_READ_CAPACITY 0x25 /* E disk worm rom */
343: #define scsi_cmd_read_capacity_t scsi_command_group_1
344: # define scsi_cmd_rcap_flags scsi_cmd_xfer_len_2
345: # define SCSI_CMD_RCAP_PMI 0x01
346:
347: /* 0x26..0x27 vendor unique */
348:
349: #define SCSI_CMD_LONG_READ 0x28 /* E disk M worm rom */
350: #define scsi_cmd_long_read_t scsi_command_group_1
351:
352: /* 0x29 vendor unique */
353:
354: #define SCSI_CMD_LONG_WRITE 0x2a /* E disk M worm */
355: #define scsi_cmd_long_write_t scsi_command_group_1
356:
357: #define SCSI_CMD_LONG_SEEK 0x2b /* O disk worm rom */
358: #define scsi_cmd_long_seek_t scsi_command_group_1
359:
360: /* 0x2c..0x2d vendor unique */
361:
362: #define SCSI_CMD_WRITE_AND_VERIFY 0x2e /* O disk worm */
363: #define scsi_cmd_write_vfy_t scsi_command_group_1
364: # define SCSI_CMD_VFY_BYTCHK 0x02
365:
366: #define SCSI_CMD_VERIFY_1 0x2f /* O disk worm rom */
367: #define scsi_cmd_verify_long_t scsi_command_group_1
368: # define SCSI_CMD_VFY_BLKVFY 0x04
369:
370: #define SCSI_CMD_SEARCH_HIGH 0x30 /* O disk worm rom */
371: #define scsi_cmd_search_t scsi_command_group_1
372: # define SCSI_CMD_SRCH_INVERT 0x10
373: # define SCSI_CMD_SRCH_SPNDAT 0x02
374:
375: #define SCSI_CMD_SEARCH_EQUAL 0x31 /* O disk worm rom */
376: #define SCSI_CMD_SEARCH_LOW 0x32 /* O disk worm rom */
377:
378: #define SCSI_CMD_SET_LIMITS 0x33 /* O disk worm rom */
379: #define scsi_cmd_set_limits_t scsi_command_group_1
380: # define SCSI_CMD_SL_RDINH 0x02
381: # define SCSI_CMD_SL_WRINH 0x01
382:
383: /* 0x34..0x38 reserved */
384:
385: #define SCSI_CMD_COMPARE 0x39 /* O all */
386: #define scsi_cmd_compare_t scsi_command_group_1
387: # define scsi_cmd_1_paraml1 scsi_cmd_lba2
388: # define scsi_cmd_1_paraml2 scsi_cmd_lba3
389: # define scsi_cmd_1_paraml3 scsi_cmd_lba4
390:
391: #define SCSI_CMD_COPY_AND_VERIFY 0x3a /* O all */
392: #define scsi_cmd_copy_vfy_t scsi_command_group_1
393: # define SCSI_CMD_CPY_BYTCHK 0x02
394:
395: /* 0x3b..0x3f reserved */
396:
397: /* GROUP 2 */
398: /* 0x40..0x5f reserved */
399:
400: /* GROUP 3 */
401: /* 0x60..0x7f reserved */
402:
403: /* GROUP 4 */
404: /* 0x80..0x9f reserved */
405:
406: /* GROUP 5 */
407: /* 0xa0..0xaf vendor unique */
408: /* 0xb0..0xbf reserved */
409:
410: /* GROUP 6 */
411: /* 0xc0..0xdf vendor unique */
412:
413: /* GROUP 7 */
414: /* 0xe0..0xff vendor unique */
415:
416:
417: /*
418: * Command-specific results and definitions
419: */
420:
421: /* inquiry data */
422: typedef struct {
423: unsigned char periph_type;
424: #define SCSI_DISK 0x00
425: #define SCSI_TAPE 0x01
426: #define SCSI_PRINTER 0x02
427: #define SCSI_CPU 0x03
428: #define SCSI_WORM 0x04
429: #define SCSI_CDROM 0x05
430:
431: BITFIELD_2( unsigned char,
432: device_type : 7,
433: rmb : 1);
434: BITFIELD_3( unsigned char,
435: ansi : 3,
436: ecma : 3,
437: iso : 2);
438: unsigned char reserved;
439: unsigned char length;
440: unsigned char param[1];
441: } scsi_inquiry_data_t;
442:
443: #define SCSI_INQ_STD_DATA -1
444:
445: /* request sense data */
446: #define SCSI_SNS_NOSENSE 0x0
447: #define SCSI_SNS_RECOVERED 0x1
448: #define SCSI_SNS_NOTREADY 0x2
449: #define SCSI_SNS_MEDIUM_ERR 0x3
450: #define SCSI_SNS_HW_ERR 0x4
451: #define SCSI_SNS_ILLEGAL_REQ 0x5
452: #define SCSI_SNS_UNIT_ATN 0x6
453: #define SCSI_SNS_PROTECT 0x7
454: #define SCSI_SNS_BLANK_CHK 0x8
455: #define SCSI_SNS_VUQE 0x9
456: #define SCSI_SNS_COPY_ABRT 0xa
457: #define SCSI_SNS_ABORTED 0xb
458: #define SCSI_SNS_EQUAL 0xc
459: #define SCSI_SNS_VOLUME_OVFL 0xd
460: #define SCSI_SNS_MISCOMPARE 0xe
461: #define SCSI_SNS_RESERVED 0xf
462:
463: typedef struct {
464: BITFIELD_3( unsigned char,
465: error_code : 4,
466: error_class : 3,
467: addr_valid : 1);
468: # define SCSI_SNS_XTENDED_SENSE_DATA 0x7 /* e.g. error_class=7 */
469: union {
470: struct {
471: BITFIELD_2(unsigned char,
472: lba_msb : 5,
473: vuqe : 3);
474: unsigned char lba;
475: unsigned char lba_lsb;
476: } non_xtnded;
477: struct {
478: unsigned char segment_number;
479: BITFIELD_5(unsigned char,
480: sense_key : 4,
481: res : 1,
482: ili : 1,
483: eom : 1,
484: fm : 1);
485: unsigned char info0;
486: unsigned char info1;
487: unsigned char info2;
488: unsigned char info3;
489: unsigned char add_len;
490: unsigned char add_bytes[1];/* VARSIZE */
491: } xtended;
492: } u;
493: } scsi_sense_data_t;
494:
495:
496: /* mode select params */
497: typedef struct {
498: unsigned char reserved1;
499: unsigned char medium_type;
500: BITFIELD_3(unsigned char,
501: speed:4, /* special for tapes, reserved in SCSI-1 */
502: buffer_mode:3,
503: reserved2:1);
504: unsigned char desc_len;
505: struct scsi_mode_parm_blockdesc {
506: unsigned char density_code;
507: unsigned char nblocks1;
508: unsigned char nblocks2;
509: unsigned char nblocks3;
510: unsigned char reserved;
511: unsigned char reclen1;
512: unsigned char reclen2;
513: unsigned char reclen3;
514: } descs[1]; /* VARSIZE, really */
515: } scsi_mode_select_param_t;
516:
517: /* mode sense data (TAPE) */
518: typedef struct {
519: unsigned char data_len;
520: unsigned char medium_type;
521: BITFIELD_3(unsigned char,
522: speed : 4,
523: buffered_mode : 3,
524: wp : 1);
525: unsigned char bdesc_len;
526: struct {
527: unsigned char density_code;
528: unsigned char no_blks_msb;
529: unsigned char no_blks;
530: unsigned char no_blks_lsb;
531: unsigned char reserved;
532: unsigned char blen_msb;
533: unsigned char blen;
534: unsigned char blen_lsb;
535: } bdesc[1]; /* VARSIZE */
536: /* vuqe data might follow */
537: } scsi_mode_sense_data_t;
538:
539: /* read capacity data */
540: typedef struct {
541: unsigned char lba1;
542: unsigned char lba2;
543: unsigned char lba3;
544: unsigned char lba4;
545: unsigned char blen1;
546: unsigned char blen2;
547: unsigned char blen3;
548: unsigned char blen4;
549: } scsi_rcap_data_t;
550:
551: /* defect list(s) */
552: typedef struct {
553: unsigned char res1;
554: unsigned char res2;
555: unsigned char list_len_msb;
556: unsigned char list_len_lsb;
557: struct {
558: unsigned char blockno_msb;
559: unsigned char blockno_sb1;
560: unsigned char blockno_sb2;
561: unsigned char blockno_lsb;
562: } defects[1]; /* VARSIZE */
563: } scsi_Ldefect_data_t;
564:
565: /* block limits (tape) */
566: typedef struct {
567: unsigned char res1;
568: unsigned char maxlen_msb;
569: unsigned char maxlen_sb;
570: unsigned char maxlen_lsb;
571: unsigned char minlen_msb;
572: unsigned char minlen_lsb;
573: } scsi_blimits_data_t;
574:
575: /*
576: * Status byte (a-la scsi1)
577: */
578:
579: typedef union {
580: struct {
581: BITFIELD_4( unsigned char,
582: scsi_status_vendor_uqe1:1,
583: scsi_status_code:4,
584: scsi_status_vendor_uqe:2,
585: scsi_status_reserved:1);
586: # define SCSI_ST_GOOD 0x00 /* scsi_status_code values */
587: # define SCSI_ST_CHECK_CONDITION 0x01
588: # define SCSI_ST_CONDITION_MET 0x02
589: # define SCSI_ST_BUSY 0x04
590: # define SCSI_ST_INT_GOOD 0x08
591: # define SCSI_ST_INT_MET 0x0a
592: # define SCSI_ST_RES_CONFLICT 0x0c
593: /* anything else is reserved */
594: } st;
595: unsigned char bits;
596: } scsi_status_byte_t;
597:
598:
599: #endif _SCSI_SCSI_H_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.