summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/scsi/impl/commands.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/sys/scsi/impl/commands.h')
-rw-r--r--usr/src/uts/common/sys/scsi/impl/commands.h564
1 files changed, 564 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/scsi/impl/commands.h b/usr/src/uts/common/sys/scsi/impl/commands.h
new file mode 100644
index 0000000000..e9c1e35eb5
--- /dev/null
+++ b/usr/src/uts/common/sys/scsi/impl/commands.h
@@ -0,0 +1,564 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SCSI_IMPL_COMMANDS_H
+#define _SYS_SCSI_IMPL_COMMANDS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Implementation dependent command definitions.
+ * This file is included by <sys/scsi/generic/commands.h>
+ */
+
+/*
+ * Implementation dependent view of a SCSI command descriptor block
+ */
+
+/*
+ * Standard SCSI control blocks definitions.
+ *
+ * These go in or out over the SCSI bus.
+ *
+ * The first 8 bits of the command block are the same for all
+ * defined command groups. The first byte is an operation which consists
+ * of a command code component and a group code component.
+ *
+ * The group code determines the length of the rest of the command.
+ * Group 0 commands are 6 bytes, Group 1 and 2 are 10 bytes, Group 4
+ * are 16 bytes, and Group 5 are 12 bytes. Groups 3 is Reserved.
+ * Groups 6 and 7 are Vendor Unique.
+ *
+ */
+#define CDB_SIZE CDB_GROUP5 /* deprecated, do not use */
+#define SCSI_CDB_SIZE CDB_GROUP4 /* sizeof (union scsi_cdb) */
+
+union scsi_cdb { /* scsi command description block */
+ struct {
+ uchar_t cmd; /* cmd code (byte 0) */
+#if defined(_BIT_FIELDS_LTOH)
+ uchar_t tag :5; /* rest of byte 1 */
+ uchar_t lun :3; /* lun (byte 1) (reserved in SCSI-3) */
+#elif defined(_BIT_FIELDS_HTOL)
+ uchar_t lun :3, /* lun (byte 1) (reserved in SCSI-3) */
+ tag :5; /* rest of byte 1 */
+#else
+#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
+#endif /* _BIT_FIELDS_LTOH */
+ union {
+
+ uchar_t scsi[SCSI_CDB_SIZE-2];
+ /*
+ * G R O U P 0 F O R M A T (6 bytes)
+ */
+#define scc_cmd cdb_un.cmd
+#define scc_lun cdb_un.lun
+#define g0_addr2 cdb_un.tag
+#define g0_addr1 cdb_un.sg.g0.addr1
+#define g0_addr0 cdb_un.sg.g0.addr0
+#define g0_count0 cdb_un.sg.g0.count0
+#define g0_vu_1 cdb_un.sg.g0.vu_57
+#define g0_vu_0 cdb_un.sg.g0.vu_56
+#define g0_naca cdb_un.sg.g0.naca
+#define g0_flag cdb_un.sg.g0.flag
+#define g0_link cdb_un.sg.g0.link
+ /*
+ * defines for SCSI tape cdb.
+ */
+#define t_code cdb_un.tag
+#define high_count cdb_un.sg.g0.addr1
+#define mid_count cdb_un.sg.g0.addr0
+#define low_count cdb_un.sg.g0.count0
+ struct scsi_g0 {
+ uchar_t addr1; /* middle part of address */
+ uchar_t addr0; /* low part of address */
+ uchar_t count0; /* usually block count */
+#if defined(_BIT_FIELDS_LTOH)
+ uchar_t link :1; /* another command follows */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t rsvd :3; /* reserved */
+ uchar_t vu_56 :1; /* vendor unique (byte 5 bit6) */
+ uchar_t vu_57 :1; /* vendor unique (byte 5 bit7) */
+#elif defined(_BIT_FIELDS_HTOL)
+ uchar_t vu_57 :1; /* vendor unique (byte 5 bit 7) */
+ uchar_t vu_56 :1; /* vendor unique (byte 5 bit 6) */
+ uchar_t rsvd :3; /* reserved */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t link :1; /* another command follows */
+#else
+#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
+#endif /* _BIT_FIELDS_LTOH */
+ } g0;
+
+
+ /*
+ * G R O U P 1, 2 F O R M A T (10 byte)
+ */
+#define g1_reladdr cdb_un.tag
+#define g1_rsvd0 cdb_un.sg.g1.rsvd1
+#define g1_addr3 cdb_un.sg.g1.addr3 /* msb */
+#define g1_addr2 cdb_un.sg.g1.addr2
+#define g1_addr1 cdb_un.sg.g1.addr1
+#define g1_addr0 cdb_un.sg.g1.addr0 /* lsb */
+#define g1_count1 cdb_un.sg.g1.count1 /* msb */
+#define g1_count0 cdb_un.sg.g1.count0 /* lsb */
+#define g1_vu_1 cdb_un.sg.g1.vu_97
+#define g1_vu_0 cdb_un.sg.g1.vu_96
+#define g1_naca cdb_un.sg.g1.naca
+#define g1_flag cdb_un.sg.g1.flag
+#define g1_link cdb_un.sg.g1.link
+ struct scsi_g1 {
+ uchar_t addr3; /* most sig. byte of address */
+ uchar_t addr2;
+ uchar_t addr1;
+ uchar_t addr0;
+ uchar_t rsvd1; /* reserved (byte 6) */
+ uchar_t count1; /* transfer length (msb) */
+ uchar_t count0; /* transfer length (lsb) */
+#if defined(_BIT_FIELDS_LTOH)
+ uchar_t link :1; /* another command follows */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t rsvd0 :3; /* reserved */
+ uchar_t vu_96 :1; /* vendor unique (byte 9 bit6) */
+ uchar_t vu_97 :1; /* vendor unique (byte 9 bit7) */
+#elif defined(_BIT_FIELDS_HTOL)
+ uchar_t vu_97 :1; /* vendor unique (byte 9 bit 7) */
+ uchar_t vu_96 :1; /* vendor unique (byte 9 bit 6) */
+ uchar_t rsvd0 :3; /* reserved */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t link :1; /* another command follows */
+#else
+#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
+#endif /* _BIT_FIELDS_LTOH */
+ } g1;
+
+ /*
+ * G R O U P 4 F O R M A T (16 byte)
+ */
+#define g4_reladdr cdb_un.tag
+#define g4_addr3 cdb_un.sg.g4.addr3 /* msb */
+#define g4_addr2 cdb_un.sg.g4.addr2
+#define g4_addr1 cdb_un.sg.g4.addr1
+#define g4_addr0 cdb_un.sg.g4.addr0 /* lsb */
+#define g4_addtl_cdb_data3 cdb_un.sg.g4.addtl_cdb_data3
+#define g4_addtl_cdb_data2 cdb_un.sg.g4.addtl_cdb_data2
+#define g4_addtl_cdb_data1 cdb_un.sg.g4.addtl_cdb_data1
+#define g4_addtl_cdb_data0 cdb_un.sg.g4.addtl_cdb_data0
+#define g4_count3 cdb_un.sg.g4.count3 /* msb */
+#define g4_count2 cdb_un.sg.g4.count2
+#define g4_count1 cdb_un.sg.g4.count1
+#define g4_count0 cdb_un.sg.g4.count0 /* lsb */
+#define g4_rsvd0 cdb_un.sg.g4.rsvd1
+#define g4_vu_1 cdb_un.sg.g4.vu_157
+#define g4_vu_0 cdb_un.sg.g4.vu_156
+#define g4_naca cdb_un.sg.g4.naca
+#define g4_flag cdb_un.sg.g4.flag
+#define g4_link cdb_un.sg.g4.link
+ struct scsi_g4 {
+ uchar_t addr3; /* most sig. byte of address */
+ uchar_t addr2;
+ uchar_t addr1;
+ uchar_t addr0;
+ uchar_t addtl_cdb_data3;
+ uchar_t addtl_cdb_data2;
+ uchar_t addtl_cdb_data1;
+ uchar_t addtl_cdb_data0;
+ uchar_t count3; /* transfer length (msb) */
+ uchar_t count2;
+ uchar_t count1;
+ uchar_t count0; /* transfer length (lsb) */
+ uchar_t rsvd1; /* reserved */
+#if defined(_BIT_FIELDS_LTOH)
+ uchar_t link :1; /* another command follows */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t rsvd0 :3; /* reserved */
+ uchar_t vu_156 :1; /* vendor unique (byte 15 bit6) */
+ uchar_t vu_157 :1; /* vendor unique (byte 15 bit7) */
+#elif defined(_BIT_FIELDS_HTOL)
+ uchar_t vu_157 :1; /* vendor unique (byte 15 bit 7) */
+ uchar_t vu_156 :1; /* vendor unique (byte 15 bit 6) */
+ uchar_t rsvd0 :3; /* reserved */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t link :1; /* another command follows */
+#else
+#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
+#endif /* _BIT_FIELDS_LTOH */
+ } g4;
+
+ /*
+ * G R O U P 5 F O R M A T (12 byte)
+ */
+#define scc5_reladdr cdb_un.tag
+#define scc5_addr3 cdb_un.sg.g5.addr3 /* msb */
+#define scc5_addr2 cdb_un.sg.g5.addr2
+#define scc5_addr1 cdb_un.sg.g5.addr1
+#define scc5_addr0 cdb_un.sg.g5.addr0 /* lsb */
+#define scc5_count3 cdb_un.sg.g5.count3 /* msb */
+#define scc5_count2 cdb_un.sg.g5.count2
+#define scc5_count1 cdb_un.sg.g5.count1
+#define scc5_count0 cdb_un.sg.g5.count0 /* lsb */
+#define scc5_rsvd0 cdb_un.sg.g5.rsvd1
+#define scc5_vu_1 cdb_un.sg.g5.v117
+#define scc5_vu_0 cdb_un.sg.g5.v116
+#define scc5_naca cdb_un.sg.g5.naca
+#define scc5_flag cdb_un.sg.g5.flag
+#define scc5_link cdb_un.sg.g5.link
+ struct scsi_g5 {
+ uchar_t addr3; /* most sig. byte of address */
+ uchar_t addr2;
+ uchar_t addr1;
+ uchar_t addr0;
+ uchar_t count3; /* most sig. byte of count */
+ uchar_t count2;
+ uchar_t count1;
+ uchar_t count0;
+ uchar_t rsvd1; /* reserved */
+#if defined(_BIT_FIELDS_LTOH)
+ uchar_t link :1; /* another command follows */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t rsvd0 :3; /* reserved */
+ uchar_t vu_116 :1; /* vendor unique (byte 11 bit6) */
+ uchar_t vu_117 :1; /* vendor unique (byte 11 bit7) */
+#elif defined(_BIT_FIELDS_HTOL)
+ uchar_t vu_117 :1; /* vendor unique (byte 11 bit 7) */
+ uchar_t vu_116 :1; /* vendor unique (byte 11 bit 6) */
+ uchar_t rsvd0 :3; /* reserved */
+ uchar_t naca :1; /* normal ACA */
+ uchar_t flag :1; /* interrupt when done */
+ uchar_t link :1; /* another command follows */
+#else
+#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
+#endif /* _BIT_FIELDS_LTOH */
+ } g5;
+ }sg;
+ } cdb_un;
+ uchar_t cdb_opaque[SCSI_CDB_SIZE]; /* addressed as opaque char array */
+ uint_t cdb_long[SCSI_CDB_SIZE / sizeof (uint_t)]; /* as a word array */
+};
+
+
+/*
+ * Various useful Macros for SCSI commands
+ */
+
+/*
+ * defines for getting/setting fields within the various command groups
+ */
+
+#define GETCMD(cdb) ((cdb)->scc_cmd & 0x1F)
+#define GETGROUP(cdb) (CDB_GROUPID((cdb)->scc_cmd))
+
+#define FORMG0COUNT(cdb, cnt) (cdb)->g0_count0 = (cnt)
+
+#define FORMG0ADDR(cdb, addr) (cdb)->g0_addr2 = (addr) >> 16; \
+ (cdb)->g0_addr1 = ((addr) >> 8) & 0xFF; \
+ (cdb)->g0_addr0 = (addr) & 0xFF
+
+#define GETG0ADDR(cdb) (((cdb)->g0_addr2 & 0x1F) << 16) + \
+ ((cdb)->g0_addr1 << 8) + ((cdb)->g0_addr0)
+
+#define GETG0TAG(cdb) ((cdb)->g0_addr2)
+
+#define FORMG0COUNT_S(cdb, cnt) (cdb)->high_count = (cnt) >> 16; \
+ (cdb)->mid_count = ((cnt) >> 8) & 0xFF; \
+ (cdb)->low_count = (cnt) & 0xFF
+
+#define FORMG1COUNT(cdb, cnt) (cdb)->g1_count1 = ((cnt) >> 8); \
+ (cdb)->g1_count0 = (cnt) & 0xFF
+
+#define FORMG1ADDR(cdb, addr) (cdb)->g1_addr3 = (addr) >> 24; \
+ (cdb)->g1_addr2 = ((addr) >> 16) & 0xFF; \
+ (cdb)->g1_addr1 = ((addr) >> 8) & 0xFF; \
+ (cdb)->g1_addr0 = (addr) & 0xFF
+
+#define GETG1ADDR(cdb) ((cdb)->g1_addr3 << 24) + \
+ ((cdb)->g1_addr2 << 16) + \
+ ((cdb)->g1_addr1 << 8) + \
+ ((cdb)->g1_addr0)
+
+#define GETG1TAG(cdb) (cdb)->g1_reladdr
+
+#define FORMG4COUNT(cdb, cnt) (cdb)->g4_count3 = ((cnt) >> 24); \
+ (cdb)->g4_count2 = ((cnt) >> 16) & 0xFF; \
+ (cdb)->g4_count1 = ((cnt) >> 8) & 0xFF; \
+ (cdb)->g4_count0 = (cnt) & 0xFF
+
+#define FORMG4LONGADDR(cdb, addr) (cdb)->g4_addr3 = (addr) >> 56; \
+ (cdb)->g4_addr2 = \
+ ((addr) >> 48) & 0xFF; \
+ (cdb)->g4_addr1 = \
+ ((addr) >> 40) & 0xFF; \
+ (cdb)->g4_addr0 = \
+ ((addr) >> 32) & 0xFF; \
+ (cdb)->g4_addtl_cdb_data3 = \
+ ((addr) >> 24) & 0xFF; \
+ (cdb)->g4_addtl_cdb_data2 = \
+ ((addr) >> 16) & 0xFF; \
+ (cdb)->g4_addtl_cdb_data1 = \
+ ((addr) >> 8) & 0xFF; \
+ (cdb)->g4_addtl_cdb_data0 = \
+ (addr) & 0xFF
+
+#define FORMG4ADDR(cdb, addr) (cdb)->g4_addr3 = (addr) >> 24; \
+ (cdb)->g4_addr2 = ((addr) >> 16) & 0xFF; \
+ (cdb)->g4_addr1 = ((addr) >> 8) & 0xFF; \
+ (cdb)->g4_addr0 = (addr) & 0xFF
+
+#define FORMG4ADDTL(cdb, addtl_cdb_data) (cdb)->g4_addtl_cdb_data3 = \
+ (addtl_cdb_data) >> 24; \
+ (cdb)->g4_addtl_cdb_data2 = \
+ ((addtl_cdb_data) >> 16) & 0xFF; \
+ (cdb)->g4_addtl_cdb_data1 = \
+ ((addtl_cdb_data) >> 8) & 0xFF; \
+ (cdb)->g4_addtl_cdb_data0 = \
+ (addtl_cdb_data) & 0xFF
+
+#define GETG4ADDR(cdb) ((cdb)->g4_addr3 << 24) + \
+ ((cdb)->g4_addr2 << 16) + \
+ ((cdb)->g4_addr1 << 8) + \
+ ((cdb)->g4_addr0)
+
+#define GETG4ADDRTL(cdb) (((cdb)->g4_addtl_cdb_data3 << 24) + \
+ ((cdb)->g4_addtl_cdb_data2 << 16) + \
+ ((cdb)->g4_addtl_cdb_data1 << 8) + \
+ (cdb)->g4_addtl_cdb_data0)
+
+#define GETG4TAG(cdb) (cdb)->g4_reladdr
+
+#define FORMG5COUNT(cdb, cnt) (cdb)->scc5_count3 = ((cnt) >> 24); \
+ (cdb)->scc5_count2 = ((cnt) >> 16) & 0xFF; \
+ (cdb)->scc5_count1 = ((cnt) >> 8) & 0xFF; \
+ (cdb)->scc5_count0 = (cnt) & 0xFF
+
+#define FORMG5ADDR(cdb, addr) (cdb)->scc5_addr3 = (addr) >> 24; \
+ (cdb)->scc5_addr2 = ((addr) >> 16) & 0xFF; \
+ (cdb)->scc5_addr1 = ((addr) >> 8) & 0xFF; \
+ (cdb)->scc5_addr0 = (addr) & 0xFF
+
+#define GETG5ADDR(cdb) ((cdb)->scc5_addr3 << 24) + \
+ ((cdb)->scc5_addr2 << 16) + \
+ ((cdb)->scc5_addr1 << 8) + \
+ ((cdb)->scc5_addr0)
+
+#define GETG5TAG(cdb) (cdb)->scc5_reladdr
+
+
+/*
+ * Shorthand macros for forming commands
+ *
+ * Works only with pre-SCSI-3 because they put lun as part of CDB.
+ * scsi_setup_cdb() is the recommended interface.
+ */
+
+#define MAKECOM_COMMON(pktp, devp, flag, cmd) \
+ (pktp)->pkt_address = (devp)->sd_address, \
+ (pktp)->pkt_flags = (flag), \
+ ((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_cmd = (cmd), \
+ ((union scsi_cdb *)(pktp)->pkt_cdbp)->scc_lun = \
+ (pktp)->pkt_address.a_lun
+
+#define MAKECOM_G0(pktp, devp, flag, cmd, addr, cnt) \
+ MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \
+ FORMG0ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \
+ FORMG0COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt))
+
+#define MAKECOM_G0_S(pktp, devp, flag, cmd, cnt, fixbit) \
+ MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \
+ FORMG0COUNT_S(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt)), \
+ ((union scsi_cdb *)(pktp)->pkt_cdbp)->t_code = (fixbit)
+
+#define MAKECOM_G1(pktp, devp, flag, cmd, addr, cnt) \
+ MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \
+ FORMG1ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \
+ FORMG1COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt))
+
+#define MAKECOM_G5(pktp, devp, flag, cmd, addr, cnt) \
+ MAKECOM_COMMON((pktp), (devp), (flag), (cmd)), \
+ FORMG5ADDR(((union scsi_cdb *)(pktp)->pkt_cdbp), (addr)), \
+ FORMG5COUNT(((union scsi_cdb *)(pktp)->pkt_cdbp), (cnt))
+
+
+/*
+ * Direct access disk format defines and parameters.
+ *
+ * This is still pretty ugly and is mostly derived
+ * from Emulex MD21 specific formatting.
+ */
+
+#define fmt_parm_bits g0_addr2 /* for format options */
+#define fmt_interleave g0_count0 /* for encode interleave */
+#define defect_list_descrip g1_addr3 /* list description bits */
+
+/*
+ * defines for value of fmt_parm_bits.
+ */
+
+#define FPB_BFI 0x04 /* bytes-from-index fmt */
+#define FPB_CMPLT 0x08 /* full defect list provided */
+#define FPB_DATA 0x10 /* defect list data provided */
+
+/*
+ * Defines for value of defect_list_descrip.
+ */
+
+#define DLD_MAN_DEF_LIST 0x10 /* manufacturer's defect list */
+#define DLD_GROWN_DEF_LIST 0x08 /* grown defect list */
+#define DLD_BLOCK_FORMAT 0x00 /* block format */
+#define DLD_BFI_FORMAT 0x04 /* bytes-from-index format */
+#define DLD_PS_FORMAT 0x05 /* physical sector format */
+
+
+/*
+ * Disk defect list - used by format command.
+ */
+#define RDEF_ALL 0 /* read all defects */
+#define RDEF_MANUF 1 /* read manufacturer's defects */
+#define RDEF_CKLEN 2 /* check length of manufacturer's list */
+#define ST506_NDEFECT 127 /* must fit in 1K controller buffer... */
+#define ESDI_NDEFECT ST506_NDEFECT
+
+struct scsi_bfi_defect { /* defect in bytes from index format */
+ unsigned cyl : 24;
+ unsigned head : 8;
+ int bytes_from_index;
+};
+
+struct scsi_format_params { /* BFI format list */
+ ushort_t reserved;
+ ushort_t length;
+ struct scsi_bfi_defect list[ESDI_NDEFECT];
+};
+
+/*
+ * Defect list returned by READ_DEFECT_LIST command.
+ */
+struct scsi_defect_hdr { /* For getting defect list size */
+ uchar_t reserved;
+ uchar_t descriptor;
+ ushort_t length;
+};
+
+struct scsi_defect_list { /* BFI format list */
+ uchar_t reserved;
+ uchar_t descriptor;
+ ushort_t length;
+ struct scsi_bfi_defect list[ESDI_NDEFECT];
+};
+
+/*
+ *
+ * Direct Access device Reassign Block parameter
+ *
+ * Defect list format used by reassign block command (logical block format).
+ *
+ * This defect list is limited to 1 defect, as that is the only way we use it.
+ *
+ */
+
+struct scsi_reassign_blk {
+ ushort_t reserved;
+ ushort_t length; /* defect length in bytes (defects * 4) */
+ uint_t defect; /* Logical block address of defect */
+};
+
+/*
+ * Direct Access Device Capacity Structure -- 8 byte version
+ */
+
+struct scsi_capacity {
+ uint_t capacity;
+ uint_t lbasize;
+};
+
+/*
+ * Direct Access Device Capacity Structure -- 16 byte version
+ */
+
+struct scsi_capacity_16 {
+ uint64_t sc_capacity;
+ uint_t sc_lbasize;
+#if defined(_BIT_FIELDS_LTOH)
+ uchar_t sc_rto_en :1;
+ uchar_t sc_prot_en :1;
+ uchar_t sc_rsvd0 :6;
+#elif defined(_BIT_FIELDS_HTOL)
+ uchar_t sc_rsvd0 :6;
+ uchar_t sc_prot_en :1;
+ uchar_t sc_rto_en :1;
+#else
+#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
+#endif /* _BIT_FIELDS_LTOH */
+ uchar_t sc_rsvd1[19];
+};
+
+#ifdef _KERNEL
+
+/*
+ * Functional versions of the above macros, and other functions.
+ * the makecom functions have been deprecated. Please use
+ * scsi_setup_cdb()
+ */
+
+#ifdef __STDC__
+extern void makecom_g0(struct scsi_pkt *pkt, struct scsi_device *devp,
+ int flag, int cmd, int addr, int cnt);
+extern void makecom_g0_s(struct scsi_pkt *pkt, struct scsi_device *devp,
+ int flag, int cmd, int cnt, int fixbit);
+extern void makecom_g1(struct scsi_pkt *pkt, struct scsi_device *devp,
+ int flag, int cmd, int addr, int cnt);
+extern void makecom_g5(struct scsi_pkt *pkt, struct scsi_device *devp,
+ int flag, int cmd, int addr, int cnt);
+extern int scsi_setup_cdb(union scsi_cdb *cdbp, uchar_t cmd, uint_t addr,
+ uint_t cnt, uint_t addtl_cdb_data);
+
+#else /* __STDC__ */
+
+extern void makecom_g0();
+extern void makecom_g0_s();
+extern void makecom_g1();
+extern void makecom_g5();
+extern int scsi_setup_cdb();
+
+#endif /* __STDC__ */
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SCSI_IMPL_COMMANDS_H */