1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_SCSI_IMPL_COMMANDS_H 28 #define _SYS_SCSI_IMPL_COMMANDS_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* 37 * Implementation dependent command definitions. 38 * This file is included by <sys/scsi/generic/commands.h> 39 */ 40 41 /* 42 * Implementation dependent view of a SCSI command descriptor block 43 */ 44 45 /* 46 * Standard SCSI control blocks definitions. 47 * 48 * These go in or out over the SCSI bus. 49 * 50 * The first 8 bits of the command block are the same for all 51 * defined command groups. The first byte is an operation which consists 52 * of a command code component and a group code component. 53 * 54 * The group code determines the length of the rest of the command. 55 * Group 0 commands are 6 bytes, Group 1 and 2 are 10 bytes, Group 4 56 * are 16 bytes, and Group 5 are 12 bytes. Groups 3 is Reserved. 57 * Groups 6 and 7 are Vendor Unique. 58 * 59 */ 60 #define CDB_SIZE CDB_GROUP5 /* deprecated, do not use */ 61 #define SCSI_CDB_SIZE CDB_GROUP4 /* sizeof (union scsi_cdb) */ 62 63 union scsi_cdb { /* scsi command description block */ 64 struct { 65 uchar_t cmd; /* cmd code (byte 0) */ 66 #if defined(_BIT_FIELDS_LTOH) 67 uchar_t tag :5; /* rest of byte 1 */ 68 uchar_t lun :3; /* lun (byte 1) (reserved in SCSI-3) */ 69 #elif defined(_BIT_FIELDS_HTOL) 70 uchar_t lun :3, /* lun (byte 1) (reserved in SCSI-3) */ 71 tag :5; /* rest of byte 1 */ 72 #else 73 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 74 #endif /* _BIT_FIELDS_LTOH */ 75 union { 76 77 uchar_t scsi[SCSI_CDB_SIZE-2]; 78 /* 79 * G R O U P 0 F O R M A T (6 bytes) 80 */ 81 #define scc_cmd cdb_un.cmd 82 #define scc_lun cdb_un.lun 83 #define g0_addr2 cdb_un.tag 84 #define g0_addr1 cdb_un.sg.g0.addr1 85 #define g0_addr0 cdb_un.sg.g0.addr0 86 #define g0_count0 cdb_un.sg.g0.count0 87 #define g0_vu_1 cdb_un.sg.g0.vu_57 88 #define g0_vu_0 cdb_un.sg.g0.vu_56 89 #define g0_naca cdb_un.sg.g0.naca 90 #define g0_flag cdb_un.sg.g0.flag 91 #define g0_link cdb_un.sg.g0.link 92 /* 93 * defines for SCSI tape cdb. 94 */ 95 #define t_code cdb_un.tag 96 #define high_count cdb_un.sg.g0.addr1 97 #define mid_count cdb_un.sg.g0.addr0 98 #define low_count cdb_un.sg.g0.count0 99 struct scsi_g0 { 100 uchar_t addr1; /* middle part of address */ 101 uchar_t addr0; /* low part of address */ 102 uchar_t count0; /* usually block count */ 103 #if defined(_BIT_FIELDS_LTOH) 104 uchar_t link :1; /* another command follows */ 105 uchar_t flag :1; /* interrupt when done */ 106 uchar_t naca :1; /* normal ACA */ 107 uchar_t rsvd :3; /* reserved */ 108 uchar_t vu_56 :1; /* vendor unique (byte 5 bit6) */ 109 uchar_t vu_57 :1; /* vendor unique (byte 5 bit7) */ 110 #elif defined(_BIT_FIELDS_HTOL) 111 uchar_t vu_57 :1; /* vendor unique (byte 5 bit 7) */ 112 uchar_t vu_56 :1; /* vendor unique (byte 5 bit 6) */ 113 uchar_t rsvd :3; /* reserved */ 114 uchar_t naca :1; /* normal ACA */ 115 uchar_t flag :1; /* interrupt when done */ 116 uchar_t link :1; /* another command follows */ 117 #else 118 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 119 #endif /* _BIT_FIELDS_LTOH */ 120 } g0; 121 122 123 /* 124 * G R O U P 1, 2 F O R M A T (10 byte) 125 */ 126 #define g1_reladdr cdb_un.tag 127 #define g1_rsvd0 cdb_un.sg.g1.rsvd1 128 #define g1_addr3 cdb_un.sg.g1.addr3 /* msb */ 129 #define g1_addr2 cdb_un.sg.g1.addr2 130 #define g1_addr1 cdb_un.sg.g1.addr1 131 #define g1_addr0 cdb_un.sg.g1.addr0 /* lsb */ 132 #define g1_count1 cdb_un.sg.g1.count1 /* msb */ 133 #define g1_count0 cdb_un.sg.g1.count0 /* lsb */ 134 #define g1_vu_1 cdb_un.sg.g1.vu_97 135 #define g1_vu_0 cdb_un.sg.g1.vu_96 136 #define g1_naca cdb_un.sg.g1.naca 137 #define g1_flag cdb_un.sg.g1.flag 138 #define g1_link cdb_un.sg.g1.link 139 struct scsi_g1 { 140 uchar_t addr3; /* most sig. byte of address */ 141 uchar_t addr2; 142 uchar_t addr1; 143 uchar_t addr0; 144 uchar_t rsvd1; /* reserved (byte 6) */ 145 uchar_t count1; /* transfer length (msb) */ 146 uchar_t count0; /* transfer length (lsb) */ 147 #if defined(_BIT_FIELDS_LTOH) 148 uchar_t link :1; /* another command follows */ 149 uchar_t flag :1; /* interrupt when done */ 150 uchar_t naca :1; /* normal ACA */ 151 uchar_t rsvd0 :3; /* reserved */ 152 uchar_t vu_96 :1; /* vendor unique (byte 9 bit6) */ 153 uchar_t vu_97 :1; /* vendor unique (byte 9 bit7) */ 154 #elif defined(_BIT_FIELDS_HTOL) 155 uchar_t vu_97 :1; /* vendor unique (byte 9 bit 7) */ 156 uchar_t vu_96 :1; /* vendor unique (byte 9 bit 6) */ 157 uchar_t rsvd0 :3; /* reserved */ 158 uchar_t naca :1; /* normal ACA */ 159 uchar_t flag :1; /* interrupt when done */ 160 uchar_t link :1; /* another command follows */ 161 #else 162 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 163 #endif /* _BIT_FIELDS_LTOH */ 164 } g1; 165 166 /* 167 * G R O U P 4 F O R M A T (16 byte) 168 */ 169 #define g4_reladdr cdb_un.tag 170 #define g4_addr3 cdb_un.sg.g4.addr3 /* msb */ 171 #define g4_addr2 cdb_un.sg.g4.addr2 172 #define g4_addr1 cdb_un.sg.g4.addr1 173 #define g4_addr0 cdb_un.sg.g4.addr0 /* lsb */ 174 #define g4_addtl_cdb_data3 cdb_un.sg.g4.addtl_cdb_data3 175 #define g4_addtl_cdb_data2 cdb_un.sg.g4.addtl_cdb_data2 176 #define g4_addtl_cdb_data1 cdb_un.sg.g4.addtl_cdb_data1 177 #define g4_addtl_cdb_data0 cdb_un.sg.g4.addtl_cdb_data0 178 #define g4_count3 cdb_un.sg.g4.count3 /* msb */ 179 #define g4_count2 cdb_un.sg.g4.count2 180 #define g4_count1 cdb_un.sg.g4.count1 181 #define g4_count0 cdb_un.sg.g4.count0 /* lsb */ 182 #define g4_rsvd0 cdb_un.sg.g4.rsvd1 183 #define g4_vu_1 cdb_un.sg.g4.vu_157 184 #define g4_vu_0 cdb_un.sg.g4.vu_156 185 #define g4_naca cdb_un.sg.g4.naca 186 #define g4_flag cdb_un.sg.g4.flag 187 #define g4_link cdb_un.sg.g4.link 188 struct scsi_g4 { 189 uchar_t addr3; /* most sig. byte of address */ 190 uchar_t addr2; 191 uchar_t addr1; 192 uchar_t addr0; 193 uchar_t addtl_cdb_data3; 194 uchar_t addtl_cdb_data2; 195 uchar_t addtl_cdb_data1; 196 uchar_t addtl_cdb_data0; 197 uchar_t count3; /* transfer length (msb) */ 198 uchar_t count2; 199 uchar_t count1; 200 uchar_t count0; /* transfer length (lsb) */ 201 uchar_t rsvd1; /* reserved */ 202 #if defined(_BIT_FIELDS_LTOH) 203 uchar_t link :1; /* another command follows */ 204 uchar_t flag :1; /* interrupt when done */ 205 uchar_t naca :1; /* normal ACA */ 206 uchar_t rsvd0 :3; /* reserved */ 207 uchar_t vu_156 :1; /* vendor unique (byte 15 bit6) */ 208 uchar_t vu_157 :1; /* vendor unique (byte 15 bit7) */ 209 #elif defined(_BIT_FIELDS_HTOL) 210 uchar_t vu_157 :1; /* vendor unique (byte 15 bit 7) */ 211 uchar_t vu_156 :1; /* vendor unique (byte 15 bit 6) */ 212 uchar_t rsvd0 :3; /* reserved */ 213 uchar_t naca :1; /* normal ACA */ 214 uchar_t flag :1; /* interrupt when done */ 215 uchar_t link :1; /* another command follows */ 216 #else 217 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 218 #endif /* _BIT_FIELDS_LTOH */ 219 } g4; 220 221 /* 222 * G R O U P 5 F O R M A T (12 byte) 223 */ 224 #define scc5_reladdr cdb_un.tag 225 #define scc5_addr3 cdb_un.sg.g5.addr3 /* msb */ 226 #define scc5_addr2 cdb_un.sg.g5.addr2 227 #define scc5_addr1 cdb_un.sg.g5.addr1 228 #define scc5_addr0 cdb_un.sg.g5.addr0 /* lsb */ 229 #define scc5_count3 cdb_un.sg.g5.count3 /* msb */ 230 #define scc5_count2 cdb_un.sg.g5.count2 231 #define scc5_count1 cdb_un.sg.g5.count1 232 #define scc5_count0 cdb_un.sg.g5.count0 /* lsb */ 233 #define scc5_rsvd0 cdb_un.sg.g5.rsvd1 234 #define scc5_vu_1 cdb_un.sg.g5.v117 235 #define scc5_vu_0 cdb_un.sg.g5.v116 236 #define scc5_naca cdb_un.sg.g5.naca 237 #define scc5_flag cdb_un.sg.g5.flag 238 #define scc5_link cdb_un.sg.g5.link 239 struct scsi_g5 { 240 uchar_t addr3; /* most sig. byte of address */ 241 uchar_t addr2; 242 uchar_t addr1; 243 uchar_t addr0; 244 uchar_t count3; /* most sig. byte of count */ 245 uchar_t count2; 246 uchar_t count1; 247 uchar_t count0; 248 uchar_t rsvd1; /* reserved */ 249 #if defined(_BIT_FIELDS_LTOH) 250 uchar_t link :1; /* another command follows */ 251 uchar_t flag :1; /* interrupt when done */ 252 uchar_t naca :1; /* normal ACA */ 253 uchar_t rsvd0 :3; /* reserved */ 254 uchar_t vu_116 :1; /* vendor unique (byte 11 bit6) */ 255 uchar_t vu_117 :1; /* vendor unique (byte 11 bit7) */ 256 #elif defined(_BIT_FIELDS_HTOL) 257 uchar_t vu_117 :1; /* vendor unique (byte 11 bit 7) */ 258 uchar_t vu_116 :1; /* vendor unique (byte 11 bit 6) */ 259 uchar_t rsvd0 :3; /* reserved */ 260 uchar_t naca :1; /* normal ACA */ 261 uchar_t flag :1; /* interrupt when done */ 262 uchar_t link :1; /* another command follows */ 263 #else 264 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 265 #endif /* _BIT_FIELDS_LTOH */ 266 } g5; 267 }sg; 268 } cdb_un; 269 uchar_t cdb_opaque[SCSI_CDB_SIZE]; /* addressed as opaque char array */ 270 uint_t cdb_long[SCSI_CDB_SIZE / sizeof (uint_t)]; /* as a word array */ 271 }; 272 273 274 /* 275 * Various useful Macros for SCSI commands 276 */ 277 278 /* 279 * defines for getting/setting fields within the various command groups 280 */ 281 282 #define GETCMD(cdb) ((cdb)->scc_cmd & 0x1F) 283 #define GETGROUP(cdb) (CDB_GROUPID((cdb)->scc_cmd)) 284 285 #define FORMG0COUNT(cdb, cnt) (cdb)->g0_count0 = (cnt) 286 287 #define FORMG0ADDR(cdb, addr) (cdb)->g0_addr2 = (addr) >> 16; \ 288 (cdb)->g0_addr1 = ((addr) >> 8) & 0xFF; \ 289 (cdb)->g0_addr0 = (addr) & 0xFF 290 291 #define GETG0ADDR(cdb) (((cdb)->g0_addr2 & 0x1F) << 16) + \ 292 ((cdb)->g0_addr1 << 8) + ((cdb)->g0_addr0) 293 294 #define GETG0TAG(cdb) ((cdb)->g0_addr2) 295 296 #define FORMG0COUNT_S(cdb, cnt) (cdb)->high_count = (cnt) >> 16; \ 297 (cdb)->mid_count = ((cnt) >> 8) & 0xFF; \ 298 (cdb)->low_count = (cnt) & 0xFF 299 300 #define FORMG1COUNT(cdb, cnt) (cdb)->g1_count1 = ((cnt) >> 8); \ 301 (cdb)->g1_count0 = (cnt) & 0xFF 302 303 #define FORMG1ADDR(cdb, addr) (cdb)->g1_addr3 = (addr) >> 24; \ 304 (cdb)->g1_addr2 = ((addr) >> 16) & 0xFF; \ 305 (cdb)->g1_addr1 = ((addr) >> 8) & 0xFF; \ 306 (cdb)->g1_addr0 = (addr) & 0xFF 307 308 #define GETG1ADDR(cdb) ((cdb)->g1_addr3 << 24) + \ 309 ((cdb)->g1_addr2 << 16) + \ 310 ((cdb)->g1_addr1 << 8) + \ 311 ((cdb)->g1_addr0) 312 313 #define GETG1TAG(cdb) (cdb)->g1_reladdr 314 315 #define FORMG4COUNT(cdb, cnt) (cdb)->g4_count3 = ((cnt) >> 24); \ 316 (cdb)->g4_count2 = ((cnt) >> 16) & 0xFF; \ 317 (cdb)->g4_count1 = ((cnt) >> 8) & 0xFF; \ 318 (cdb)->g4_count0 = (cnt) & 0xFF 319 320 #define FORMG4LONGADDR(cdb, addr) (cdb)->g4_addr3 = (addr) >> 56; \ 321 (cdb)->g4_addr2 = \ 322 ((addr) >> 48) & 0xFF; \ 323 (cdb)->g4_addr1 = \ 324 ((addr) >> 40) & 0xFF; \ 325 (cdb)->g4_addr0 = \ 326 ((addr) >> 32) & 0xFF; \ 327 (cdb)->g4_addtl_cdb_data3 = \ 328 ((addr) >> 24) & 0xFF; \ 329 (cdb)->g4_addtl_cdb_data2 = \ 330 ((addr) >> 16) & 0xFF; \ 331 (cdb)->g4_addtl_cdb_data1 = \ 332 ((addr) >> 8) & 0xFF; \ 333 (cdb)->g4_addtl_cdb_data0 = \ 334 (addr) & 0xFF 335 336 #define FORMG4ADDR(cdb, addr) (cdb)->g4_addr3 = (addr) >> 24; \ 337 (cdb)->g4_addr2 = ((addr) >> 16) & 0xFF; \ 338 (cdb)->g4_addr1 = ((addr) >> 8) & 0xFF; \ 339 (cdb)->g4_addr0 = (addr) & 0xFF 340 341 #define FORMG4ADDTL(cdb, addtl_cdb_data) (cdb)->g4_addtl_cdb_data3 = \ 342 (addtl_cdb_data) >> 24; \ 343 (cdb)->g4_addtl_cdb_data2 = \ 344 ((addtl_cdb_data) >> 16) & 0xFF; \ 345 (cdb)->g4_addtl_cdb_data1 = \ 346 ((addtl_cdb_data) >> 8) & 0xFF; \ 347 (cdb)->g4_addtl_cdb_data0 = \ 348 (addtl_cdb_data) & 0xFF 349 350 #define GETG4ADDR(cdb) ((cdb)->g4_addr3 << 24) + \ 351 ((cdb)->g4_addr2 << 16) + \ 352 ((cdb)->g4_addr1 << 8) + \ 353 ((cdb)->g4_addr0) 354 355 #define GETG4ADDRTL(cdb) (((cdb)->g4_addtl_cdb_data3 << 24) + \ 356 ((cdb)->g4_addtl_cdb_data2 << 16) + \ 357 ((cdb)->g4_addtl_cdb_data1 << 8) + \ 358 (cdb)->g4_addtl_cdb_data0) 359 360 #define GETG4TAG(cdb) (cdb)->g4_reladdr 361 362 #define FORMG5COUNT(cdb, cnt) (cdb)->scc5_count3 = ((cnt) >> 24); \ 363 (cdb)->scc5_count2 = ((cnt) >> 16) & 0xFF; \ 364 (cdb)->scc5_count1 = ((cnt) >> 8) & 0xFF; \ 365 (cdb)->scc5_count0 = (cnt) & 0xFF 366 367 #define FORMG5ADDR(cdb, addr) (cdb)->scc5_addr3 = (addr) >> 24; \ 368 (cdb)->scc5_addr2 = ((addr) >> 16) & 0xFF; \ 369 (cdb)->scc5_addr1 = ((addr) >> 8) & 0xFF; \ 370 (cdb)->scc5_addr0 = (addr) & 0xFF 371 372 #define GETG5ADDR(cdb) ((cdb)->scc5_addr3 << 24) + \ 373 ((cdb)->scc5_addr2 << 16) + \ 374 ((cdb)->scc5_addr1 << 8) + \ 375 ((cdb)->scc5_addr0) 376 377 #define GETG5TAG(cdb) (cdb)->scc5_reladdr 378 379 380 /* 381 * Shorthand macros for forming commands 382 * 383 * Works only with pre-SCSI-3 because they put lun as part of CDB. 384 * scsi_setup_cdb() is the recommended interface. 385 */ 386 387 #define MAKECOM_COMMON(pktp, devp, flag, cmd) \ 388 (pktp)->pkt_address = (devp)->sd_address, \ 389 (pktp)->pkt_flags = (flag), \ 390 ((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_cmd = (cmd), \ 391 ((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_lun = \ 392 (pktp)->pkt_address.a_lun 393 394 #define MAKECOM_G0(pktp, devp, flag, cmd, addr, cnt) \ 395 MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 396 FORMG0ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \ 397 FORMG0COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)) 398 399 #define MAKECOM_G0_S(pktp, devp, flag, cmd, cnt, fixbit) \ 400 MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 401 FORMG0COUNT_S(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)), \ 402 ((union scsi_cdb *)(pktp)->pkt_cdbp)->t_code = (fixbit) 403 404 #define MAKECOM_G1(pktp, devp, flag, cmd, addr, cnt) \ 405 MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 406 FORMG1ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \ 407 FORMG1COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)) 408 409 #define MAKECOM_G5(pktp, devp, flag, cmd, addr, cnt) \ 410 MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 411 FORMG5ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \ 412 FORMG5COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)) 413 414 415 /* 416 * Direct access disk format defines and parameters. 417 * 418 * This is still pretty ugly and is mostly derived 419 * from Emulex MD21 specific formatting. 420 */ 421 422 #define fmt_parm_bits g0_addr2 /* for format options */ 423 #define fmt_interleave g0_count0 /* for encode interleave */ 424 #define defect_list_descrip g1_addr3 /* list description bits */ 425 426 /* 427 * defines for value of fmt_parm_bits. 428 */ 429 430 #define FPB_BFI 0x04 /* bytes-from-index fmt */ 431 #define FPB_CMPLT 0x08 /* full defect list provided */ 432 #define FPB_DATA 0x10 /* defect list data provided */ 433 434 /* 435 * Defines for value of defect_list_descrip. 436 */ 437 438 #define DLD_MAN_DEF_LIST 0x10 /* manufacturer's defect list */ 439 #define DLD_GROWN_DEF_LIST 0x08 /* grown defect list */ 440 #define DLD_BLOCK_FORMAT 0x00 /* block format */ 441 #define DLD_BFI_FORMAT 0x04 /* bytes-from-index format */ 442 #define DLD_PS_FORMAT 0x05 /* physical sector format */ 443 444 445 /* 446 * Disk defect list - used by format command. 447 */ 448 #define RDEF_ALL 0 /* read all defects */ 449 #define RDEF_MANUF 1 /* read manufacturer's defects */ 450 #define RDEF_CKLEN 2 /* check length of manufacturer's list */ 451 #define ST506_NDEFECT 127 /* must fit in 1K controller buffer... */ 452 #define ESDI_NDEFECT ST506_NDEFECT 453 454 struct scsi_bfi_defect { /* defect in bytes from index format */ 455 unsigned cyl : 24; 456 unsigned head : 8; 457 int bytes_from_index; 458 }; 459 460 struct scsi_format_params { /* BFI format list */ 461 ushort_t reserved; 462 ushort_t length; 463 struct scsi_bfi_defect list[ESDI_NDEFECT]; 464 }; 465 466 /* 467 * Defect list returned by READ_DEFECT_LIST command. 468 */ 469 struct scsi_defect_hdr { /* For getting defect list size */ 470 uchar_t reserved; 471 uchar_t descriptor; 472 ushort_t length; 473 }; 474 475 struct scsi_defect_list { /* BFI format list */ 476 uchar_t reserved; 477 uchar_t descriptor; 478 ushort_t length; 479 struct scsi_bfi_defect list[ESDI_NDEFECT]; 480 }; 481 482 /* 483 * 484 * Direct Access device Reassign Block parameter 485 * 486 * Defect list format used by reassign block command (logical block format). 487 * 488 * This defect list is limited to 1 defect, as that is the only way we use it. 489 * 490 */ 491 492 struct scsi_reassign_blk { 493 ushort_t reserved; 494 ushort_t length; /* defect length in bytes (defects * 4) */ 495 uint_t defect; /* Logical block address of defect */ 496 }; 497 498 /* 499 * Direct Access Device Capacity Structure -- 8 byte version 500 */ 501 502 struct scsi_capacity { 503 uint_t capacity; 504 uint_t lbasize; 505 }; 506 507 /* 508 * Direct Access Device Capacity Structure -- 16 byte version 509 */ 510 511 struct scsi_capacity_16 { 512 uint64_t sc_capacity; 513 uint_t sc_lbasize; 514 #if defined(_BIT_FIELDS_LTOH) 515 uchar_t sc_rto_en :1; 516 uchar_t sc_prot_en :1; 517 uchar_t sc_rsvd0 :6; 518 #elif defined(_BIT_FIELDS_HTOL) 519 uchar_t sc_rsvd0 :6; 520 uchar_t sc_prot_en :1; 521 uchar_t sc_rto_en :1; 522 #else 523 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 524 #endif /* _BIT_FIELDS_LTOH */ 525 uchar_t sc_rsvd1[19]; 526 }; 527 528 #ifdef _KERNEL 529 530 /* 531 * Functional versions of the above macros, and other functions. 532 * the makecom functions have been deprecated. Please use 533 * scsi_setup_cdb() 534 */ 535 536 #ifdef __STDC__ 537 extern void makecom_g0(struct scsi_pkt *pkt, struct scsi_device *devp, 538 int flag, int cmd, int addr, int cnt); 539 extern void makecom_g0_s(struct scsi_pkt *pkt, struct scsi_device *devp, 540 int flag, int cmd, int cnt, int fixbit); 541 extern void makecom_g1(struct scsi_pkt *pkt, struct scsi_device *devp, 542 int flag, int cmd, int addr, int cnt); 543 extern void makecom_g5(struct scsi_pkt *pkt, struct scsi_device *devp, 544 int flag, int cmd, int addr, int cnt); 545 extern int scsi_setup_cdb(union scsi_cdb *cdbp, uchar_t cmd, uint_t addr, 546 uint_t cnt, uint_t addtl_cdb_data); 547 548 #else /* __STDC__ */ 549 550 extern void makecom_g0(); 551 extern void makecom_g0_s(); 552 extern void makecom_g1(); 553 extern void makecom_g5(); 554 extern int scsi_setup_cdb(); 555 556 #endif /* __STDC__ */ 557 558 #endif /* _KERNEL */ 559 560 #ifdef __cplusplus 561 } 562 #endif 563 564 #endif /* _SYS_SCSI_IMPL_COMMANDS_H */ 565