summaryrefslogtreecommitdiffstats
path: root/sys/cam
diff options
context:
space:
mode:
authorbms <bms@FreeBSD.org>2004-10-12 08:55:02 +0000
committerbms <bms@FreeBSD.org>2004-10-12 08:55:02 +0000
commit29ae8584ac3ebb3cc6c0171ad3e985c09ed6de22 (patch)
tree6c38a860d1b47a546d4c462d67c1253b2e23b097 /sys/cam
parent96a2d5c3cfa5f416618b57549d045c9ac30ff09a (diff)
downloadFreeBSD-src-29ae8584ac3ebb3cc6c0171ad3e985c09ed6de22.zip
FreeBSD-src-29ae8584ac3ebb3cc6c0171ad3e985c09ed6de22.tar.gz
Add necessary data structures and definitions for the 12-byte SCSI
commands READ_FORMAT_CAPACITIES, WRITE_AND_VERIFY, and VERIFY. Reviewed by: ken, scottl Source: USB Mass Storage UFI Specification v1.0 MFC after: 2 weeks
Diffstat (limited to 'sys/cam')
-rw-r--r--sys/cam/scsi/scsi_da.h79
1 files changed, 79 insertions, 0 deletions
diff --git a/sys/cam/scsi/scsi_da.h b/sys/cam/scsi/scsi_da.h
index 994eb03..ea250b3 100644
--- a/sys/cam/scsi/scsi_da.h
+++ b/sys/cam/scsi/scsi_da.h
@@ -151,6 +151,9 @@ struct scsi_read_defect_data_12
#define REASSIGN_BLOCKS 0x07
#define MODE_SELECT 0x15
#define MODE_SENSE 0x1a
+#define READ_FORMAT_CAPACITIES 0x23
+#define WRITE_AND_VERIFY 0x2e
+#define VERIFY 0x2f
#define READ_DEFECT_DATA_10 0x37
#define READ_DEFECT_DATA_12 0xb7
@@ -182,6 +185,82 @@ struct format_ipat_descriptor
u_int8_t pat_length[2];
};
+struct scsi_read_format_capacities
+{
+ uint8_t opcode; /* READ_FORMAT_CAPACITIES */
+ uint8_t byte2; /* top 3 bits contain LUN */
+#define SRFC_LUN_MASK 0xE0
+ uint8_t reserved0[5];
+ uint8_t alloc_length[2];
+ uint8_t reserved1[3];
+};
+
+struct scsi_verify
+{
+ uint8_t opcode; /* VERIFY */
+ uint8_t lun; /* All other bits should be zero */
+#define SVFY_RELADR 0x01
+#define SVFY_BYTECHK 0x02
+#define SVFY_DPO 0x10
+#define SVFY_LUN_MASK 0xE0 /* Top 3 MSBs are LUN */
+ uint8_t addr[4]; /* LBA to begin verification at */
+ uint8_t reserved0[1];
+ uint8_t len[2]; /* number of blocks to verify */
+ uint8_t reserved1[3];
+};
+
+struct scsi_write_and_verify
+{
+ uint8_t opcode; /* WRITE_AND_VERIFY */
+ uint8_t byte2; /* top 3 bits are the LUN */
+#define SWVY_LUN_MASK 0xE0
+#define SWVY_RELADR 0x01
+#define SWVY_BYTECHK 0x02
+#define SWVY_DPO 0x10
+ uint8_t addr[4]; /* LBA to begin verification at */
+ uint8_t reserved0[1];
+ uint8_t len[2]; /* number of blocks to write and verify */
+ uint8_t reserved1[3];
+};
+
+/*
+ * Replies to READ_FORMAT_CAPACITIES look like this:
+ *
+ * struct format_capacity_list_header
+ * struct format_capacity_descriptor[1..n]
+ *
+ * These are similar, but not totally identical to, the
+ * defect list used to format a rigid disk.
+ *
+ * The appropriate csio_decode() format string looks like this:
+ * "{} *i3 {Len} i1 {Blocks} i4 {} *b6 {Code} b2 {Blocklen} i3"
+ *
+ * If the capacity_list_length is greater than
+ * sizeof(struct format_capacity_descriptor), then there are
+ * additional format capacity descriptors available which
+ * denote which format(s) the drive can handle.
+ *
+ * (Source: USB Mass Storage UFI Specification)
+ */
+
+struct format_capacity_list_header {
+ uint8_t unused[3];
+ uint8_t capacity_list_length;
+};
+
+struct format_capacity_descriptor {
+ uint8_t nblocks[4]; /* total number of LBAs */
+ uint8_t byte4; /* only present in max/cur descriptor */
+#define FCD_CODE_MASK 0x03 /* mask for code field above */
+#define FCD_UNFORMATTED 0x01 /* unformatted media present,
+ * maximum capacity returned */
+#define FCD_FORMATTED 0x02 /* formatted media present,
+ * current capacity returned */
+#define FCD_NOMEDIA 0x03 /* no media present,
+ * maximum device capacity returned */
+ uint8_t block_length[3]; /* length of an LBA in bytes */
+};
+
struct scsi_reassign_blocks_data
{
u_int8_t reserved[2];
OpenPOWER on IntegriCloud