summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/scsi/targets/sd.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/scsi/targets/sd.c')
-rw-r--r--usr/src/uts/common/io/scsi/targets/sd.c275
1 files changed, 124 insertions, 151 deletions
diff --git a/usr/src/uts/common/io/scsi/targets/sd.c b/usr/src/uts/common/io/scsi/targets/sd.c
index 6a32c60a35..9800e20a70 100644
--- a/usr/src/uts/common/io/scsi/targets/sd.c
+++ b/usr/src/uts/common/io/scsi/targets/sd.c
@@ -949,7 +949,6 @@ static int sd_pm_idletime = 1;
#define sd_write_label ssd_write_label
#define sd_clear_vtoc ssd_clear_vtoc
#define sd_clear_efi ssd_clear_efi
-#define sd_fill_scsi1_lun ssd_fill_scsi1_lun
#define sd_get_tunables_from_conf ssd_get_tunables_from_conf
#define sd_setup_next_xfer ssd_setup_next_xfer
#define sd_dkio_get_temp ssd_dkio_get_temp
@@ -1055,7 +1054,6 @@ static int sd_spin_up_unit(struct sd_lun *un);
static void sd_enable_descr_sense(struct sd_lun *un);
static void sd_set_mmc_caps(struct sd_lun *un);
-static void sd_fill_scsi1_lun(struct sd_lun *un, struct scsi_pkt *);
static void sd_read_unit_properties(struct sd_lun *un);
static int sd_process_sdconf_file(struct sd_lun *un);
static void sd_get_tunables_from_conf(struct sd_lun *un, int flags,
@@ -2211,17 +2209,6 @@ _info(struct modinfo *modinfop)
}
-static void
-sd_fill_scsi1_lun(struct sd_lun *un, struct scsi_pkt *pktp)
-{
- ASSERT(pktp != NULL);
- if (un->un_f_is_fibre == TRUE) {
- return;
- }
-
- SD_FILL_SCSI1_LUN(SD_SCSI_DEVP(un), pktp);
-}
-
/*
* The following routines implement the driver message logging facility.
* They provide component- and level- based debug output filtering.
@@ -2699,8 +2686,12 @@ sd_scsi_probe_with_cache(struct scsi_device *devp, int (*waitfn)())
{
struct sd_scsi_probe_cache *cp;
dev_info_t *pdip = ddi_get_parent(devp->sd_dev);
- int lun = devp->sd_address.a_lun;
- int tgt = devp->sd_address.a_target;
+ int lun, tgt;
+
+ lun = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS,
+ SCSI_ADDR_PROP_LUN, 0);
+ tgt = ddi_prop_get_int(DDI_DEV_T_ANY, devp->sd_dev, DDI_PROP_DONTPASS,
+ SCSI_ADDR_PROP_TARGET, -1);
/* Make sure caching enabled and target in range */
if ((tgt < 0) || (tgt >= NTARGETS_WIDE)) {
@@ -13039,7 +13030,7 @@ sd_setup_rw_pkt(struct sd_lun *un,
((bp->b_flags & B_READ) ?
SCMD_READ : SCMD_WRITE);
- sd_fill_scsi1_lun(un, return_pktp);
+ SD_FILL_SCSI1_LUN(un, return_pktp);
/*
* Fill in LBA and length
@@ -13140,7 +13131,7 @@ sd_setup_next_rw_pkt(struct sd_lun *un,
}
cdbp->scc_cmd = com;
- sd_fill_scsi1_lun(un, pktp);
+ SD_FILL_SCSI1_LUN(un, pktp);
if (cdb_group_id == CDB_GROUPID_1) {
FORMG1ADDR(cdbp, lba);
FORMG1COUNT(cdbp, blockcount);
@@ -13251,7 +13242,7 @@ sd_initpkt_for_uscsi(struct buf *bp, struct scsi_pkt **pktpp)
(void) scsi_setup_cdb((union scsi_cdb *)pktp->pkt_cdbp,
uscmd->uscsi_cdb[0], 0, 0, 0);
- sd_fill_scsi1_lun(un, pktp);
+ SD_FILL_SCSI1_LUN(un, pktp);
/*
* Set up the optional USCSI flags. See the uscsi (7I) man page
@@ -15394,7 +15385,7 @@ sd_alloc_rqs(struct scsi_device *devp, struct sd_lun *un)
(void) scsi_setup_cdb((union scsi_cdb *)un->un_rqs_pktp->pkt_cdbp,
SCMD_REQUEST_SENSE, 0, SENSE_LENGTH, 0);
- sd_fill_scsi1_lun(un, un->un_rqs_pktp);
+ SD_FILL_SCSI1_LUN(un, un->un_rqs_pktp);
/* Set up the other needed members in the ARQ scsi_pkt. */
un->un_rqs_pktp->pkt_comp = sdintr;
@@ -17245,7 +17236,8 @@ sd_sense_key_not_ready(struct sd_lun *un,
if (un->un_startstop_timeid != NULL) {
SD_INFO(SD_LOG_ERROR, un,
"sd_sense_key_not_ready: restart already issued to"
- " 0x%x : 0x%x\n", SD_TARGET(un), SD_LUN(un));
+ " %s%d\n", ddi_driver_name(SD_DEVINFO(un)),
+ ddi_get_instance(SD_DEVINFO(un)));
break;
}
@@ -18598,7 +18590,7 @@ sd_handle_mchange(struct sd_lun *un)
static int
sd_send_scsi_DOORLOCK(struct sd_lun *un, int flag, int path_flag)
{
- uchar_t cdb_buf[CDB_GROUP0];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
struct scsi_extended_sense sense_buf;
int status;
@@ -18613,14 +18605,14 @@ sd_send_scsi_DOORLOCK(struct sd_lun *un, int flag, int path_flag)
return (0);
}
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
- cdb_buf[0] = SCMD_DOORLOCK;
- cdb_buf[4] = (uchar_t)flag;
+ cdb.scc_cmd = SCMD_DOORLOCK;
+ cdb.cdb_opaque[4] = (uchar_t)flag;
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP0;
ucmd_buf.uscsi_bufaddr = NULL;
ucmd_buf.uscsi_buflen = 0;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -18685,7 +18677,7 @@ sd_send_scsi_READ_CAPACITY(struct sd_lun *un, uint64_t *capp, uint32_t *lbap,
{
struct scsi_extended_sense sense_buf;
struct uscsi_cmd ucmd_buf;
- uchar_t cdb_buf[CDB_GROUP1];
+ union scsi_cdb cdb;
uint32_t *capacity_buf;
uint64_t capacity;
uint32_t lbasize;
@@ -18707,15 +18699,15 @@ sd_send_scsi_READ_CAPACITY(struct sd_lun *un, uint64_t *capp, uint32_t *lbap,
* Medium Indicator bit is cleared. The address field must be
* zero if the PMI bit is zero.
*/
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
capacity_buf = kmem_zalloc(SD_CAPACITY_SIZE, KM_SLEEP);
- cdb_buf[0] = SCMD_READ_CAPACITY;
+ cdb.scc_cmd = SCMD_READ_CAPACITY;
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP1;
ucmd_buf.uscsi_bufaddr = (caddr_t)capacity_buf;
ucmd_buf.uscsi_buflen = SD_CAPACITY_SIZE;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -18890,7 +18882,7 @@ sd_send_scsi_READ_CAPACITY_16(struct sd_lun *un, uint64_t *capp,
{
struct scsi_extended_sense sense_buf;
struct uscsi_cmd ucmd_buf;
- uchar_t cdb_buf[CDB_GROUP4];
+ union scsi_cdb cdb;
uint64_t *capacity16_buf;
uint64_t capacity;
uint32_t lbasize;
@@ -18911,13 +18903,13 @@ sd_send_scsi_READ_CAPACITY_16(struct sd_lun *un, uint64_t *capp,
* Medium Indicator bit is cleared. The address field must be
* zero if the PMI bit is zero.
*/
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
capacity16_buf = kmem_zalloc(SD_CAPACITY_16_SIZE, KM_SLEEP);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP4;
ucmd_buf.uscsi_bufaddr = (caddr_t)capacity16_buf;
ucmd_buf.uscsi_buflen = SD_CAPACITY_16_SIZE;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -18930,16 +18922,13 @@ sd_send_scsi_READ_CAPACITY_16(struct sd_lun *un, uint64_t *capp,
* command byte (0x9E) is overloaded for multiple operations,
* with the second CDB byte specifying the desired operation
*/
- cdb_buf[0] = SCMD_SVC_ACTION_IN_G4;
- cdb_buf[1] = SSVC_ACTION_READ_CAPACITY_G4;
+ cdb.scc_cmd = SCMD_SVC_ACTION_IN_G4;
+ cdb.cdb_opaque[1] = SSVC_ACTION_READ_CAPACITY_G4;
/*
* Fill in allocation length field
*/
- cdb_buf[10] = (uchar_t)((ucmd_buf.uscsi_buflen & 0xff000000) >> 24);
- cdb_buf[11] = (uchar_t)((ucmd_buf.uscsi_buflen & 0x00ff0000) >> 16);
- cdb_buf[12] = (uchar_t)((ucmd_buf.uscsi_buflen & 0x0000ff00) >> 8);
- cdb_buf[13] = (uchar_t)(ucmd_buf.uscsi_buflen & 0x000000ff);
+ FORMG4COUNT(&cdb, ucmd_buf.uscsi_buflen);
status = sd_send_scsi_cmd(SD_GET_DEV(un), &ucmd_buf, UIO_SYSSPACE,
UIO_SYSSPACE, UIO_SYSSPACE, path_flag);
@@ -19050,7 +19039,7 @@ static int
sd_send_scsi_START_STOP_UNIT(struct sd_lun *un, int flag, int path_flag)
{
struct scsi_extended_sense sense_buf;
- uchar_t cdb_buf[CDB_GROUP0];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
int status;
@@ -19066,15 +19055,15 @@ sd_send_scsi_START_STOP_UNIT(struct sd_lun *un, int flag, int path_flag)
return (0);
}
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
- cdb_buf[0] = SCMD_START_STOP;
- cdb_buf[4] |= (uchar_t)flag;
+ cdb.scc_cmd = SCMD_START_STOP;
+ cdb.cdb_opaque[4] = (uchar_t)flag;
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP0;
ucmd_buf.uscsi_bufaddr = NULL;
ucmd_buf.uscsi_buflen = 0;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -19245,7 +19234,7 @@ static int
sd_send_scsi_INQUIRY(struct sd_lun *un, uchar_t *bufaddr, size_t buflen,
uchar_t evpd, uchar_t page_code, size_t *residp)
{
- uchar_t cdb_buf[CDB_GROUP0];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
int status;
@@ -19255,17 +19244,17 @@ sd_send_scsi_INQUIRY(struct sd_lun *un, uchar_t *bufaddr, size_t buflen,
SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_INQUIRY: entry: un:0x%p\n", un);
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(bufaddr, buflen);
- cdb_buf[0] = SCMD_INQUIRY;
- cdb_buf[1] = evpd;
- cdb_buf[2] = page_code;
- cdb_buf[4] = buflen;
+ cdb.scc_cmd = SCMD_INQUIRY;
+ cdb.cdb_opaque[1] = evpd;
+ cdb.cdb_opaque[2] = page_code;
+ FORMG0COUNT(&cdb, buflen);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP0;
ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr;
ucmd_buf.uscsi_buflen = buflen;
ucmd_buf.uscsi_rqbuf = NULL;
@@ -19316,7 +19305,7 @@ static int
sd_send_scsi_TEST_UNIT_READY(struct sd_lun *un, int flag)
{
struct scsi_extended_sense sense_buf;
- uchar_t cdb_buf[CDB_GROUP0];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
int status;
@@ -19345,14 +19334,14 @@ sd_send_scsi_TEST_UNIT_READY(struct sd_lun *un, int flag)
mutex_exit(SD_MUTEX(un));
}
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
- cdb_buf[0] = SCMD_TEST_UNIT_READY;
+ cdb.scc_cmd = SCMD_TEST_UNIT_READY;
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP0;
ucmd_buf.uscsi_bufaddr = NULL;
ucmd_buf.uscsi_buflen = 0;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -19421,8 +19410,8 @@ sd_send_scsi_PERSISTENT_RESERVE_IN(struct sd_lun *un, uchar_t usr_cmd,
uint16_t data_len, uchar_t *data_bufp)
{
struct scsi_extended_sense sense_buf;
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
- uchar_t cdb_buf[CDB_GROUP1];
int status;
int no_caller_buf = FALSE;
@@ -19433,7 +19422,7 @@ sd_send_scsi_PERSISTENT_RESERVE_IN(struct sd_lun *un, uchar_t usr_cmd,
SD_TRACE(SD_LOG_IO, un,
"sd_send_scsi_PERSISTENT_RESERVE_IN: entry: un:0x%p\n", un);
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
if (data_bufp == NULL) {
@@ -19444,13 +19433,12 @@ sd_send_scsi_PERSISTENT_RESERVE_IN(struct sd_lun *un, uchar_t usr_cmd,
no_caller_buf = TRUE;
}
- cdb_buf[0] = SCMD_PERSISTENT_RESERVE_IN;
- cdb_buf[1] = usr_cmd;
- cdb_buf[7] = (uchar_t)(data_len >> 8);
- cdb_buf[8] = (uchar_t)data_len;
+ cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_IN;
+ cdb.cdb_opaque[1] = usr_cmd;
+ FORMG1COUNT(&cdb, data_len);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP1;
ucmd_buf.uscsi_bufaddr = (caddr_t)data_bufp;
ucmd_buf.uscsi_buflen = data_len;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -19522,8 +19510,8 @@ sd_send_scsi_PERSISTENT_RESERVE_OUT(struct sd_lun *un, uchar_t usr_cmd,
uchar_t *usr_bufp)
{
struct scsi_extended_sense sense_buf;
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
- uchar_t cdb_buf[CDB_GROUP1];
int status;
uchar_t data_len = sizeof (sd_prout_t);
sd_prout_t *prp;
@@ -19539,17 +19527,17 @@ sd_send_scsi_PERSISTENT_RESERVE_OUT(struct sd_lun *un, uchar_t usr_cmd,
return (EINVAL);
}
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
prp = kmem_zalloc(data_len, KM_SLEEP);
- cdb_buf[0] = SCMD_PERSISTENT_RESERVE_OUT;
- cdb_buf[1] = usr_cmd;
- cdb_buf[8] = data_len;
+ cdb.scc_cmd = SCMD_PERSISTENT_RESERVE_OUT;
+ cdb.cdb_opaque[1] = usr_cmd;
+ FORMG1COUNT(&cdb, data_len);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP1;
ucmd_buf.uscsi_bufaddr = (caddr_t)prp;
ucmd_buf.uscsi_buflen = data_len;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -19573,7 +19561,7 @@ sd_send_scsi_PERSISTENT_RESERVE_OUT(struct sd_lun *un, uchar_t usr_cmd,
bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
prp->scope_address = BE_32(ptr->scope_specific_addr);
- cdb_buf[2] = ptr->type;
+ cdb.cdb_opaque[2] = ptr->type;
break;
}
case SD_SCSI3_PREEMPTANDABORT: {
@@ -19584,7 +19572,7 @@ sd_send_scsi_PERSISTENT_RESERVE_OUT(struct sd_lun *un, uchar_t usr_cmd,
bcopy(ptr->victim_key.key, prp->service_key,
MHIOC_RESV_KEY_SIZE);
prp->scope_address = BE_32(ptr->resvdesc.scope_specific_addr);
- cdb_buf[2] = ptr->resvdesc.type;
+ cdb.cdb_opaque[2] = ptr->resvdesc.type;
ucmd_buf.uscsi_flags |= USCSI_HEAD;
break;
}
@@ -19650,7 +19638,7 @@ static int
sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un)
{
struct scsi_extended_sense sense_buf;
- uchar_t cdb_buf[CDB_GROUP1];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
int status;
@@ -19660,14 +19648,14 @@ sd_send_scsi_SYNCHRONIZE_CACHE(struct sd_lun *un)
SD_TRACE(SD_LOG_IO, un,
"sd_send_scsi_SYNCHRONIZE_CACHE: entry: un:0x%p\n", un);
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
- cdb_buf[0] = SCMD_SYNCHRONIZE_CACHE;
+ cdb.scc_cmd = SCMD_SYNCHRONIZE_CACHE;
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP1;
ucmd_buf.uscsi_bufaddr = NULL;
ucmd_buf.uscsi_buflen = 0;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -19926,7 +19914,7 @@ sd_send_scsi_MODE_SENSE(struct sd_lun *un, int cdbsize, uchar_t *bufaddr,
size_t buflen, uchar_t page_code, int path_flag)
{
struct scsi_extended_sense sense_buf;
- uchar_t cdb_buf[CDB_GROUP1];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
int status;
@@ -19939,27 +19927,24 @@ sd_send_scsi_MODE_SENSE(struct sd_lun *un, int cdbsize, uchar_t *bufaddr,
SD_TRACE(SD_LOG_IO, un,
"sd_send_scsi_MODE_SENSE: entry: un:0x%p\n", un);
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
bzero(bufaddr, buflen);
if (cdbsize == CDB_GROUP0) {
- cdb_buf[0] = SCMD_MODE_SENSE;
- cdb_buf[2] = page_code;
- cdb_buf[4] = buflen;
+ cdb.scc_cmd = SCMD_MODE_SENSE;
+ cdb.cdb_opaque[2] = page_code;
+ FORMG0COUNT(&cdb, buflen);
} else {
- cdb_buf[0] = SCMD_MODE_SENSE_G1;
- cdb_buf[2] = page_code;
- cdb_buf[7] = (uchar_t)((buflen & 0xFF00) >> 8);
- cdb_buf[8] = (uchar_t)(buflen & 0xFF);
+ cdb.scc_cmd = SCMD_MODE_SENSE_G1;
+ cdb.cdb_opaque[2] = page_code;
+ FORMG1COUNT(&cdb, buflen);
}
- if ((SD_LUN(un) > 0) && (un->un_sd->sd_inq->inq_ansi == 0x01)) {
- cdb_buf[1] |= (SD_LUN(un) << 5);
- }
+ SD_FILL_SCSI1_LUN_CDB(un, &cdb);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize;
ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr;
ucmd_buf.uscsi_buflen = buflen;
@@ -20027,7 +20012,7 @@ sd_send_scsi_MODE_SELECT(struct sd_lun *un, int cdbsize, uchar_t *bufaddr,
size_t buflen, uchar_t save_page, int path_flag)
{
struct scsi_extended_sense sense_buf;
- uchar_t cdb_buf[CDB_GROUP1];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
int status;
@@ -20040,30 +20025,29 @@ sd_send_scsi_MODE_SELECT(struct sd_lun *un, int cdbsize, uchar_t *bufaddr,
SD_TRACE(SD_LOG_IO, un,
"sd_send_scsi_MODE_SELECT: entry: un:0x%p\n", un);
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
- cdb_buf[1] = 0x10; /* Set the PF bit for many third party drives */
+ /* Set the PF bit for many third party drives */
+ cdb.cdb_opaque[1] = 0x10;
+ /* Set the savepage(SP) bit if given */
if (save_page == SD_SAVE_PAGE) {
- cdb_buf[1] |= 0x01; /* Set the savepage(SP) bit if given */
+ cdb.cdb_opaque[1] |= 0x01;
}
if (cdbsize == CDB_GROUP0) {
- cdb_buf[0] = SCMD_MODE_SELECT;
- cdb_buf[4] = buflen;
+ cdb.scc_cmd = SCMD_MODE_SELECT;
+ FORMG0COUNT(&cdb, buflen);
} else {
- cdb_buf[0] = SCMD_MODE_SELECT_G1;
- cdb_buf[7] = (uchar_t)((buflen & 0xFF00) >> 8);
- cdb_buf[8] = (uchar_t)(buflen & 0xFF);
+ cdb.scc_cmd = SCMD_MODE_SELECT_G1;
+ FORMG1COUNT(&cdb, buflen);
}
- if ((SD_LUN(un) > 0) && (un->un_sd->sd_inq->inq_ansi == 0x01)) {
- cdb_buf[1] |= (SD_LUN(un) << 5);
- }
+ SD_FILL_SCSI1_LUN_CDB(un, &cdb);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize;
ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr;
ucmd_buf.uscsi_buflen = buflen;
@@ -20130,13 +20114,12 @@ sd_send_scsi_RDWR(struct sd_lun *un, uchar_t cmd, void *bufaddr,
size_t buflen, daddr_t start_block, int path_flag)
{
struct scsi_extended_sense sense_buf;
- uchar_t cdb_buf[CDB_GROUP4]; /* Use max size */
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
uint32_t block_count;
int status;
int cdbsize;
uchar_t flag;
- int i;
ASSERT(un != NULL);
ASSERT(!mutex_owned(SD_MUTEX(un)));
@@ -20159,7 +20142,7 @@ sd_send_scsi_RDWR(struct sd_lun *un, uchar_t cmd, void *bufaddr,
"bufaddr:0x%p buflen:0x%x start_block:0x%p block_count:0x%x\n",
bufaddr, buflen, start_block, block_count);
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
@@ -20174,33 +20157,19 @@ sd_send_scsi_RDWR(struct sd_lun *un, uchar_t cmd, void *bufaddr,
switch (cdbsize) {
case CDB_GROUP0: /* 6-byte CDBs */
- cdb_buf[0] = cmd;
- cdb_buf[1] = (uchar_t)((start_block & 0x001F0000) >> 16);
- cdb_buf[2] = (uchar_t)((start_block & 0x0000FF00) >> 8);
- cdb_buf[3] = (uchar_t)(start_block & 0x000000FF);
- cdb_buf[4] = (uchar_t)(block_count & 0xFF);
+ cdb.scc_cmd = cmd;
+ FORMG0ADDR(&cdb, start_block);
+ FORMG0COUNT(&cdb, block_count);
break;
case CDB_GROUP1: /* 10-byte CDBs */
- cdb_buf[0] = cmd | SCMD_GROUP1;
- cdb_buf[2] = (uchar_t)((start_block & 0xFF000000) >> 24);
- cdb_buf[3] = (uchar_t)((start_block & 0x00FF0000) >> 16);
- cdb_buf[4] = (uchar_t)((start_block & 0x0000FF00) >> 8);
- cdb_buf[5] = (uchar_t)(start_block & 0x000000FF);
- cdb_buf[7] = (uchar_t)((block_count & 0xFF00) >> 8);
- cdb_buf[8] = (uchar_t)(block_count & 0xFF);
+ cdb.scc_cmd = cmd | SCMD_GROUP1;
+ FORMG1ADDR(&cdb, start_block);
+ FORMG1COUNT(&cdb, block_count);
break;
case CDB_GROUP4: /* 16-byte CDBs */
- cdb_buf[0] = cmd | SCMD_GROUP4;
- /* Block address is in bytes 2 - 9 */
- for (i = 9; i > 1; i--) {
- cdb_buf[i] = (uchar_t)(start_block & 0xFF);
- start_block >>= 8;
- }
- /* Block count is in bytes 10 - 13 */
- for (i = 13; i > 9; i--) {
- cdb_buf[i] = (uchar_t)(block_count & 0xFF);
- block_count >>= 8;
- }
+ cdb.scc_cmd = cmd | SCMD_GROUP4;
+ FORMG4LONGADDR(&cdb, (uint64_t)start_block);
+ FORMG4COUNT(&cdb, block_count);
break;
case CDB_GROUP5: /* 12-byte CDBs (currently unsupported) */
default:
@@ -20209,11 +20178,9 @@ sd_send_scsi_RDWR(struct sd_lun *un, uchar_t cmd, void *bufaddr,
}
/* Set LUN bit(s) in CDB if this is a SCSI-1 device */
- if ((SD_LUN(un) > 0) && (un->un_sd->sd_inq->inq_ansi == 0x01)) {
- cdb_buf[1] |= (SD_LUN(un) << 5);
- }
+ SD_FILL_SCSI1_LUN_CDB(un, &cdb);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
ucmd_buf.uscsi_cdblen = (uchar_t)cdbsize;
ucmd_buf.uscsi_bufaddr = bufaddr;
ucmd_buf.uscsi_buflen = buflen;
@@ -20270,7 +20237,7 @@ sd_send_scsi_LOG_SENSE(struct sd_lun *un, uchar_t *bufaddr, uint16_t buflen,
{
struct scsi_extended_sense sense_buf;
- uchar_t cdb_buf[CDB_GROUP1];
+ union scsi_cdb cdb;
struct uscsi_cmd ucmd_buf;
int status;
@@ -20279,19 +20246,18 @@ sd_send_scsi_LOG_SENSE(struct sd_lun *un, uchar_t *bufaddr, uint16_t buflen,
SD_TRACE(SD_LOG_IO, un, "sd_send_scsi_LOG_SENSE: entry: un:0x%p\n", un);
- bzero(cdb_buf, sizeof (cdb_buf));
+ bzero(&cdb, sizeof (cdb));
bzero(&ucmd_buf, sizeof (ucmd_buf));
bzero(&sense_buf, sizeof (struct scsi_extended_sense));
- cdb_buf[0] = SCMD_LOG_SENSE_G1;
- cdb_buf[2] = (page_control << 6) | page_code;
- cdb_buf[5] = (uchar_t)((param_ptr & 0xFF00) >> 8);
- cdb_buf[6] = (uchar_t)(param_ptr & 0x00FF);
- cdb_buf[7] = (uchar_t)((buflen & 0xFF00) >> 8);
- cdb_buf[8] = (uchar_t)(buflen & 0x00FF);
+ cdb.scc_cmd = SCMD_LOG_SENSE_G1;
+ cdb.cdb_opaque[2] = (page_control << 6) | page_code;
+ cdb.cdb_opaque[5] = (uchar_t)((param_ptr & 0xFF00) >> 8);
+ cdb.cdb_opaque[6] = (uchar_t)(param_ptr & 0x00FF);
+ FORMG1COUNT(&cdb, buflen);
- ucmd_buf.uscsi_cdb = (char *)cdb_buf;
- ucmd_buf.uscsi_cdblen = sizeof (cdb_buf);
+ ucmd_buf.uscsi_cdb = (char *)&cdb;
+ ucmd_buf.uscsi_cdblen = CDB_GROUP1;
ucmd_buf.uscsi_bufaddr = (caddr_t)bufaddr;
ucmd_buf.uscsi_buflen = buflen;
ucmd_buf.uscsi_rqbuf = (caddr_t)&sense_buf;
@@ -20339,7 +20305,8 @@ sd_send_scsi_LOG_SENSE(struct sd_lun *un, uchar_t *bufaddr, uint16_t buflen,
mutex_enter(SD_MUTEX(un));
un->un_start_stop_cycle_page =
START_STOP_CYCLE_VU_PAGE;
- cdb_buf[2] = (char)(page_control << 6) |
+ cdb.cdb_opaque[2] =
+ (char)(page_control << 6) |
un->un_start_stop_cycle_page;
mutex_exit(SD_MUTEX(un));
status = sd_send_scsi_cmd(
@@ -21541,6 +21508,7 @@ sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag)
struct sd_lun *un = NULL;
struct dk_cinfo *info;
dev_info_t *pdip;
+ int lun, tgt;
if ((un = ddi_get_soft_state(sd_state, SDUNIT(dev))) == NULL) {
return (ENXIO);
@@ -21566,9 +21534,14 @@ sd_dkio_ctrl_info(dev_t dev, caddr_t arg, int flag)
DK_DEVLEN - 1);
}
+ lun = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
+ DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0);
+ tgt = ddi_prop_get_int(DDI_DEV_T_ANY, SD_DEVINFO(un),
+ DDI_PROP_DONTPASS, SCSI_ADDR_PROP_TARGET, 0);
+
/* Unit Information */
info->dki_unit = ddi_get_instance(SD_DEVINFO(un));
- info->dki_slave = ((SD_TARGET(un) << 3) | SD_LUN(un));
+ info->dki_slave = ((tgt << 3) | lun);
(void) strncpy(info->dki_dname, ddi_driver_name(SD_DEVINFO(un)),
DK_DEVLEN - 1);
info->dki_flags = DKI_FMTVOL;
@@ -25452,7 +25425,7 @@ sddump(dev_t dev, caddr_t addr, daddr_t blkno, int nblk)
start_pktp->pkt_flags = FLAG_NOINTR;
mutex_enter(SD_MUTEX(un));
- sd_fill_scsi1_lun(un, start_pktp);
+ SD_FILL_SCSI1_LUN(un, start_pktp);
mutex_exit(SD_MUTEX(un));
/*
* Scsi_poll returns 0 (success) if the command completes and