summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatthew <matthew@openbsd.org>2010-08-30 02:47:56 +0000
committermatthew <matthew@openbsd.org>2010-08-30 02:47:56 +0000
commit49227f1aaa3eead5f133aa4334dea8b7803a10ed (patch)
tree87099badd1430e57f158f5f73623eb0597845221
parentadd one airport... anyone want to maintain this? (diff)
downloadwireguard-openbsd-49227f1aaa3eead5f133aa4334dea8b7803a10ed.tar.xz
wireguard-openbsd-49227f1aaa3eead5f133aa4334dea8b7803a10ed.zip
Avoid possible aliasing-related compiler issues by always writing to
cmd->opcode through the type casted command pointer rather than through xs->cmd->opcode. Requested by deraadt@; ok krw@.
-rw-r--r--sys/scsi/cd.c105
-rw-r--r--sys/scsi/ch.c10
-rw-r--r--sys/scsi/safte.c10
-rw-r--r--sys/scsi/scsi_base.c28
-rw-r--r--sys/scsi/ses.c8
-rw-r--r--sys/scsi/st.c18
6 files changed, 95 insertions, 84 deletions
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c
index dfdef0f0f1a..22fb8542f13 100644
--- a/sys/scsi/cd.c
+++ b/sys/scsi/cd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cd.c,v 1.182 2010/08/28 20:23:22 matthew Exp $ */
+/* $OpenBSD: cd.c,v 1.183 2010/08/30 02:47:56 matthew Exp $ */
/* $NetBSD: cd.c,v 1.100 1997/04/02 02:29:30 mycroft Exp $ */
/*
@@ -1350,11 +1350,11 @@ cd_load_unload(struct cd_softc *sc, int options, int slot)
xs = scsi_xs_get(sc->sc_link, 0);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = LOAD_UNLOAD;
xs->cmdlen = sizeof(*cmd);
xs->timeout = 200000;
cmd = (struct scsi_load_unload *)xs->cmd;
+ cmd->opcode = LOAD_UNLOAD;
cmd->options = options; /* ioctl uses ATAPI values */
cmd->slot = slot;
@@ -1415,11 +1415,11 @@ cd_play(struct cd_softc *sc, int blkno, int nblks)
xs = scsi_xs_get(sc->sc_link, 0);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = PLAY;
xs->cmdlen = sizeof(*cmd);
xs->timeout = 200000;
cmd = (struct scsi_play *)xs->cmd;
+ cmd->opcode = PLAY;
_lto4b(blkno, cmd->blk_addr);
_lto2b(nblks, cmd->xfer_len);
@@ -1502,11 +1502,11 @@ cd_play_msf(struct cd_softc *sc, int startm, int starts, int startf, int endm,
xs = scsi_xs_get(sc->sc_link, 0);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = PLAY_MSF;
xs->cmdlen = sizeof(*cmd);
xs->timeout = 20000;
cmd = (struct scsi_play_msf *)xs->cmd;
+ cmd->opcode = PLAY_MSF;
cmd->start_m = startm;
cmd->start_s = starts;
cmd->start_f = startf;
@@ -1533,11 +1533,11 @@ cd_pause(struct cd_softc *sc, int go)
xs = scsi_xs_get(sc->sc_link, 0);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = PAUSE;
xs->cmdlen = sizeof(*cmd);
xs->timeout = 2000;
cmd = (struct scsi_pause *)xs->cmd;
+ cmd->opcode = PAUSE;
cmd->resume = go;
error = scsi_xs_sync(xs);
@@ -1581,13 +1581,13 @@ cd_read_subchannel(struct cd_softc *sc, int mode, int format, int track,
xs = scsi_xs_get(sc->sc_link, SCSI_DATA_IN | SCSI_SILENT);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = READ_SUBCHANNEL;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)data;
xs->datalen = len;
xs->timeout = 5000;
cmd = (struct scsi_read_subchannel *)xs->cmd;
+ cmd->opcode = READ_SUBCHANNEL;
if (mode == CD_MSF_FORMAT)
cmd->byte2 |= CD_MSF;
cmd->byte3 = SRS_SUBQ;
@@ -1616,7 +1616,6 @@ cd_read_toc(struct cd_softc *sc, int mode, int start, void *data, int len,
SCSI_IGNORE_ILLEGAL_REQUEST);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = READ_TOC;
xs->cmdlen = sizeof(*cmd);
xs->data = data;
xs->datalen = len;
@@ -1625,6 +1624,7 @@ cd_read_toc(struct cd_softc *sc, int mode, int start, void *data, int len,
bzero(data, len);
cmd = (struct scsi_read_toc *)xs->cmd;
+ cmd->opcode = READ_TOC;
if (mode == CD_MSF_FORMAT)
cmd->byte2 |= CD_MSF;
@@ -1720,11 +1720,13 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
bzero(buf, sizeof(buf));
+ cmd = xs->cmd;
+
switch (a->type) {
case DVD_LU_SEND_AGID:
- xs->cmd->opcode = GPCMD_REPORT_KEY;
- xs->cmd->bytes[8] = 8;
- xs->cmd->bytes[9] = 0 | (0 << 6);
+ cmd->opcode = GPCMD_REPORT_KEY;
+ cmd->bytes[8] = 8;
+ cmd->bytes[9] = 0 | (0 << 6);
xs->datalen = 8;
xs->flags |= SCSI_DATA_IN;
@@ -1736,9 +1738,9 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_LU_SEND_CHALLENGE:
- xs->cmd->opcode = GPCMD_REPORT_KEY;
- xs->cmd->bytes[8] = 16;
- xs->cmd->bytes[9] = 1 | (a->lsc.agid << 6);
+ cmd->opcode = GPCMD_REPORT_KEY;
+ cmd->bytes[8] = 16;
+ cmd->bytes[9] = 1 | (a->lsc.agid << 6);
xs->datalen = 16;
xs->flags |= SCSI_DATA_IN;
@@ -1749,9 +1751,9 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_LU_SEND_KEY1:
- xs->cmd->opcode = GPCMD_REPORT_KEY;
- xs->cmd->bytes[8] = 12;
- xs->cmd->bytes[9] = 2 | (a->lsk.agid << 6);
+ cmd->opcode = GPCMD_REPORT_KEY;
+ cmd->bytes[8] = 12;
+ cmd->bytes[9] = 2 | (a->lsk.agid << 6);
xs->datalen = 12;
xs->flags |= SCSI_DATA_IN;
@@ -1763,10 +1765,10 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_LU_SEND_TITLE_KEY:
- xs->cmd->opcode = GPCMD_REPORT_KEY;
- _lto4b(a->lstk.lba, &xs->cmd->bytes[1]);
- xs->cmd->bytes[8] = 12;
- xs->cmd->bytes[9] = 4 | (a->lstk.agid << 6);
+ cmd->opcode = GPCMD_REPORT_KEY;
+ _lto4b(a->lstk.lba, &cmd->bytes[1]);
+ cmd->bytes[8] = 12;
+ cmd->bytes[9] = 4 | (a->lstk.agid << 6);
xs->datalen = 12;
xs->flags |= SCSI_DATA_IN;
@@ -1782,9 +1784,9 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_LU_SEND_ASF:
- xs->cmd->opcode = GPCMD_REPORT_KEY;
- xs->cmd->bytes[8] = 8;
- xs->cmd->bytes[9] = 5 | (a->lsasf.agid << 6);
+ cmd->opcode = GPCMD_REPORT_KEY;
+ cmd->bytes[8] = 8;
+ cmd->bytes[9] = 5 | (a->lsasf.agid << 6);
xs->datalen = 8;
xs->flags |= SCSI_DATA_IN;
@@ -1796,9 +1798,9 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_HOST_SEND_CHALLENGE:
- xs->cmd->opcode = GPCMD_SEND_KEY;
- xs->cmd->bytes[8] = 16;
- xs->cmd->bytes[9] = 1 | (a->hsc.agid << 6);
+ cmd->opcode = GPCMD_SEND_KEY;
+ cmd->bytes[8] = 16;
+ cmd->bytes[9] = 1 | (a->hsc.agid << 6);
buf[1] = 14;
dvd_copy_challenge(&buf[4], a->hsc.chal);
xs->datalen = 16;
@@ -1812,9 +1814,9 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_HOST_SEND_KEY2:
- xs->cmd->opcode = GPCMD_SEND_KEY;
- xs->cmd->bytes[8] = 12;
- xs->cmd->bytes[9] = 3 | (a->hsk.agid << 6);
+ cmd->opcode = GPCMD_SEND_KEY;
+ cmd->bytes[8] = 12;
+ cmd->bytes[9] = 3 | (a->hsk.agid << 6);
buf[1] = 10;
dvd_copy_key(&buf[4], a->hsk.key);
xs->datalen = 12;
@@ -1830,8 +1832,8 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_INVALIDATE_AGID:
- xs->cmd->opcode = GPCMD_REPORT_KEY;
- xs->cmd->bytes[9] = 0x3f | (a->lsa.agid << 6);
+ cmd->opcode = GPCMD_REPORT_KEY;
+ cmd->bytes[9] = 0x3f | (a->lsa.agid << 6);
xs->data = NULL;
error = scsi_xs_sync(xs);
@@ -1840,9 +1842,9 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_LU_SEND_RPC_STATE:
- xs->cmd->opcode = GPCMD_REPORT_KEY;
- xs->cmd->bytes[8] = 8;
- xs->cmd->bytes[9] = 8 | (0 << 6);
+ cmd->opcode = GPCMD_REPORT_KEY;
+ cmd->bytes[8] = 8;
+ cmd->bytes[9] = 8 | (0 << 6);
xs->datalen = 8;
xs->flags |= SCSI_DATA_IN;
@@ -1859,9 +1861,9 @@ dvd_auth(struct cd_softc *sc, union dvd_authinfo *a)
return (error);
case DVD_HOST_SEND_RPC_STATE:
- xs->cmd->opcode = GPCMD_SEND_KEY;
- xs->cmd->bytes[8] = 8;
- xs->cmd->bytes[9] = 6 | (0 << 6);
+ cmd->opcode = GPCMD_SEND_KEY;
+ cmd->bytes[8] = 8;
+ cmd->bytes[9] = 6 | (0 << 6);
buf[1] = 6;
buf[4] = a->hrpcs.pdrc;
xs->datalen = 8;
@@ -1890,7 +1892,6 @@ dvd_read_physical(struct cd_softc *sc, union dvd_struct *s)
xs = scsi_xs_get(sc->sc_link, SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
xs->cmdlen = sizeof(*cmd);
xs->data = buf;
xs->datalen = sizeof(buf);
@@ -1898,10 +1899,12 @@ dvd_read_physical(struct cd_softc *sc, union dvd_struct *s)
bzero(buf, sizeof(buf));
- xs->cmd->bytes[6] = s->type;
- _lto2b(sizeof(buf), &xs->cmd->bytes[7]);
+ cmd = xs->cmd;
+ cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
+ cmd->bytes[6] = s->type;
+ _lto2b(sizeof(buf), &cmd->bytes[7]);
- xs->cmd->bytes[5] = s->physical.layer_num;
+ cmd->bytes[5] = s->physical.layer_num;
error = scsi_xs_sync(xs);
scsi_xs_put(xs);
@@ -1939,7 +1942,6 @@ dvd_read_copyright(struct cd_softc *sc, union dvd_struct *s)
xs = scsi_xs_get(sc->sc_link, SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
xs->cmdlen = sizeof(*cmd);
xs->data = buf;
xs->datalen = sizeof(buf);
@@ -1947,10 +1949,12 @@ dvd_read_copyright(struct cd_softc *sc, union dvd_struct *s)
bzero(buf, sizeof(buf));
- xs->cmd->bytes[6] = s->type;
- _lto2b(sizeof(buf), &xs->cmd->bytes[7]);
+ cmd = xs->cmd;
+ cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
+ cmd->bytes[6] = s->type;
+ _lto2b(sizeof(buf), &cmd->bytes[7]);
- xs->cmd->bytes[5] = s->copyright.layer_num;
+ cmd->bytes[5] = s->copyright.layer_num;
error = scsi_xs_sync(xs);
scsi_xs_put(xs);
@@ -1980,13 +1984,13 @@ dvd_read_disckey(struct cd_softc *sc, union dvd_struct *s)
free(buf, M_TEMP);
return (ENOMEM);
}
- xs->cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)buf;
xs->datalen = sizeof(*buf);
xs->timeout = 30000;
cmd = (struct scsi_read_dvd_structure *)xs->cmd;
+ cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
cmd->format = s->type;
cmd->agid = s->disckey.agid << 6;
_lto2b(sizeof(*buf), cmd->length);
@@ -2012,7 +2016,6 @@ dvd_read_bca(struct cd_softc *sc, union dvd_struct *s)
xs = scsi_xs_get(sc->sc_link, SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
xs->cmdlen = sizeof(*cmd);
xs->data = buf;
xs->datalen = sizeof(buf);
@@ -2020,8 +2023,10 @@ dvd_read_bca(struct cd_softc *sc, union dvd_struct *s)
bzero(buf, sizeof(buf));
- xs->cmd->bytes[6] = s->type;
- _lto2b(sizeof(buf), &xs->cmd->bytes[7]);
+ cmd = xs->cmd;
+ cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
+ cmd->bytes[6] = s->type;
+ _lto2b(sizeof(buf), &cmd->bytes[7]);
error = scsi_xs_sync(xs);
scsi_xs_put(xs);
@@ -2052,13 +2057,13 @@ dvd_read_manufact(struct cd_softc *sc, union dvd_struct *s)
free(buf, M_TEMP);
return (ENOMEM);
}
- xs->cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)buf;
xs->datalen = sizeof(*buf);
xs->timeout = 30000;
cmd = (struct scsi_read_dvd_structure *)xs->cmd;
+ cmd->opcode = GPCMD_READ_DVD_STRUCTURE;
cmd->format = s->type;
_lto2b(sizeof(*buf), cmd->length);
diff --git a/sys/scsi/ch.c b/sys/scsi/ch.c
index 82387004867..9429c09a91f 100644
--- a/sys/scsi/ch.c
+++ b/sys/scsi/ch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ch.c,v 1.42 2010/07/22 15:59:47 matthew Exp $ */
+/* $OpenBSD: ch.c,v 1.43 2010/08/30 02:47:56 matthew Exp $ */
/* $NetBSD: ch.c,v 1.26 1997/02/21 22:06:52 thorpej Exp $ */
/*
@@ -380,12 +380,12 @@ ch_move(sc, cm)
xs = scsi_xs_get(sc->sc_link, 0);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = MOVE_MEDIUM;
xs->cmdlen = sizeof(*cmd);
xs->retries = CHRETRIES;
xs->timeout = 100000;
cmd = (struct scsi_move_medium *)xs->cmd;
+ cmd->opcode = MOVE_MEDIUM;
_lto2b(sc->sc_picker, cmd->tea);
_lto2b(fromelem, cmd->src);
_lto2b(toelem, cmd->dst);
@@ -441,12 +441,12 @@ ch_exchange(sc, ce)
xs = scsi_xs_get(sc->sc_link, 0);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = EXCHANGE_MEDIUM;
xs->cmdlen = sizeof(*cmd);
xs->retries = CHRETRIES;
xs->timeout = 100000;
cmd = (struct scsi_exchange_medium *)xs->cmd;
+ cmd->opcode = EXCHANGE_MEDIUM;
_lto2b(sc->sc_picker, cmd->tea);
_lto2b(src, cmd->src);
_lto2b(dst1, cmd->fdst);
@@ -491,12 +491,12 @@ ch_position(sc, cp)
xs = scsi_xs_get(sc->sc_link, 0);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = POSITION_TO_ELEMENT;
xs->cmdlen = sizeof(*cmd);
xs->retries = CHRETRIES;
xs->timeout = 100000;
cmd = (struct scsi_position_to_element *)xs->cmd;
+ cmd->opcode = POSITION_TO_ELEMENT;
_lto2b(sc->sc_picker, cmd->tea);
_lto2b(dst, cmd->dst);
if (cp->cp_flags & CP_INVERT)
@@ -658,7 +658,6 @@ ch_getelemstatus(sc, first, count, data, datalen, voltag)
xs = scsi_xs_get(sc->sc_link, SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = READ_ELEMENT_STATUS;
xs->cmdlen = sizeof(*cmd);
xs->data = data;
xs->datalen = datalen;
@@ -666,6 +665,7 @@ ch_getelemstatus(sc, first, count, data, datalen, voltag)
xs->timeout = 100000;
cmd = (struct scsi_read_element_status *)xs->cmd;
+ cmd->opcode = READ_ELEMENT_STATUS;
_lto2b(first, cmd->sea);
_lto2b(count, cmd->count);
_lto3b(datalen, cmd->len);
diff --git a/sys/scsi/safte.c b/sys/scsi/safte.c
index 707573c650e..58e903e9939 100644
--- a/sys/scsi/safte.c
+++ b/sys/scsi/safte.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: safte.c,v 1.44 2010/07/22 15:59:47 matthew Exp $ */
+/* $OpenBSD: safte.c,v 1.45 2010/08/30 02:47:56 matthew Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -142,7 +142,6 @@ safte_match(struct device *parent, void *match, void *aux)
xs = scsi_xs_get(sa->sa_sc_link, flags | SCSI_DATA_IN);
if (xs == NULL)
return (0);
- xs->cmd->opcode = INQUIRY;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)&inqbuf;
xs->datalen = length;
@@ -150,6 +149,7 @@ safte_match(struct device *parent, void *match, void *aux)
xs->timeout = 10000;
cmd = (struct scsi_inquiry *)xs->cmd;
+ cmd->opcode = INQUIRY;
_lto2b(length, cmd->length);
memset(&inqbuf, 0, sizeof(inqbuf));
@@ -270,7 +270,6 @@ safte_read_config(struct safte_softc *sc)
xs = scsi_xs_get(sc->sc_link, flags | SCSI_DATA_IN | SCSI_SILENT);
if (xs == NULL)
return (1);
- xs->cmd->opcode = READ_BUFFER;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)&config;
xs->datalen = sizeof(config);
@@ -278,6 +277,7 @@ safte_read_config(struct safte_softc *sc)
xs->timeout = 30000;
cmd = (struct safte_readbuf_cmd *)xs->cmd;
+ cmd->opcode = READ_BUFFER;
cmd->flags |= SAFTE_RD_MODE;
cmd->bufferid = SAFTE_RD_CONFIG;
cmd->length = htobe16(sizeof(config));
@@ -412,7 +412,6 @@ safte_read_encstat(void *arg)
rw_exit_write(&sc->sc_lock);
return;
}
- xs->cmd->opcode = READ_BUFFER;
xs->cmdlen = sizeof(*cmd);
xs->data = sc->sc_encbuf;
xs->datalen = sc->sc_encbuflen;
@@ -420,6 +419,7 @@ safte_read_encstat(void *arg)
xs->timeout = 30000;
cmd = (struct safte_readbuf_cmd *)xs->cmd;
+ cmd->opcode = READ_BUFFER;
cmd->flags |= SAFTE_RD_MODE;
cmd->bufferid = SAFTE_RD_ENCSTAT;
cmd->length = htobe16(sc->sc_encbuflen);
@@ -596,7 +596,6 @@ safte_bio_blink(struct safte_softc *sc, struct bioc_blink *blink)
free(op, M_TEMP);
return (ENOMEM);
}
- xs->cmd->opcode = WRITE_BUFFER;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)op;
xs->datalen = sizeof(*op);
@@ -604,6 +603,7 @@ safte_bio_blink(struct safte_softc *sc, struct bioc_blink *blink)
xs->timeout = 30000;
cmd = (struct safte_writebuf_cmd *)xs->cmd;
+ cmd->opcode = WRITE_BUFFER;
cmd->flags |= SAFTE_WR_MODE;
cmd->length = htobe16(sizeof(struct safte_slotop));
diff --git a/sys/scsi/scsi_base.c b/sys/scsi/scsi_base.c
index 830abeb87ae..bdbb1604dd6 100644
--- a/sys/scsi/scsi_base.c
+++ b/sys/scsi/scsi_base.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scsi_base.c,v 1.192 2010/08/25 00:31:35 dlg Exp $ */
+/* $OpenBSD: scsi_base.c,v 1.193 2010/08/30 02:47:56 matthew Exp $ */
/* $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $ */
/*
@@ -768,12 +768,14 @@ scsi_size(struct scsi_link *sc_link, int flags, u_int32_t *blksize)
free(rdcap, M_TEMP);
return (0);
}
- xs->cmd->opcode = READ_CAPACITY;
xs->cmdlen = sizeof(*cmd10);
xs->data = (void *)rdcap;
xs->datalen = sizeof(*rdcap);
xs->timeout = 20000;
+ cmd10 = (struct scsi_read_capacity *)xs->cmd;
+ cmd10->opcode = READ_CAPACITY;
+
error = scsi_xs_sync(xs);
scsi_xs_put(xs);
@@ -806,13 +808,13 @@ scsi_size(struct scsi_link *sc_link, int flags, u_int32_t *blksize)
free(rdcap16, M_TEMP);
goto exit;
}
- xs->cmd->opcode = READ_CAPACITY_16;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)rdcap16;
xs->datalen = sizeof(*rdcap16);
xs->timeout = 20000;
cmd = (struct scsi_read_capacity_16 *)xs->cmd;
+ cmd->opcode = READ_CAPACITY_16;
cmd->byte2 = SRC16_SERVICE_ACTION;
_lto4b(sizeof(*rdcap16), cmd->length);
@@ -855,11 +857,13 @@ scsi_test_unit_ready(struct scsi_link *sc_link, int retries, int flags)
xs = scsi_xs_get(sc_link, flags);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = TEST_UNIT_READY;
xs->cmdlen = sizeof(*cmd);
xs->retries = retries;
xs->timeout = 10000;
+ cmd = (struct scsi_test_unit_ready *)xs->cmd;
+ cmd->opcode = TEST_UNIT_READY;
+
error = scsi_xs_sync(xs);
scsi_xs_put(xs);
@@ -931,7 +935,6 @@ scsi_inquire_vpd(struct scsi_link *sc_link, void *buf, u_int buflen,
xs = scsi_xs_get(sc_link, flags | SCSI_DATA_IN | SCSI_SILENT);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = INQUIRY;
xs->cmdlen = sizeof(*cmd);
xs->data = buf;
xs->datalen = buflen;
@@ -939,6 +942,7 @@ scsi_inquire_vpd(struct scsi_link *sc_link, void *buf, u_int buflen,
xs->timeout = 10000;
cmd = (struct scsi_inquiry *)xs->cmd;
+ cmd->opcode = INQUIRY;
cmd->flags = SI_EVPD;
cmd->pagecode = page;
_lto2b(buflen, cmd->length);
@@ -965,12 +969,12 @@ scsi_prevent(struct scsi_link *sc_link, int type, int flags)
xs = scsi_xs_get(sc_link, flags);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = PREVENT_ALLOW;
xs->cmdlen = sizeof(*cmd);
xs->retries = 2;
xs->timeout = 5000;
cmd = (struct scsi_prevent *)xs->cmd;
+ cmd->opcode = PREVENT_ALLOW;
cmd->how = type;
error = scsi_xs_sync(xs);
@@ -992,12 +996,12 @@ scsi_start(struct scsi_link *sc_link, int type, int flags)
xs = scsi_xs_get(sc_link, flags);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = START_STOP;
xs->cmdlen = sizeof(*cmd);
xs->retries = 2;
xs->timeout = (type == SSS_START) ? 30000 : 10000;
cmd = (struct scsi_start_stop *)xs->cmd;
+ cmd->opcode = START_STOP;
cmd->how = type;
error = scsi_xs_sync(xs);
@@ -1017,7 +1021,6 @@ scsi_mode_sense(struct scsi_link *sc_link, int byte2, int page,
xs = scsi_xs_get(sc_link, flags | SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = MODE_SENSE;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)data;
xs->datalen = len;
@@ -1031,6 +1034,7 @@ scsi_mode_sense(struct scsi_link *sc_link, int byte2, int page,
bzero(data, len);
cmd = (struct scsi_mode_sense *)xs->cmd;
+ cmd->opcode = MODE_SENSE;
cmd->byte2 = byte2;
cmd->page = page;
@@ -1058,7 +1062,6 @@ scsi_mode_sense_big(struct scsi_link *sc_link, int byte2, int page,
xs = scsi_xs_get(sc_link, flags | SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = MODE_SENSE_BIG;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)data;
xs->datalen = len;
@@ -1072,6 +1075,7 @@ scsi_mode_sense_big(struct scsi_link *sc_link, int byte2, int page,
bzero(data, len);
cmd = (struct scsi_mode_sense_big *)xs->cmd;
+ cmd->opcode = MODE_SENSE_BIG;
cmd->byte2 = byte2;
cmd->page = page;
@@ -1234,13 +1238,13 @@ scsi_mode_select(struct scsi_link *sc_link, int byte2,
xs = scsi_xs_get(sc_link, flags | SCSI_DATA_OUT);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = MODE_SELECT;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)data;
xs->datalen = len;
xs->timeout = timeout;
cmd = (struct scsi_mode_select *)xs->cmd;
+ cmd->opcode = MODE_SELECT;
cmd->byte2 = byte2;
cmd->length = len;
@@ -1269,13 +1273,13 @@ scsi_mode_select_big(struct scsi_link *sc_link, int byte2,
xs = scsi_xs_get(sc_link, flags | SCSI_DATA_OUT);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = MODE_SELECT_BIG;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)data;
xs->datalen = len;
xs->timeout = timeout;
cmd = (struct scsi_mode_select_big *)xs->cmd;
+ cmd->opcode = MODE_SELECT_BIG;
cmd->byte2 = byte2;
_lto2b(len, cmd->length);
@@ -1303,7 +1307,6 @@ scsi_report_luns(struct scsi_link *sc_link, int selectreport,
xs = scsi_xs_get(sc_link, flags | SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = REPORT_LUNS;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)data;
xs->datalen = datalen;
@@ -1312,6 +1315,7 @@ scsi_report_luns(struct scsi_link *sc_link, int selectreport,
bzero(data, datalen);
cmd = (struct scsi_report_luns *)xs->cmd;
+ cmd->opcode = REPORT_LUNS;
cmd->selectreport = selectreport;
_lto4b(datalen, cmd->length);
diff --git a/sys/scsi/ses.c b/sys/scsi/ses.c
index f67b4907130..4cbe7596586 100644
--- a/sys/scsi/ses.c
+++ b/sys/scsi/ses.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ses.c,v 1.49 2010/08/02 23:00:54 krw Exp $ */
+/* $OpenBSD: ses.c,v 1.50 2010/08/30 02:47:56 matthew Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -280,7 +280,6 @@ ses_read_config(struct ses_softc *sc)
free(buf, M_DEVBUF);
return (1);
}
- xs->cmd->opcode = RECEIVE_DIAGNOSTIC;
xs->cmdlen = sizeof(*cmd);
xs->data = buf;
xs->datalen = SES_BUFLEN;
@@ -288,6 +287,7 @@ ses_read_config(struct ses_softc *sc)
xs->timeout = 3000;
cmd = (struct ses_scsi_diag *)xs->cmd;
+ cmd->opcode = RECEIVE_DIAGNOSTIC;
cmd->flags |= SES_DIAG_PCV;
cmd->pgcode = SES_PAGE_CONFIG;
cmd->length = htobe16(SES_BUFLEN);
@@ -376,7 +376,6 @@ ses_read_status(struct ses_softc *sc)
xs = scsi_xs_get(sc->sc_link, flags | SCSI_DATA_IN | SCSI_SILENT);
if (xs == NULL)
return (1);
- xs->cmd->opcode = RECEIVE_DIAGNOSTIC;
xs->cmdlen = sizeof(*cmd);
xs->data = sc->sc_buf;
xs->datalen = sc->sc_buflen;
@@ -384,6 +383,7 @@ ses_read_status(struct ses_softc *sc)
xs->timeout = 3000;
cmd = (struct ses_scsi_diag *)xs->cmd;
+ cmd->opcode = RECEIVE_DIAGNOSTIC;
cmd->flags |= SES_DIAG_PCV;
cmd->pgcode = SES_PAGE_STATUS;
cmd->length = htobe16(sc->sc_buflen);
@@ -607,7 +607,6 @@ ses_write_config(struct ses_softc *sc)
xs = scsi_xs_get(sc->sc_link, flags | SCSI_DATA_OUT | SCSI_SILENT);
if (xs == NULL)
return (1);
- xs->cmd->opcode = SEND_DIAGNOSTIC;
xs->cmdlen = sizeof(*cmd);
xs->data = sc->sc_buf;
xs->datalen = sc->sc_buflen;
@@ -615,6 +614,7 @@ ses_write_config(struct ses_softc *sc)
xs->timeout = 3000;
cmd = (struct ses_scsi_diag *)xs->cmd;
+ cmd->opcode = SEND_DIAGNOSTIC;
cmd->flags |= SES_DIAG_PF;
cmd->length = htobe16(sc->sc_buflen);
diff --git a/sys/scsi/st.c b/sys/scsi/st.c
index 44fdd294666..5ce3c057a0e 100644
--- a/sys/scsi/st.c
+++ b/sys/scsi/st.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: st.c,v 1.106 2010/07/22 05:26:34 matthew Exp $ */
+/* $OpenBSD: st.c,v 1.107 2010/08/30 02:47:56 matthew Exp $ */
/* $NetBSD: st.c,v 1.71 1997/02/21 23:03:49 thorpej Exp $ */
/*
@@ -1382,7 +1382,6 @@ st_read(struct st_softc *st, char *buf, int size, int flags)
xs = scsi_xs_get(st->sc_link, flags | SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = READ;
xs->cmdlen = sizeof(*cmd);
xs->data = buf;
xs->datalen = size;
@@ -1390,6 +1389,7 @@ st_read(struct st_softc *st, char *buf, int size, int flags)
xs->timeout = ST_IO_TIME;
cmd = (struct scsi_rw_tape *)xs->cmd;
+ cmd->opcode = READ;
if (st->flags & ST_FIXEDBLOCKS) {
cmd->byte2 |= SRW_FIXED;
_lto3b(size / (st->blksize ? st->blksize : DEF_FIXED_BSIZE),
@@ -1421,12 +1421,14 @@ st_read_block_limits(struct st_softc *st, int flags)
xs = scsi_xs_get(sc_link, flags | SCSI_DATA_IN);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = READ_BLOCK_LIMITS;
xs->cmdlen = sizeof(*cmd);
xs->data = (void *)&block_limits;
xs->datalen = sizeof(block_limits);
xs->timeout = ST_CTL_TIME;
+ cmd = (struct scsi_block_limits *)xs->cmd;
+ cmd->opcode = READ_BLOCK_LIMITS;
+
error = scsi_xs_sync(xs);
scsi_xs_put(xs);
@@ -1628,7 +1630,6 @@ st_erase(struct st_softc *st, int full, int flags)
xs = scsi_xs_get(st->sc_link, flags);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = ERASE;
xs->cmdlen = sizeof(*cmd);
/*
@@ -1637,6 +1638,7 @@ st_erase(struct st_softc *st, int full, int flags)
* asking the drive to write an erase gap.
*/
cmd = (struct scsi_erase *)xs->cmd;
+ cmd->opcode = ERASE;
if (full) {
cmd->byte2 = SE_IMMED|SE_LONG;
xs->timeout = ST_SPC_TIME;
@@ -1731,9 +1733,9 @@ st_space(struct st_softc *st, int number, u_int what, int flags)
st->media_blkno = -1;
return (ENOMEM);
}
- xs->cmd->opcode = SPACE;
cmd = (struct scsi_space *)xs->cmd;
+ cmd->opcode = SPACE;
cmd->byte2 = what;
_lto3b(number, cmd->number);
xs->cmdlen = sizeof(*cmd);
@@ -1789,7 +1791,6 @@ st_write_filemarks(struct st_softc *st, int number, int flags)
st->media_blkno = -1;
return (ENOMEM);
}
- xs->cmd->opcode = WRITE_FILEMARKS;
xs->cmdlen = sizeof(*cmd);
xs->timeout = ST_IO_TIME * 4;
@@ -1809,6 +1810,7 @@ st_write_filemarks(struct st_softc *st, int number, int flags)
}
cmd = (struct scsi_write_filemarks *)xs->cmd;
+ cmd->opcode = WRITE_FILEMARKS;
_lto3b(number, cmd->number);
error = scsi_xs_sync(xs);
@@ -1888,11 +1890,11 @@ st_load(struct st_softc *st, u_int type, int flags)
xs = scsi_xs_get(st->sc_link, flags);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = LOAD;
xs->cmdlen = sizeof(*cmd);
xs->timeout = ST_SPC_TIME;
cmd = (struct scsi_load *)xs->cmd;
+ cmd->opcode = LOAD;
cmd->how = type;
error = scsi_xs_sync(xs);
@@ -1919,11 +1921,11 @@ st_rewind(struct st_softc *st, u_int immediate, int flags)
xs = scsi_xs_get(st->sc_link, flags);
if (xs == NULL)
return (ENOMEM);
- xs->cmd->opcode = REWIND;
xs->cmdlen = sizeof(*cmd);
xs->timeout = immediate ? ST_CTL_TIME : ST_SPC_TIME;
cmd = (struct scsi_rewind *)xs->cmd;
+ cmd->opcode = REWIND;
cmd->byte2 = immediate;
error = scsi_xs_sync(xs);