17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 55c46c6a0Spd * Common Development and Distribution License (the "License"). 65c46c6a0Spd * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 21*5bd3d017SNikko He 227c478bd9Sstevel@tonic-gate /* 23*5bd3d017SNikko He * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #ifndef _SYS_SCSI_IMPL_COMMANDS_H 277c478bd9Sstevel@tonic-gate #define _SYS_SCSI_IMPL_COMMANDS_H 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate #ifdef __cplusplus 307c478bd9Sstevel@tonic-gate extern "C" { 317c478bd9Sstevel@tonic-gate #endif 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate /* 347c478bd9Sstevel@tonic-gate * Implementation dependent command definitions. 357c478bd9Sstevel@tonic-gate * This file is included by <sys/scsi/generic/commands.h> 367c478bd9Sstevel@tonic-gate */ 377c478bd9Sstevel@tonic-gate 387c478bd9Sstevel@tonic-gate /* 397c478bd9Sstevel@tonic-gate * Implementation dependent view of a SCSI command descriptor block 407c478bd9Sstevel@tonic-gate */ 417c478bd9Sstevel@tonic-gate 427c478bd9Sstevel@tonic-gate /* 437c478bd9Sstevel@tonic-gate * Standard SCSI control blocks definitions. 447c478bd9Sstevel@tonic-gate * 457c478bd9Sstevel@tonic-gate * These go in or out over the SCSI bus. 467c478bd9Sstevel@tonic-gate * 477c478bd9Sstevel@tonic-gate * The first 8 bits of the command block are the same for all 487c478bd9Sstevel@tonic-gate * defined command groups. The first byte is an operation which consists 497c478bd9Sstevel@tonic-gate * of a command code component and a group code component. 507c478bd9Sstevel@tonic-gate * 517c478bd9Sstevel@tonic-gate * The group code determines the length of the rest of the command. 527c478bd9Sstevel@tonic-gate * Group 0 commands are 6 bytes, Group 1 and 2 are 10 bytes, Group 4 537c478bd9Sstevel@tonic-gate * are 16 bytes, and Group 5 are 12 bytes. Groups 3 is Reserved. 547c478bd9Sstevel@tonic-gate * Groups 6 and 7 are Vendor Unique. 557c478bd9Sstevel@tonic-gate * 567c478bd9Sstevel@tonic-gate */ 577c478bd9Sstevel@tonic-gate #define CDB_SIZE CDB_GROUP5 /* deprecated, do not use */ 587c478bd9Sstevel@tonic-gate #define SCSI_CDB_SIZE CDB_GROUP4 /* sizeof (union scsi_cdb) */ 597c478bd9Sstevel@tonic-gate 607c478bd9Sstevel@tonic-gate union scsi_cdb { /* scsi command description block */ 617c478bd9Sstevel@tonic-gate struct { 627c478bd9Sstevel@tonic-gate uchar_t cmd; /* cmd code (byte 0) */ 637c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_LTOH) 647c478bd9Sstevel@tonic-gate uchar_t tag :5; /* rest of byte 1 */ 657c478bd9Sstevel@tonic-gate uchar_t lun :3; /* lun (byte 1) (reserved in SCSI-3) */ 667c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_HTOL) 677c478bd9Sstevel@tonic-gate uchar_t lun :3, /* lun (byte 1) (reserved in SCSI-3) */ 687c478bd9Sstevel@tonic-gate tag :5; /* rest of byte 1 */ 697c478bd9Sstevel@tonic-gate #else 707c478bd9Sstevel@tonic-gate #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 717c478bd9Sstevel@tonic-gate #endif /* _BIT_FIELDS_LTOH */ 727c478bd9Sstevel@tonic-gate union { 737c478bd9Sstevel@tonic-gate 747c478bd9Sstevel@tonic-gate uchar_t scsi[SCSI_CDB_SIZE-2]; 757c478bd9Sstevel@tonic-gate /* 767c478bd9Sstevel@tonic-gate * G R O U P 0 F O R M A T (6 bytes) 777c478bd9Sstevel@tonic-gate */ 787c478bd9Sstevel@tonic-gate #define scc_cmd cdb_un.cmd 797c478bd9Sstevel@tonic-gate #define scc_lun cdb_un.lun 807c478bd9Sstevel@tonic-gate #define g0_addr2 cdb_un.tag 817c478bd9Sstevel@tonic-gate #define g0_addr1 cdb_un.sg.g0.addr1 827c478bd9Sstevel@tonic-gate #define g0_addr0 cdb_un.sg.g0.addr0 837c478bd9Sstevel@tonic-gate #define g0_count0 cdb_un.sg.g0.count0 847c478bd9Sstevel@tonic-gate #define g0_vu_1 cdb_un.sg.g0.vu_57 857c478bd9Sstevel@tonic-gate #define g0_vu_0 cdb_un.sg.g0.vu_56 867c478bd9Sstevel@tonic-gate #define g0_naca cdb_un.sg.g0.naca 877c478bd9Sstevel@tonic-gate #define g0_flag cdb_un.sg.g0.flag 887c478bd9Sstevel@tonic-gate #define g0_link cdb_un.sg.g0.link 897c478bd9Sstevel@tonic-gate /* 907c478bd9Sstevel@tonic-gate * defines for SCSI tape cdb. 917c478bd9Sstevel@tonic-gate */ 927c478bd9Sstevel@tonic-gate #define t_code cdb_un.tag 937c478bd9Sstevel@tonic-gate #define high_count cdb_un.sg.g0.addr1 947c478bd9Sstevel@tonic-gate #define mid_count cdb_un.sg.g0.addr0 957c478bd9Sstevel@tonic-gate #define low_count cdb_un.sg.g0.count0 967c478bd9Sstevel@tonic-gate struct scsi_g0 { 977c478bd9Sstevel@tonic-gate uchar_t addr1; /* middle part of address */ 987c478bd9Sstevel@tonic-gate uchar_t addr0; /* low part of address */ 997c478bd9Sstevel@tonic-gate uchar_t count0; /* usually block count */ 1007c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_LTOH) 1017c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 1027c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 1037c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 1047c478bd9Sstevel@tonic-gate uchar_t rsvd :3; /* reserved */ 1057c478bd9Sstevel@tonic-gate uchar_t vu_56 :1; /* vendor unique (byte 5 bit6) */ 1067c478bd9Sstevel@tonic-gate uchar_t vu_57 :1; /* vendor unique (byte 5 bit7) */ 1077c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_HTOL) 1087c478bd9Sstevel@tonic-gate uchar_t vu_57 :1; /* vendor unique (byte 5 bit 7) */ 1097c478bd9Sstevel@tonic-gate uchar_t vu_56 :1; /* vendor unique (byte 5 bit 6) */ 1107c478bd9Sstevel@tonic-gate uchar_t rsvd :3; /* reserved */ 1117c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 1127c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 1137c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 1147c478bd9Sstevel@tonic-gate #else 1157c478bd9Sstevel@tonic-gate #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 1167c478bd9Sstevel@tonic-gate #endif /* _BIT_FIELDS_LTOH */ 1177c478bd9Sstevel@tonic-gate } g0; 1187c478bd9Sstevel@tonic-gate 1197c478bd9Sstevel@tonic-gate 1207c478bd9Sstevel@tonic-gate /* 1217c478bd9Sstevel@tonic-gate * G R O U P 1, 2 F O R M A T (10 byte) 1227c478bd9Sstevel@tonic-gate */ 1237c478bd9Sstevel@tonic-gate #define g1_reladdr cdb_un.tag 1247c478bd9Sstevel@tonic-gate #define g1_rsvd0 cdb_un.sg.g1.rsvd1 1257c478bd9Sstevel@tonic-gate #define g1_addr3 cdb_un.sg.g1.addr3 /* msb */ 1267c478bd9Sstevel@tonic-gate #define g1_addr2 cdb_un.sg.g1.addr2 1277c478bd9Sstevel@tonic-gate #define g1_addr1 cdb_un.sg.g1.addr1 1287c478bd9Sstevel@tonic-gate #define g1_addr0 cdb_un.sg.g1.addr0 /* lsb */ 1297c478bd9Sstevel@tonic-gate #define g1_count1 cdb_un.sg.g1.count1 /* msb */ 1307c478bd9Sstevel@tonic-gate #define g1_count0 cdb_un.sg.g1.count0 /* lsb */ 1317c478bd9Sstevel@tonic-gate #define g1_vu_1 cdb_un.sg.g1.vu_97 1327c478bd9Sstevel@tonic-gate #define g1_vu_0 cdb_un.sg.g1.vu_96 1337c478bd9Sstevel@tonic-gate #define g1_naca cdb_un.sg.g1.naca 1347c478bd9Sstevel@tonic-gate #define g1_flag cdb_un.sg.g1.flag 1357c478bd9Sstevel@tonic-gate #define g1_link cdb_un.sg.g1.link 1367c478bd9Sstevel@tonic-gate struct scsi_g1 { 1377c478bd9Sstevel@tonic-gate uchar_t addr3; /* most sig. byte of address */ 1387c478bd9Sstevel@tonic-gate uchar_t addr2; 1397c478bd9Sstevel@tonic-gate uchar_t addr1; 1407c478bd9Sstevel@tonic-gate uchar_t addr0; 1417c478bd9Sstevel@tonic-gate uchar_t rsvd1; /* reserved (byte 6) */ 1427c478bd9Sstevel@tonic-gate uchar_t count1; /* transfer length (msb) */ 1437c478bd9Sstevel@tonic-gate uchar_t count0; /* transfer length (lsb) */ 1447c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_LTOH) 1457c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 1467c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 1477c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 1487c478bd9Sstevel@tonic-gate uchar_t rsvd0 :3; /* reserved */ 1497c478bd9Sstevel@tonic-gate uchar_t vu_96 :1; /* vendor unique (byte 9 bit6) */ 1507c478bd9Sstevel@tonic-gate uchar_t vu_97 :1; /* vendor unique (byte 9 bit7) */ 1517c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_HTOL) 1527c478bd9Sstevel@tonic-gate uchar_t vu_97 :1; /* vendor unique (byte 9 bit 7) */ 1537c478bd9Sstevel@tonic-gate uchar_t vu_96 :1; /* vendor unique (byte 9 bit 6) */ 1547c478bd9Sstevel@tonic-gate uchar_t rsvd0 :3; /* reserved */ 1557c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 1567c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 1577c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 1587c478bd9Sstevel@tonic-gate #else 1597c478bd9Sstevel@tonic-gate #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 1607c478bd9Sstevel@tonic-gate #endif /* _BIT_FIELDS_LTOH */ 1617c478bd9Sstevel@tonic-gate } g1; 1627c478bd9Sstevel@tonic-gate 1637c478bd9Sstevel@tonic-gate /* 1647c478bd9Sstevel@tonic-gate * G R O U P 4 F O R M A T (16 byte) 1657c478bd9Sstevel@tonic-gate */ 1667c478bd9Sstevel@tonic-gate #define g4_reladdr cdb_un.tag 1677c478bd9Sstevel@tonic-gate #define g4_addr3 cdb_un.sg.g4.addr3 /* msb */ 1687c478bd9Sstevel@tonic-gate #define g4_addr2 cdb_un.sg.g4.addr2 1697c478bd9Sstevel@tonic-gate #define g4_addr1 cdb_un.sg.g4.addr1 1707c478bd9Sstevel@tonic-gate #define g4_addr0 cdb_un.sg.g4.addr0 /* lsb */ 1717c478bd9Sstevel@tonic-gate #define g4_addtl_cdb_data3 cdb_un.sg.g4.addtl_cdb_data3 1727c478bd9Sstevel@tonic-gate #define g4_addtl_cdb_data2 cdb_un.sg.g4.addtl_cdb_data2 1737c478bd9Sstevel@tonic-gate #define g4_addtl_cdb_data1 cdb_un.sg.g4.addtl_cdb_data1 1747c478bd9Sstevel@tonic-gate #define g4_addtl_cdb_data0 cdb_un.sg.g4.addtl_cdb_data0 1757c478bd9Sstevel@tonic-gate #define g4_count3 cdb_un.sg.g4.count3 /* msb */ 1767c478bd9Sstevel@tonic-gate #define g4_count2 cdb_un.sg.g4.count2 1777c478bd9Sstevel@tonic-gate #define g4_count1 cdb_un.sg.g4.count1 1787c478bd9Sstevel@tonic-gate #define g4_count0 cdb_un.sg.g4.count0 /* lsb */ 1797c478bd9Sstevel@tonic-gate #define g4_rsvd0 cdb_un.sg.g4.rsvd1 1807c478bd9Sstevel@tonic-gate #define g4_vu_1 cdb_un.sg.g4.vu_157 1817c478bd9Sstevel@tonic-gate #define g4_vu_0 cdb_un.sg.g4.vu_156 1827c478bd9Sstevel@tonic-gate #define g4_naca cdb_un.sg.g4.naca 1837c478bd9Sstevel@tonic-gate #define g4_flag cdb_un.sg.g4.flag 1847c478bd9Sstevel@tonic-gate #define g4_link cdb_un.sg.g4.link 1857c478bd9Sstevel@tonic-gate struct scsi_g4 { 1867c478bd9Sstevel@tonic-gate uchar_t addr3; /* most sig. byte of address */ 1877c478bd9Sstevel@tonic-gate uchar_t addr2; 1887c478bd9Sstevel@tonic-gate uchar_t addr1; 1897c478bd9Sstevel@tonic-gate uchar_t addr0; 1907c478bd9Sstevel@tonic-gate uchar_t addtl_cdb_data3; 1917c478bd9Sstevel@tonic-gate uchar_t addtl_cdb_data2; 1927c478bd9Sstevel@tonic-gate uchar_t addtl_cdb_data1; 1937c478bd9Sstevel@tonic-gate uchar_t addtl_cdb_data0; 1947c478bd9Sstevel@tonic-gate uchar_t count3; /* transfer length (msb) */ 1957c478bd9Sstevel@tonic-gate uchar_t count2; 1967c478bd9Sstevel@tonic-gate uchar_t count1; 1977c478bd9Sstevel@tonic-gate uchar_t count0; /* transfer length (lsb) */ 1987c478bd9Sstevel@tonic-gate uchar_t rsvd1; /* reserved */ 1997c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_LTOH) 2007c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 2017c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 2027c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 2037c478bd9Sstevel@tonic-gate uchar_t rsvd0 :3; /* reserved */ 2047c478bd9Sstevel@tonic-gate uchar_t vu_156 :1; /* vendor unique (byte 15 bit6) */ 2057c478bd9Sstevel@tonic-gate uchar_t vu_157 :1; /* vendor unique (byte 15 bit7) */ 2067c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_HTOL) 2077c478bd9Sstevel@tonic-gate uchar_t vu_157 :1; /* vendor unique (byte 15 bit 7) */ 2087c478bd9Sstevel@tonic-gate uchar_t vu_156 :1; /* vendor unique (byte 15 bit 6) */ 2097c478bd9Sstevel@tonic-gate uchar_t rsvd0 :3; /* reserved */ 2107c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 2117c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 2127c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 2137c478bd9Sstevel@tonic-gate #else 2147c478bd9Sstevel@tonic-gate #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 2157c478bd9Sstevel@tonic-gate #endif /* _BIT_FIELDS_LTOH */ 2167c478bd9Sstevel@tonic-gate } g4; 2177c478bd9Sstevel@tonic-gate 2187c478bd9Sstevel@tonic-gate /* 2197c478bd9Sstevel@tonic-gate * G R O U P 5 F O R M A T (12 byte) 2207c478bd9Sstevel@tonic-gate */ 2217c478bd9Sstevel@tonic-gate #define scc5_reladdr cdb_un.tag 2227c478bd9Sstevel@tonic-gate #define scc5_addr3 cdb_un.sg.g5.addr3 /* msb */ 2237c478bd9Sstevel@tonic-gate #define scc5_addr2 cdb_un.sg.g5.addr2 2247c478bd9Sstevel@tonic-gate #define scc5_addr1 cdb_un.sg.g5.addr1 2257c478bd9Sstevel@tonic-gate #define scc5_addr0 cdb_un.sg.g5.addr0 /* lsb */ 2267c478bd9Sstevel@tonic-gate #define scc5_count3 cdb_un.sg.g5.count3 /* msb */ 2277c478bd9Sstevel@tonic-gate #define scc5_count2 cdb_un.sg.g5.count2 2287c478bd9Sstevel@tonic-gate #define scc5_count1 cdb_un.sg.g5.count1 2297c478bd9Sstevel@tonic-gate #define scc5_count0 cdb_un.sg.g5.count0 /* lsb */ 2307c478bd9Sstevel@tonic-gate #define scc5_rsvd0 cdb_un.sg.g5.rsvd1 2317c478bd9Sstevel@tonic-gate #define scc5_vu_1 cdb_un.sg.g5.v117 2327c478bd9Sstevel@tonic-gate #define scc5_vu_0 cdb_un.sg.g5.v116 2337c478bd9Sstevel@tonic-gate #define scc5_naca cdb_un.sg.g5.naca 2347c478bd9Sstevel@tonic-gate #define scc5_flag cdb_un.sg.g5.flag 2357c478bd9Sstevel@tonic-gate #define scc5_link cdb_un.sg.g5.link 2367c478bd9Sstevel@tonic-gate struct scsi_g5 { 2377c478bd9Sstevel@tonic-gate uchar_t addr3; /* most sig. byte of address */ 2387c478bd9Sstevel@tonic-gate uchar_t addr2; 2397c478bd9Sstevel@tonic-gate uchar_t addr1; 2407c478bd9Sstevel@tonic-gate uchar_t addr0; 2417c478bd9Sstevel@tonic-gate uchar_t count3; /* most sig. byte of count */ 2427c478bd9Sstevel@tonic-gate uchar_t count2; 2437c478bd9Sstevel@tonic-gate uchar_t count1; 2447c478bd9Sstevel@tonic-gate uchar_t count0; 2457c478bd9Sstevel@tonic-gate uchar_t rsvd1; /* reserved */ 2467c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_LTOH) 2477c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 2487c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 2497c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 2507c478bd9Sstevel@tonic-gate uchar_t rsvd0 :3; /* reserved */ 2517c478bd9Sstevel@tonic-gate uchar_t vu_116 :1; /* vendor unique (byte 11 bit6) */ 2527c478bd9Sstevel@tonic-gate uchar_t vu_117 :1; /* vendor unique (byte 11 bit7) */ 2537c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_HTOL) 2547c478bd9Sstevel@tonic-gate uchar_t vu_117 :1; /* vendor unique (byte 11 bit 7) */ 2557c478bd9Sstevel@tonic-gate uchar_t vu_116 :1; /* vendor unique (byte 11 bit 6) */ 2567c478bd9Sstevel@tonic-gate uchar_t rsvd0 :3; /* reserved */ 2577c478bd9Sstevel@tonic-gate uchar_t naca :1; /* normal ACA */ 2587c478bd9Sstevel@tonic-gate uchar_t flag :1; /* interrupt when done */ 2597c478bd9Sstevel@tonic-gate uchar_t link :1; /* another command follows */ 2607c478bd9Sstevel@tonic-gate #else 2617c478bd9Sstevel@tonic-gate #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 2627c478bd9Sstevel@tonic-gate #endif /* _BIT_FIELDS_LTOH */ 2637c478bd9Sstevel@tonic-gate } g5; 2647c478bd9Sstevel@tonic-gate }sg; 2657c478bd9Sstevel@tonic-gate } cdb_un; 2667c478bd9Sstevel@tonic-gate uchar_t cdb_opaque[SCSI_CDB_SIZE]; /* addressed as opaque char array */ 2677c478bd9Sstevel@tonic-gate uint_t cdb_long[SCSI_CDB_SIZE / sizeof (uint_t)]; /* as a word array */ 2687c478bd9Sstevel@tonic-gate }; 2697c478bd9Sstevel@tonic-gate 2707c478bd9Sstevel@tonic-gate 2717c478bd9Sstevel@tonic-gate /* 2727c478bd9Sstevel@tonic-gate * Various useful Macros for SCSI commands 2737c478bd9Sstevel@tonic-gate */ 2747c478bd9Sstevel@tonic-gate 2755c46c6a0Spd /* 2765c46c6a0Spd * defines for getting/setting fields in data received from or destined for 2775c46c6a0Spd * a SCSI device. These macros are necessary (in place of BE16/BE32/BE64) 2785c46c6a0Spd * because the address to be read or written may not be on a proper alignment. 2795c46c6a0Spd */ 2805c46c6a0Spd 2815c46c6a0Spd #define SCSI_READ16(Sr16_Addr) \ 2825c46c6a0Spd (((uint16_t)*((uint8_t *)(Sr16_Addr)) << 8) | \ 283275c9da8Seschrock ((uint16_t)*((uint8_t *)(Sr16_Addr)+1))) 284275c9da8Seschrock 285275c9da8Seschrock #define SCSI_READ24(Sr32_Addr) \ 286275c9da8Seschrock (((uint32_t)*((uint8_t *)(Sr32_Addr)) << 16) | \ 287275c9da8Seschrock ((uint32_t)*((uint8_t *)(Sr32_Addr)+1) << 8) | \ 288275c9da8Seschrock ((uint32_t)*((uint8_t *)(Sr32_Addr)+2))) 2895c46c6a0Spd 2905c46c6a0Spd #define SCSI_READ32(Sr32_Addr) \ 2915c46c6a0Spd (((uint32_t)*((uint8_t *)(Sr32_Addr)) << 24) | \ 292275c9da8Seschrock ((uint32_t)*((uint8_t *)(Sr32_Addr)+1) << 16) | \ 293275c9da8Seschrock ((uint32_t)*((uint8_t *)(Sr32_Addr)+2) << 8) | \ 294275c9da8Seschrock ((uint32_t)*((uint8_t *)(Sr32_Addr)+3))) 295275c9da8Seschrock 296275c9da8Seschrock #define SCSI_READ40(Sr64_Addr) \ 297275c9da8Seschrock (((uint64_t)*((uint8_t *)(Sr64_Addr)) << 32) | \ 298275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+1) << 24) | \ 299275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+2) << 16) | \ 300275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+3) << 8) | \ 301275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+4))) 302275c9da8Seschrock 303275c9da8Seschrock #define SCSI_READ48(Sr64_Addr) \ 304275c9da8Seschrock (((uint64_t)*((uint8_t *)(Sr64_Addr)) << 40) | \ 305275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+1) << 32) | \ 306275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+2) << 24) | \ 307275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+3) << 16) | \ 308275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+4) << 8) | \ 309275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+5))) 3105c46c6a0Spd 3115c46c6a0Spd #define SCSI_READ64(Sr64_Addr) \ 3125c46c6a0Spd (((uint64_t)*((uint8_t *)(Sr64_Addr)) << 56) | \ 313275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+1) << 48) | \ 314275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+2) << 40) | \ 315275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+3) << 32) | \ 316275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+4) << 24) | \ 317275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+5) << 16) | \ 318275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+6) << 8) | \ 319275c9da8Seschrock ((uint64_t)*((uint8_t *)(Sr64_Addr)+7))) 3205c46c6a0Spd 3215c46c6a0Spd #define SCSI_WRITE16(Sr16_Addr, Sr16_Val) \ 322275c9da8Seschrock *((uint8_t *)(Sr16_Addr)) = (((uint16_t)(Sr16_Val) >> 8) & 0xff), \ 323275c9da8Seschrock *((uint8_t *)(Sr16_Addr)+1) = ((uint16_t)(Sr16_Val) & 0xff) 324275c9da8Seschrock 325275c9da8Seschrock #define SCSI_WRITE24(Sr24_Addr, Sr24_Val) \ 326275c9da8Seschrock SCSI_WRITE16((Sr24_Addr), ((Sr24_Val) & 0xffff00) >> 8), \ 327275c9da8Seschrock *((uint8_t *)(Sr24_Addr)+2) = ((uint8_t)((Sr24_Val) & 0xff)) 3285c46c6a0Spd 3295c46c6a0Spd #define SCSI_WRITE32(Sr32_Addr, Sr32_Val) \ 330275c9da8Seschrock *(uint8_t *)(Sr32_Addr) = (((uint32_t)(Sr32_Val) >> 24) & 0xff), \ 331275c9da8Seschrock *((uint8_t *)(Sr32_Addr)+1) = \ 332275c9da8Seschrock (((uint32_t)(Sr32_Val) >> 16) & 0xff), \ 333275c9da8Seschrock *((uint8_t *)(Sr32_Addr)+2) = (((uint32_t)(Sr32_Val) >> 8) & 0xff), \ 334275c9da8Seschrock *((uint8_t *)(Sr32_Addr)+3) = (((uint32_t)(Sr32_Val)) & 0xff) 335275c9da8Seschrock 336275c9da8Seschrock #define SCSI_WRITE40(Sr40_Addr, Sr40_Val) \ 337275c9da8Seschrock SCSI_WRITE32((Sr40_Addr), ((Sr40_Val) & 0xffffffff00ULL) >> 8), \ 338275c9da8Seschrock *((uint8_t *)(Sr40_Addr)+4) = ((uint8_t)(Sr40_Val) & 0xff) 339275c9da8Seschrock 340275c9da8Seschrock #define SCSI_WRITE48(Sr48_Addr, Sr40_Val) \ 341275c9da8Seschrock SCSI_WRITE32((Sr48_Addr), ((Sr48_Val) & 0xffffffff0000ULL) >> 16), \ 342275c9da8Seschrock SCSI_WRITE16((uint8_t *)(Sr48_Addr)+4, (Sr40_Val) & 0xffff) 3435c46c6a0Spd 3445c46c6a0Spd #define SCSI_WRITE64(Sr64_Addr, Sr64_Val) \ 345275c9da8Seschrock *(uint8_t *)(Sr64_Addr) = (((uint64_t)(Sr64_Val) >> 56) & 0xff), \ 346275c9da8Seschrock *((uint8_t *)(Sr64_Addr)+1) = \ 347275c9da8Seschrock (((uint64_t)(Sr64_Val) >> 48) & 0xff), \ 348275c9da8Seschrock *((uint8_t *)(Sr64_Addr)+2) = \ 349275c9da8Seschrock (((uint64_t)(Sr64_Val) >> 40) & 0xff), \ 350275c9da8Seschrock *((uint8_t *)(Sr64_Addr)+3) = \ 351275c9da8Seschrock (((uint64_t)(Sr64_Val) >> 32) & 0xff), \ 352275c9da8Seschrock *((uint8_t *)(Sr64_Addr)+4) = \ 353275c9da8Seschrock (((uint64_t)(Sr64_Val) >> 24) & 0xff), \ 354275c9da8Seschrock *((uint8_t *)(Sr64_Addr)+5) = \ 355275c9da8Seschrock (((uint64_t)(Sr64_Val) >> 16) & 0xff), \ 356275c9da8Seschrock *((uint8_t *)(Sr64_Addr)+6) = \ 357275c9da8Seschrock (((uint64_t)(Sr64_Val) >> 8) & 0xff), \ 358275c9da8Seschrock *((uint8_t *)(Sr64_Addr)+7) = (((uint64_t)(Sr64_Val)) & 0xff) 359275c9da8Seschrock 360275c9da8Seschrock /* 361275c9da8Seschrock * These macros deal with unaligned data that crosses a byte boundary. 362275c9da8Seschrock */ 363275c9da8Seschrock #define SCSI_MK8(ms, ls) \ 364275c9da8Seschrock (((uint8_t)(ms) << 4) | (uint8_t)ls) 365275c9da8Seschrock 366275c9da8Seschrock #define SCSI_MK12_4_8(ms, ls) \ 367275c9da8Seschrock (((uint16_t)(ms) << 8) | (uint16_t)(ls)) 368275c9da8Seschrock #define SCSI_MK12_8_4(ms, ls) \ 369275c9da8Seschrock (((uint16_t)(ms) << 4) | (uint16_t)(ls)) 370275c9da8Seschrock 371275c9da8Seschrock #define SCSI_MK16_4_8_4(hi, mid, lo) \ 372275c9da8Seschrock (((uint16_t)(hi) << 12) | ((uint16_t)(mid) << 4) | (uint16_t)(lo)) 373275c9da8Seschrock 374275c9da8Seschrock #define SCSI_MK20_4_16(ms, ls) \ 375275c9da8Seschrock (((uint32_t)(ms) << 16) | ((uint32_t)(ls))) 376275c9da8Seschrock #define SCSI_MK20_16_4(ms, ls) \ 377275c9da8Seschrock (((uint32_t)(ms) << 4) | ((uint32_t)(ls))) 378275c9da8Seschrock 379275c9da8Seschrock #define SCSI_MK24_4_16_4(hi, mid, lo) \ 380275c9da8Seschrock (((uint32_t)(hi) << 20) | ((uint32_t)(mid) << 4) | (uint32_t)(lo)) 381275c9da8Seschrock 382275c9da8Seschrock #define SCSI_MK36_4_32(ms, ls) \ 383275c9da8Seschrock (((uint64_t)(ms) << 32) | (uint64_t)(ls)) 384275c9da8Seschrock #define SCSI_MK36_32_4(ms, ls) \ 385275c9da8Seschrock (((uint64_t)(ms) << 4) | (uint64_t)(ls)) 3865c46c6a0Spd 3877c478bd9Sstevel@tonic-gate /* 3887c478bd9Sstevel@tonic-gate * defines for getting/setting fields within the various command groups 3897c478bd9Sstevel@tonic-gate */ 3907c478bd9Sstevel@tonic-gate 3917c478bd9Sstevel@tonic-gate #define GETCMD(cdb) ((cdb)->scc_cmd & 0x1F) 3927c478bd9Sstevel@tonic-gate #define GETGROUP(cdb) (CDB_GROUPID((cdb)->scc_cmd)) 3937c478bd9Sstevel@tonic-gate 3947c478bd9Sstevel@tonic-gate #define FORMG0COUNT(cdb, cnt) (cdb)->g0_count0 = (cnt) 3957c478bd9Sstevel@tonic-gate 3967c478bd9Sstevel@tonic-gate #define FORMG0ADDR(cdb, addr) (cdb)->g0_addr2 = (addr) >> 16; \ 3977c478bd9Sstevel@tonic-gate (cdb)->g0_addr1 = ((addr) >> 8) & 0xFF; \ 3987c478bd9Sstevel@tonic-gate (cdb)->g0_addr0 = (addr) & 0xFF 3997c478bd9Sstevel@tonic-gate 40036c5fee3Smcneal #define GETG0COUNT(cdb) (cdb)->g0_count0 40136c5fee3Smcneal 40236c5fee3Smcneal #define GETG0ADDR(cdb) ((((cdb)->g0_addr2 & 0x1F) << 16) + \ 40336c5fee3Smcneal ((cdb)->g0_addr1 << 8) + ((cdb)->g0_addr0)) 4047c478bd9Sstevel@tonic-gate 4057c478bd9Sstevel@tonic-gate #define GETG0TAG(cdb) ((cdb)->g0_addr2) 4067c478bd9Sstevel@tonic-gate 4077c478bd9Sstevel@tonic-gate #define FORMG0COUNT_S(cdb, cnt) (cdb)->high_count = (cnt) >> 16; \ 4087c478bd9Sstevel@tonic-gate (cdb)->mid_count = ((cnt) >> 8) & 0xFF; \ 4097c478bd9Sstevel@tonic-gate (cdb)->low_count = (cnt) & 0xFF 4107c478bd9Sstevel@tonic-gate 4117c478bd9Sstevel@tonic-gate #define FORMG1COUNT(cdb, cnt) (cdb)->g1_count1 = ((cnt) >> 8); \ 4127c478bd9Sstevel@tonic-gate (cdb)->g1_count0 = (cnt) & 0xFF 4137c478bd9Sstevel@tonic-gate 4147c478bd9Sstevel@tonic-gate #define FORMG1ADDR(cdb, addr) (cdb)->g1_addr3 = (addr) >> 24; \ 4157c478bd9Sstevel@tonic-gate (cdb)->g1_addr2 = ((addr) >> 16) & 0xFF; \ 4167c478bd9Sstevel@tonic-gate (cdb)->g1_addr1 = ((addr) >> 8) & 0xFF; \ 4177c478bd9Sstevel@tonic-gate (cdb)->g1_addr0 = (addr) & 0xFF 4187c478bd9Sstevel@tonic-gate 41936c5fee3Smcneal #define GETG1COUNT(cdb) (((cdb)->g1_count1 << 8) + ((cdb)->g1_count0)) 42036c5fee3Smcneal 42136c5fee3Smcneal #define GETG1ADDR(cdb) (((cdb)->g1_addr3 << 24) + \ 4227c478bd9Sstevel@tonic-gate ((cdb)->g1_addr2 << 16) + \ 4237c478bd9Sstevel@tonic-gate ((cdb)->g1_addr1 << 8) + \ 42436c5fee3Smcneal ((cdb)->g1_addr0)) 4257c478bd9Sstevel@tonic-gate 4267c478bd9Sstevel@tonic-gate #define GETG1TAG(cdb) (cdb)->g1_reladdr 4277c478bd9Sstevel@tonic-gate 4287c478bd9Sstevel@tonic-gate #define FORMG4COUNT(cdb, cnt) (cdb)->g4_count3 = ((cnt) >> 24); \ 4297c478bd9Sstevel@tonic-gate (cdb)->g4_count2 = ((cnt) >> 16) & 0xFF; \ 4307c478bd9Sstevel@tonic-gate (cdb)->g4_count1 = ((cnt) >> 8) & 0xFF; \ 4317c478bd9Sstevel@tonic-gate (cdb)->g4_count0 = (cnt) & 0xFF 4327c478bd9Sstevel@tonic-gate 4337c478bd9Sstevel@tonic-gate #define FORMG4LONGADDR(cdb, addr) (cdb)->g4_addr3 = (addr) >> 56; \ 4347c478bd9Sstevel@tonic-gate (cdb)->g4_addr2 = \ 4357c478bd9Sstevel@tonic-gate ((addr) >> 48) & 0xFF; \ 4367c478bd9Sstevel@tonic-gate (cdb)->g4_addr1 = \ 4377c478bd9Sstevel@tonic-gate ((addr) >> 40) & 0xFF; \ 4387c478bd9Sstevel@tonic-gate (cdb)->g4_addr0 = \ 4397c478bd9Sstevel@tonic-gate ((addr) >> 32) & 0xFF; \ 4407c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data3 = \ 4417c478bd9Sstevel@tonic-gate ((addr) >> 24) & 0xFF; \ 4427c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data2 = \ 4437c478bd9Sstevel@tonic-gate ((addr) >> 16) & 0xFF; \ 4447c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data1 = \ 4457c478bd9Sstevel@tonic-gate ((addr) >> 8) & 0xFF; \ 4467c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data0 = \ 4477c478bd9Sstevel@tonic-gate (addr) & 0xFF 4487c478bd9Sstevel@tonic-gate 44936c5fee3Smcneal #define GETG4COUNT(cdb) (((cdb)->g4_count3 << 24) + \ 45036c5fee3Smcneal ((cdb)->g4_count2 << 16) + \ 45136c5fee3Smcneal ((cdb)->g4_count1 << 8) + \ 45236c5fee3Smcneal ((cdb)->g4_count0)) 45336c5fee3Smcneal 45436c5fee3Smcneal #define GETG4LONGADDR(cdb) (((diskaddr_t)(cdb)->g4_addr3 << 56) + \ 45536c5fee3Smcneal ((diskaddr_t)(cdb)->g4_addr2 << 48) + \ 45636c5fee3Smcneal ((diskaddr_t)(cdb)->g4_addr1 << 40) + \ 45736c5fee3Smcneal ((diskaddr_t)(cdb)->g4_addr0 << 32) + \ 45836c5fee3Smcneal ((diskaddr_t)(cdb)->g4_addtl_cdb_data3 << 24) + \ 45936c5fee3Smcneal ((diskaddr_t)(cdb)->g4_addtl_cdb_data2 << 16) + \ 46036c5fee3Smcneal ((diskaddr_t)(cdb)->g4_addtl_cdb_data1 << 8) + \ 46136c5fee3Smcneal ((diskaddr_t)(cdb)->g4_addtl_cdb_data0)) 46236c5fee3Smcneal 4637c478bd9Sstevel@tonic-gate #define FORMG4ADDR(cdb, addr) (cdb)->g4_addr3 = (addr) >> 24; \ 4647c478bd9Sstevel@tonic-gate (cdb)->g4_addr2 = ((addr) >> 16) & 0xFF; \ 4657c478bd9Sstevel@tonic-gate (cdb)->g4_addr1 = ((addr) >> 8) & 0xFF; \ 4667c478bd9Sstevel@tonic-gate (cdb)->g4_addr0 = (addr) & 0xFF 4677c478bd9Sstevel@tonic-gate 4687c478bd9Sstevel@tonic-gate #define FORMG4ADDTL(cdb, addtl_cdb_data) (cdb)->g4_addtl_cdb_data3 = \ 4697c478bd9Sstevel@tonic-gate (addtl_cdb_data) >> 24; \ 4707c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data2 = \ 4717c478bd9Sstevel@tonic-gate ((addtl_cdb_data) >> 16) & 0xFF; \ 4727c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data1 = \ 4737c478bd9Sstevel@tonic-gate ((addtl_cdb_data) >> 8) & 0xFF; \ 4747c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data0 = \ 4757c478bd9Sstevel@tonic-gate (addtl_cdb_data) & 0xFF 4767c478bd9Sstevel@tonic-gate 4777c478bd9Sstevel@tonic-gate #define GETG4ADDR(cdb) ((cdb)->g4_addr3 << 24) + \ 4787c478bd9Sstevel@tonic-gate ((cdb)->g4_addr2 << 16) + \ 4797c478bd9Sstevel@tonic-gate ((cdb)->g4_addr1 << 8) + \ 4807c478bd9Sstevel@tonic-gate ((cdb)->g4_addr0) 4817c478bd9Sstevel@tonic-gate 4827c478bd9Sstevel@tonic-gate #define GETG4ADDRTL(cdb) (((cdb)->g4_addtl_cdb_data3 << 24) + \ 4837c478bd9Sstevel@tonic-gate ((cdb)->g4_addtl_cdb_data2 << 16) + \ 4847c478bd9Sstevel@tonic-gate ((cdb)->g4_addtl_cdb_data1 << 8) + \ 4857c478bd9Sstevel@tonic-gate (cdb)->g4_addtl_cdb_data0) 4867c478bd9Sstevel@tonic-gate 4877c478bd9Sstevel@tonic-gate #define GETG4TAG(cdb) (cdb)->g4_reladdr 4887c478bd9Sstevel@tonic-gate 4897c478bd9Sstevel@tonic-gate #define FORMG5COUNT(cdb, cnt) (cdb)->scc5_count3 = ((cnt) >> 24); \ 4907c478bd9Sstevel@tonic-gate (cdb)->scc5_count2 = ((cnt) >> 16) & 0xFF; \ 4917c478bd9Sstevel@tonic-gate (cdb)->scc5_count1 = ((cnt) >> 8) & 0xFF; \ 4927c478bd9Sstevel@tonic-gate (cdb)->scc5_count0 = (cnt) & 0xFF 4937c478bd9Sstevel@tonic-gate 4947c478bd9Sstevel@tonic-gate #define FORMG5ADDR(cdb, addr) (cdb)->scc5_addr3 = (addr) >> 24; \ 4957c478bd9Sstevel@tonic-gate (cdb)->scc5_addr2 = ((addr) >> 16) & 0xFF; \ 4967c478bd9Sstevel@tonic-gate (cdb)->scc5_addr1 = ((addr) >> 8) & 0xFF; \ 4977c478bd9Sstevel@tonic-gate (cdb)->scc5_addr0 = (addr) & 0xFF 4987c478bd9Sstevel@tonic-gate 4997c478bd9Sstevel@tonic-gate #define GETG5ADDR(cdb) ((cdb)->scc5_addr3 << 24) + \ 5007c478bd9Sstevel@tonic-gate ((cdb)->scc5_addr2 << 16) + \ 5017c478bd9Sstevel@tonic-gate ((cdb)->scc5_addr1 << 8) + \ 5027c478bd9Sstevel@tonic-gate ((cdb)->scc5_addr0) 5037c478bd9Sstevel@tonic-gate 5048a16ae8fSmcneal #define GETG5COUNT(cdb) ((cdb)->scc5_count3 << 24) + \ 5058a16ae8fSmcneal ((cdb)->scc5_count2 << 16) + \ 5068a16ae8fSmcneal ((cdb)->scc5_count1 << 8) + \ 5078a16ae8fSmcneal ((cdb)->scc5_count0) 5088a16ae8fSmcneal 5097c478bd9Sstevel@tonic-gate #define GETG5TAG(cdb) (cdb)->scc5_reladdr 5107c478bd9Sstevel@tonic-gate 5117c478bd9Sstevel@tonic-gate 5127c478bd9Sstevel@tonic-gate /* 5137c478bd9Sstevel@tonic-gate * Shorthand macros for forming commands 5147c478bd9Sstevel@tonic-gate * 5157c478bd9Sstevel@tonic-gate * Works only with pre-SCSI-3 because they put lun as part of CDB. 5167c478bd9Sstevel@tonic-gate * scsi_setup_cdb() is the recommended interface. 5177c478bd9Sstevel@tonic-gate */ 5187c478bd9Sstevel@tonic-gate 5197c478bd9Sstevel@tonic-gate #define MAKECOM_COMMON(pktp, devp, flag, cmd) \ 5207c478bd9Sstevel@tonic-gate (pktp)->pkt_address = (devp)->sd_address, \ 5217c478bd9Sstevel@tonic-gate (pktp)->pkt_flags = (flag), \ 5227c478bd9Sstevel@tonic-gate ((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_cmd = (cmd), \ 5237c478bd9Sstevel@tonic-gate ((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_lun = \ 5247c478bd9Sstevel@tonic-gate (pktp)->pkt_address.a_lun 5257c478bd9Sstevel@tonic-gate 5267c478bd9Sstevel@tonic-gate #define MAKECOM_G0(pktp, devp, flag, cmd, addr, cnt) \ 5277c478bd9Sstevel@tonic-gate MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 5287c478bd9Sstevel@tonic-gate FORMG0ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \ 5297c478bd9Sstevel@tonic-gate FORMG0COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)) 5307c478bd9Sstevel@tonic-gate 5317c478bd9Sstevel@tonic-gate #define MAKECOM_G0_S(pktp, devp, flag, cmd, cnt, fixbit) \ 5327c478bd9Sstevel@tonic-gate MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 5337c478bd9Sstevel@tonic-gate FORMG0COUNT_S(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)), \ 5347c478bd9Sstevel@tonic-gate ((union scsi_cdb *)(pktp)->pkt_cdbp)->t_code = (fixbit) 5357c478bd9Sstevel@tonic-gate 5367c478bd9Sstevel@tonic-gate #define MAKECOM_G1(pktp, devp, flag, cmd, addr, cnt) \ 5377c478bd9Sstevel@tonic-gate MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 5387c478bd9Sstevel@tonic-gate FORMG1ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \ 5397c478bd9Sstevel@tonic-gate FORMG1COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)) 5407c478bd9Sstevel@tonic-gate 5417c478bd9Sstevel@tonic-gate #define MAKECOM_G5(pktp, devp, flag, cmd, addr, cnt) \ 5427c478bd9Sstevel@tonic-gate MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \ 5437c478bd9Sstevel@tonic-gate FORMG5ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \ 5447c478bd9Sstevel@tonic-gate FORMG5COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)) 5457c478bd9Sstevel@tonic-gate 5467c478bd9Sstevel@tonic-gate 5477c478bd9Sstevel@tonic-gate /* 5487c478bd9Sstevel@tonic-gate * Direct access disk format defines and parameters. 5497c478bd9Sstevel@tonic-gate * 5507c478bd9Sstevel@tonic-gate * This is still pretty ugly and is mostly derived 5517c478bd9Sstevel@tonic-gate * from Emulex MD21 specific formatting. 5527c478bd9Sstevel@tonic-gate */ 5537c478bd9Sstevel@tonic-gate 5547c478bd9Sstevel@tonic-gate #define fmt_parm_bits g0_addr2 /* for format options */ 5557c478bd9Sstevel@tonic-gate #define fmt_interleave g0_count0 /* for encode interleave */ 5567c478bd9Sstevel@tonic-gate #define defect_list_descrip g1_addr3 /* list description bits */ 5577c478bd9Sstevel@tonic-gate 5587c478bd9Sstevel@tonic-gate /* 5597c478bd9Sstevel@tonic-gate * defines for value of fmt_parm_bits. 5607c478bd9Sstevel@tonic-gate */ 5617c478bd9Sstevel@tonic-gate 5627c478bd9Sstevel@tonic-gate #define FPB_BFI 0x04 /* bytes-from-index fmt */ 5637c478bd9Sstevel@tonic-gate #define FPB_CMPLT 0x08 /* full defect list provided */ 5647c478bd9Sstevel@tonic-gate #define FPB_DATA 0x10 /* defect list data provided */ 5657c478bd9Sstevel@tonic-gate 5667c478bd9Sstevel@tonic-gate /* 5677c478bd9Sstevel@tonic-gate * Defines for value of defect_list_descrip. 5687c478bd9Sstevel@tonic-gate */ 5697c478bd9Sstevel@tonic-gate 5707c478bd9Sstevel@tonic-gate #define DLD_MAN_DEF_LIST 0x10 /* manufacturer's defect list */ 5717c478bd9Sstevel@tonic-gate #define DLD_GROWN_DEF_LIST 0x08 /* grown defect list */ 5727c478bd9Sstevel@tonic-gate #define DLD_BLOCK_FORMAT 0x00 /* block format */ 5737c478bd9Sstevel@tonic-gate #define DLD_BFI_FORMAT 0x04 /* bytes-from-index format */ 5747c478bd9Sstevel@tonic-gate #define DLD_PS_FORMAT 0x05 /* physical sector format */ 5757c478bd9Sstevel@tonic-gate 576*5bd3d017SNikko He /* 577*5bd3d017SNikko He * Defines for value of CONTROL byte of cdb. 578*5bd3d017SNikko He */ 579*5bd3d017SNikko He #define CDB_FLAG_NACA 0x04 /* naca flag */ 5807c478bd9Sstevel@tonic-gate 5817c478bd9Sstevel@tonic-gate /* 5827c478bd9Sstevel@tonic-gate * Disk defect list - used by format command. 5837c478bd9Sstevel@tonic-gate */ 5847c478bd9Sstevel@tonic-gate #define RDEF_ALL 0 /* read all defects */ 5857c478bd9Sstevel@tonic-gate #define RDEF_MANUF 1 /* read manufacturer's defects */ 5867c478bd9Sstevel@tonic-gate #define RDEF_CKLEN 2 /* check length of manufacturer's list */ 5877c478bd9Sstevel@tonic-gate #define ST506_NDEFECT 127 /* must fit in 1K controller buffer... */ 5887c478bd9Sstevel@tonic-gate #define ESDI_NDEFECT ST506_NDEFECT 5897c478bd9Sstevel@tonic-gate 5907c478bd9Sstevel@tonic-gate struct scsi_bfi_defect { /* defect in bytes from index format */ 5917c478bd9Sstevel@tonic-gate unsigned cyl : 24; 5927c478bd9Sstevel@tonic-gate unsigned head : 8; 5937c478bd9Sstevel@tonic-gate int bytes_from_index; 5947c478bd9Sstevel@tonic-gate }; 5957c478bd9Sstevel@tonic-gate 5967c478bd9Sstevel@tonic-gate struct scsi_format_params { /* BFI format list */ 5977c478bd9Sstevel@tonic-gate ushort_t reserved; 5987c478bd9Sstevel@tonic-gate ushort_t length; 5997c478bd9Sstevel@tonic-gate struct scsi_bfi_defect list[ESDI_NDEFECT]; 6007c478bd9Sstevel@tonic-gate }; 6017c478bd9Sstevel@tonic-gate 6027c478bd9Sstevel@tonic-gate /* 6037c478bd9Sstevel@tonic-gate * Defect list returned by READ_DEFECT_LIST command. 6047c478bd9Sstevel@tonic-gate */ 6057c478bd9Sstevel@tonic-gate struct scsi_defect_hdr { /* For getting defect list size */ 6067c478bd9Sstevel@tonic-gate uchar_t reserved; 6077c478bd9Sstevel@tonic-gate uchar_t descriptor; 6087c478bd9Sstevel@tonic-gate ushort_t length; 6097c478bd9Sstevel@tonic-gate }; 6107c478bd9Sstevel@tonic-gate 6117c478bd9Sstevel@tonic-gate struct scsi_defect_list { /* BFI format list */ 6127c478bd9Sstevel@tonic-gate uchar_t reserved; 6137c478bd9Sstevel@tonic-gate uchar_t descriptor; 6147c478bd9Sstevel@tonic-gate ushort_t length; 6157c478bd9Sstevel@tonic-gate struct scsi_bfi_defect list[ESDI_NDEFECT]; 6167c478bd9Sstevel@tonic-gate }; 6177c478bd9Sstevel@tonic-gate 6187c478bd9Sstevel@tonic-gate /* 6197c478bd9Sstevel@tonic-gate * 6207c478bd9Sstevel@tonic-gate * Direct Access device Reassign Block parameter 6217c478bd9Sstevel@tonic-gate * 6227c478bd9Sstevel@tonic-gate * Defect list format used by reassign block command (logical block format). 6237c478bd9Sstevel@tonic-gate * 6247c478bd9Sstevel@tonic-gate * This defect list is limited to 1 defect, as that is the only way we use it. 6257c478bd9Sstevel@tonic-gate * 6267c478bd9Sstevel@tonic-gate */ 6277c478bd9Sstevel@tonic-gate 6287c478bd9Sstevel@tonic-gate struct scsi_reassign_blk { 6297c478bd9Sstevel@tonic-gate ushort_t reserved; 6307c478bd9Sstevel@tonic-gate ushort_t length; /* defect length in bytes (defects * 4) */ 6317c478bd9Sstevel@tonic-gate uint_t defect; /* Logical block address of defect */ 6327c478bd9Sstevel@tonic-gate }; 6337c478bd9Sstevel@tonic-gate 6347c478bd9Sstevel@tonic-gate /* 6357c478bd9Sstevel@tonic-gate * Direct Access Device Capacity Structure -- 8 byte version 6367c478bd9Sstevel@tonic-gate */ 6377c478bd9Sstevel@tonic-gate 6387c478bd9Sstevel@tonic-gate struct scsi_capacity { 6397c478bd9Sstevel@tonic-gate uint_t capacity; 6407c478bd9Sstevel@tonic-gate uint_t lbasize; 6417c478bd9Sstevel@tonic-gate }; 6427c478bd9Sstevel@tonic-gate 6437c478bd9Sstevel@tonic-gate /* 6447c478bd9Sstevel@tonic-gate * Direct Access Device Capacity Structure -- 16 byte version 6457c478bd9Sstevel@tonic-gate */ 6467c478bd9Sstevel@tonic-gate 6477c478bd9Sstevel@tonic-gate struct scsi_capacity_16 { 6487c478bd9Sstevel@tonic-gate uint64_t sc_capacity; 6497c478bd9Sstevel@tonic-gate uint_t sc_lbasize; 6507c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_LTOH) 6517c478bd9Sstevel@tonic-gate uchar_t sc_rto_en :1; 6527c478bd9Sstevel@tonic-gate uchar_t sc_prot_en :1; 6537c478bd9Sstevel@tonic-gate uchar_t sc_rsvd0 :6; 6547c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_HTOL) 6557c478bd9Sstevel@tonic-gate uchar_t sc_rsvd0 :6; 6567c478bd9Sstevel@tonic-gate uchar_t sc_prot_en :1; 6577c478bd9Sstevel@tonic-gate uchar_t sc_rto_en :1; 6587c478bd9Sstevel@tonic-gate #else 6597c478bd9Sstevel@tonic-gate #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 6607c478bd9Sstevel@tonic-gate #endif /* _BIT_FIELDS_LTOH */ 6617c478bd9Sstevel@tonic-gate uchar_t sc_rsvd1[19]; 6627c478bd9Sstevel@tonic-gate }; 6637c478bd9Sstevel@tonic-gate 6647c478bd9Sstevel@tonic-gate #ifdef _KERNEL 6657c478bd9Sstevel@tonic-gate 6667c478bd9Sstevel@tonic-gate /* 6677c478bd9Sstevel@tonic-gate * Functional versions of the above macros, and other functions. 6687c478bd9Sstevel@tonic-gate * the makecom functions have been deprecated. Please use 6697c478bd9Sstevel@tonic-gate * scsi_setup_cdb() 6707c478bd9Sstevel@tonic-gate */ 6717c478bd9Sstevel@tonic-gate 6727c478bd9Sstevel@tonic-gate #ifdef __STDC__ 6737c478bd9Sstevel@tonic-gate extern void makecom_g0(struct scsi_pkt *pkt, struct scsi_device *devp, 6747c478bd9Sstevel@tonic-gate int flag, int cmd, int addr, int cnt); 6757c478bd9Sstevel@tonic-gate extern void makecom_g0_s(struct scsi_pkt *pkt, struct scsi_device *devp, 6767c478bd9Sstevel@tonic-gate int flag, int cmd, int cnt, int fixbit); 6777c478bd9Sstevel@tonic-gate extern void makecom_g1(struct scsi_pkt *pkt, struct scsi_device *devp, 6787c478bd9Sstevel@tonic-gate int flag, int cmd, int addr, int cnt); 6797c478bd9Sstevel@tonic-gate extern void makecom_g5(struct scsi_pkt *pkt, struct scsi_device *devp, 6807c478bd9Sstevel@tonic-gate int flag, int cmd, int addr, int cnt); 6817c478bd9Sstevel@tonic-gate extern int scsi_setup_cdb(union scsi_cdb *cdbp, uchar_t cmd, uint_t addr, 6827c478bd9Sstevel@tonic-gate uint_t cnt, uint_t addtl_cdb_data); 6837c478bd9Sstevel@tonic-gate 6847c478bd9Sstevel@tonic-gate #else /* __STDC__ */ 6857c478bd9Sstevel@tonic-gate 6867c478bd9Sstevel@tonic-gate extern void makecom_g0(); 6877c478bd9Sstevel@tonic-gate extern void makecom_g0_s(); 6887c478bd9Sstevel@tonic-gate extern void makecom_g1(); 6897c478bd9Sstevel@tonic-gate extern void makecom_g5(); 6907c478bd9Sstevel@tonic-gate extern int scsi_setup_cdb(); 6917c478bd9Sstevel@tonic-gate 6927c478bd9Sstevel@tonic-gate #endif /* __STDC__ */ 6937c478bd9Sstevel@tonic-gate 6947c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 6957c478bd9Sstevel@tonic-gate 6967c478bd9Sstevel@tonic-gate #ifdef __cplusplus 6977c478bd9Sstevel@tonic-gate } 6987c478bd9Sstevel@tonic-gate #endif 6997c478bd9Sstevel@tonic-gate 7007c478bd9Sstevel@tonic-gate #endif /* _SYS_SCSI_IMPL_COMMANDS_H */ 701