summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/cam/scsi/scsi_all.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/cam/scsi/scsi_all.c')
-rw-r--r--freebsd/sys/cam/scsi/scsi_all.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/freebsd/sys/cam/scsi/scsi_all.c b/freebsd/sys/cam/scsi/scsi_all.c
index 36757230..3aab5aab 100644
--- a/freebsd/sys/cam/scsi/scsi_all.c
+++ b/freebsd/sys/cam/scsi/scsi_all.c
@@ -382,7 +382,7 @@ static struct op_table_entry scsi_op_codes[] = {
{ 0x40, D | T | L | P | W | R | O | M | S | C, "CHANGE DEFINITION" },
/* 41 O WRITE SAME(10) */
{ 0x41, D, "WRITE SAME(10)" },
- /* 42 O UNMAP */
+ /* 42 O UNMAP */
{ 0x42, D, "UNMAP" },
/* 42 O READ SUB-CHANNEL */
{ 0x42, R, "READ SUB-CHANNEL" },
@@ -397,7 +397,8 @@ static struct op_table_entry scsi_op_codes[] = {
{ 0x46, R, "GET CONFIGURATION" },
/* 47 O PLAY AUDIO MSF */
{ 0x47, R, "PLAY AUDIO MSF" },
- /* 48 */
+ /* 48 O SANITIZE */
+ { 0x48, D, "SANITIZE" },
/* 49 */
/* 4A M GET EVENT STATUS NOTIFICATION */
{ 0x4A, R, "GET EVENT STATUS NOTIFICATION" },
@@ -1165,10 +1166,10 @@ static struct asc_table_entry asc_table[] = {
{ SST(0x04, 0x1A, SS_RDEF, /* XXX TBD */
"Logical unit not ready, START/STOP UNIT command in progress") },
/* D B */
- { SST(0x04, 0x1B, SS_RDEF, /* XXX TBD */
+ { SST(0x04, 0x1B, SS_WAIT | EBUSY,
"Logical unit not ready, sanitize in progress") },
/* DT MAEB */
- { SST(0x04, 0x1C, SS_RDEF, /* XXX TBD */
+ { SST(0x04, 0x1C, SS_START | SSQ_DECREMENT_COUNT | ENXIO,
"Logical unit not ready, additional power use not yet granted") },
/* D */
{ SST(0x04, 0x1D, SS_RDEF, /* XXX TBD */
@@ -1456,7 +1457,7 @@ static struct asc_table_entry asc_table[] = {
{ SST(0x11, 0x14, SS_RDEF, /* XXX TBD */
"Read error - LBA marked bad by application client") },
/* D */
- { SST(0x11, 0x15, SS_RDEF, /* XXX TBD */
+ { SST(0x11, 0x15, SS_FATAL | EIO,
"Write after sanitize required") },
/* D W O BK */
{ SST(0x12, 0x00, SS_RDEF,
@@ -2067,7 +2068,7 @@ static struct asc_table_entry asc_table[] = {
{ SST(0x31, 0x02, SS_RDEF, /* XXX TBD */
"Zoned formatting failed due to spare linking") },
/* D B */
- { SST(0x31, 0x03, SS_RDEF, /* XXX TBD */
+ { SST(0x31, 0x03, SS_FATAL | EIO,
"SANITIZE command failed") },
/* D W O BK */
{ SST(0x32, 0x00, SS_RDEF,
@@ -8400,6 +8401,38 @@ scsi_ata_read_log(struct ccb_scsiio *csio, uint32_t retries,
return (retval);
}
+int scsi_ata_setfeatures(struct ccb_scsiio *csio, uint32_t retries,
+ void (*cbfcnp)(struct cam_periph *, union ccb *),
+ uint8_t tag_action, uint8_t feature,
+ uint64_t lba, uint32_t count,
+ uint8_t sense_len, uint32_t timeout)
+{
+ return (scsi_ata_pass(csio,
+ retries,
+ cbfcnp,
+ /*flags*/CAM_DIR_NONE,
+ tag_action,
+ /*protocol*/AP_PROTO_PIO_IN,
+ /*ata_flags*/AP_FLAG_TDIR_FROM_DEV |
+ AP_FLAG_BYT_BLOK_BYTES |
+ AP_FLAG_TLEN_SECT_CNT,
+ /*features*/feature,
+ /*sector_count*/count,
+ /*lba*/lba,
+ /*command*/ATA_SETFEATURES,
+ /*device*/ 0,
+ /*icc*/ 0,
+ /*auxiliary*/0,
+ /*control*/0,
+ /*data_ptr*/NULL,
+ /*dxfer_len*/0,
+ /*cdb_storage*/NULL,
+ /*cdb_storage_len*/0,
+ /*minimum_cmd_size*/0,
+ sense_len,
+ timeout));
+}
+
/*
* Note! This is an unusual CDB building function because it can return
* an error in the event that the command in question requires a variable