summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authortsutsui <tsutsui@NetBSD.org>2001-11-17 21:26:12 +0000
committertsutsui <tsutsui@NetBSD.org>2001-11-17 21:26:12 +0000
commit11a1ddc5dd92f8642469ee5dd4ebe37eb6e9474d (patch)
tree8879a28c3e96069ab25925b5a1959a1f57c76c90 /sys/dev
parentcb5cba1cf37cd9d60f1a5e15001a44d5aadd3793 (diff)
- make sure to call bus_dmamap_unload() even after request sense
- fix usage of scb flags - misc cleanup
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/iha.c97
-rw-r--r--sys/dev/ic/ihareg.h6
-rw-r--r--sys/dev/ic/ihavar.h11
3 files changed, 50 insertions, 64 deletions
diff --git a/sys/dev/ic/iha.c b/sys/dev/ic/iha.c
index 95736723a4e..5319f15df13 100644
--- a/sys/dev/ic/iha.c
+++ b/sys/dev/ic/iha.c
@@ -1,4 +1,4 @@
-/* $NetBSD: iha.c,v 1.11 2001/11/13 13:14:38 lukem Exp $ */
+/* $NetBSD: iha.c,v 1.12 2001/11/17 21:26:12 tsutsui Exp $ */
/*
* Initio INI-9xxxU/UW SCSI Device Driver
*
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: iha.c,v 1.11 2001/11/13 13:14:38 lukem Exp $");
+__KERNEL_RCSID(0, "$NetBSD: iha.c,v 1.12 2001/11/17 21:26:12 tsutsui Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -276,7 +276,7 @@ iha_scsipi_request(chan, req, arg)
struct scsipi_periph *periph;
struct iha_scsi_req_q *scb;
struct iha_softc *sc;
- int error, flags, s;
+ int error, s;
sc = (struct iha_softc *)chan->chan_adapter->adapt_dev;
@@ -284,7 +284,6 @@ iha_scsipi_request(chan, req, arg)
case ADAPTER_REQ_RUN_XFER:
xs = arg;
periph = xs->xs_periph;
- flags = xs->xs_control;
if (xs->cmdlen > sizeof(struct scsi_generic) ||
periph->periph_target >= IHA_MAX_TARGETS) {
@@ -310,24 +309,26 @@ iha_scsipi_request(chan, req, arg)
scb->target = periph->periph_target;
scb->lun = periph->periph_lun;
scb->tcs = &sc->sc_tcs[scb->target];
- scb->flags = xs->xs_control; /* XXX */
scb->scb_id = MSG_IDENTIFY(periph->periph_lun,
(xs->xs_control & XS_CTL_REQSENSE) == 0);
scb->xs = xs;
- scb->timeout = xs->timeout;
scb->cmdlen = xs->cmdlen;
memcpy(&scb->cmd, xs->cmd, xs->cmdlen);
-
scb->buflen = xs->datalen;
+ scb->flags = 0;
+ if (xs->xs_control & XS_CTL_DATA_OUT)
+ scb->flags |= FLAG_DATAOUT;
+ if (xs->xs_control & XS_CTL_DATA_IN)
+ scb->flags |= FLAG_DATAIN;
- if (scb->buflen > 0) {
+ if (scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) {
error = bus_dmamap_load(sc->sc_dmat, scb->dmap,
xs->data, scb->buflen, NULL,
((xs->xs_control & XS_CTL_NOSLEEP) ?
BUS_DMA_NOWAIT : BUS_DMA_WAITOK) |
BUS_DMA_STREAMING |
- ((xs->xs_control & XS_CTL_DATA_IN) ?
+ ((scb->flags & FLAG_DATAIN) ?
BUS_DMA_READ : BUS_DMA_WRITE));
if (error) {
@@ -340,7 +341,7 @@ iha_scsipi_request(chan, req, arg)
}
bus_dmamap_sync(sc->sc_dmat, scb->dmap,
0, scb->dmap->dm_mapsize,
- (xs->xs_control & XS_CTL_DATA_IN) ?
+ (scb->flags & FLAG_DATAIN) ?
BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
}
@@ -530,25 +531,11 @@ iha_append_free_scb(sc, scb)
scb->ta_stat = SCSI_OK;
scb->nextstat = 0;
- scb->sg_index = 0;
- scb->sg_max = 0;
- scb->flags = 0;
- scb->target = 0;
- scb->lun = 0;
- scb->buflen = 0;
- scb->sg_size = 0;
- scb->cmdlen = 0;
- scb->scb_id = 0;
scb->scb_tagmsg = 0;
- scb->timeout = 0;
- scb->bufaddr = 0;
scb->xs = NULL;
scb->tcs = NULL;
- memset(scb->cmd, 0, sizeof(scb->cmd));
- memset(scb->sglist, 0, sizeof(scb->sglist));
-
/*
* scb_tagid, sg_addr, sglist
* SCB_SensePtr are set at initialization
@@ -615,7 +602,7 @@ iha_find_pend_scb(sc)
else
TAILQ_FOREACH(scb, &sc->sc_pendscb, chain) {
- if ((scb->flags & XS_CTL_RESET) != 0)
+ if ((scb->xs->xs_control & XS_CTL_RESET) != 0)
/* ALWAYS willing to reset a device */
break;
@@ -831,8 +818,7 @@ iha_push_sense_request(sc, scb)
ss->length = sizeof(struct scsipi_sense_data);
ss->control = 0;
- scb->flags &= ~(FLAG_SG | XS_CTL_DATA_OUT);
- scb->flags |= FLAG_RSENS | XS_CTL_DATA_IN;
+ scb->flags = FLAG_RSENS | FLAG_DATAIN;
scb->scb_id &= ~MSG_IDENTIFY_DISCFLAG;
@@ -951,7 +937,7 @@ iha_scsi(sc)
/* program HBA's SCSI ID & target SCSI ID */
bus_space_write_1(iot, ioh, TUL_SID, (sc->sc_id << 4) | scb->target);
- if ((scb->flags & XS_CTL_RESET) == 0) {
+ if ((scb->xs->xs_control & XS_CTL_RESET) == 0) {
bus_space_write_1(iot, ioh, TUL_SYNCM, tcs->syncm);
if ((tcs->flags & FLAG_NO_NEG_SYNC) == 0 ||
@@ -969,8 +955,9 @@ iha_scsi(sc)
scb->nextstat = 8;
}
- if ((scb->flags & XS_CTL_POLL) != 0) {
- for (; scb->timeout > 0; scb->timeout--) {
+ if ((scb->xs->xs_control & XS_CTL_POLL) != 0) {
+ int timeout;
+ for (timeout = scb->xs->timeout; timeout > 0; timeout--) {
if (iha_wait(sc, NO_OP) == -1)
break;
if (iha_next_state(sc) == -1)
@@ -985,7 +972,7 @@ iha_scsi(sc)
*
* Conversely, xs->error has not been set yet
*/
- if (scb->timeout == 0)
+ if (timeout == 0)
iha_timeout(scb);
}
}
@@ -1287,8 +1274,8 @@ iha_state_4(sc)
{
struct iha_scsi_req_q *scb = sc->sc_actscb;
- if ((scb->flags & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) ==
- (XS_CTL_DATA_IN | XS_CTL_DATA_OUT))
+ if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) ==
+ (FLAG_DATAIN | FLAG_DATAOUT))
return (6); /* Both dir flags set => NO xfer was requested */
for (;;) {
@@ -1297,8 +1284,7 @@ iha_state_4(sc)
switch (sc->sc_phase) {
case PHASE_STATUS_IN:
- if ((scb->flags & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT))
- != 0)
+ if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != 0)
scb->ha_stat = iha_data_over_run(scb);
if ((iha_status_msg(sc)) == -1)
return (-1);
@@ -1325,10 +1311,10 @@ iha_state_4(sc)
break;
case PHASE_DATA_IN:
- return (iha_xfer_data(sc, scb, XS_CTL_DATA_IN));
+ return (iha_xfer_data(sc, scb, FLAG_DATAIN));
case PHASE_DATA_OUT:
- return (iha_xfer_data(sc, scb, XS_CTL_DATA_OUT));
+ return (iha_xfer_data(sc, scb, FLAG_DATAOUT));
default:
iha_bad_seq(sc);
@@ -1550,28 +1536,29 @@ iha_xfer_data(sc, scb, direction)
bus_space_tag_t iot = sc->sc_iot;
bus_space_handle_t ioh = sc->sc_ioh;
u_int32_t xferlen;
- u_int8_t xfertype;
+ u_int8_t xfercmd;
- if ((scb->flags & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) != direction)
+ if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != direction)
return (6); /* wrong direction, abandon I/O */
bus_space_write_4(iot, ioh, TUL_STCNT0, scb->buflen);
- if ((scb->flags & FLAG_SG) == 0) {
- xferlen = scb->buflen;
- xfertype = (direction == XS_CTL_DATA_IN) ? ST_X_IN : ST_X_OUT;
+ xfercmd = STRXFR;
+ if (direction == FLAG_DATAIN)
+ xfercmd |= XDIR;
- } else {
+ if (scb->flags & FLAG_SG) {
xferlen = scb->sg_size * sizeof(struct iha_sg_element);
- xfertype = (direction == XS_CTL_DATA_IN) ? ST_SG_IN : ST_SG_OUT;
- }
+ xfercmd |= SGXFR;
+ } else
+ xferlen = scb->buflen;
bus_space_write_4(iot, ioh, TUL_DXC, xferlen);
bus_space_write_4(iot, ioh, TUL_DXPA, scb->bufaddr);
- bus_space_write_1(iot, ioh, TUL_DCMD, xfertype);
+ bus_space_write_1(iot, ioh, TUL_DCMD, xfercmd);
bus_space_write_1(iot, ioh, TUL_SCMD,
- (direction == XS_CTL_DATA_IN) ? XF_DMA_IN : XF_DMA_OUT);
+ (direction == FLAG_DATAIN) ? XF_DMA_IN : XF_DMA_OUT);
scb->nextstat = 5;
@@ -1586,7 +1573,7 @@ iha_xpad_in(sc)
bus_space_handle_t ioh = sc->sc_ioh;
struct iha_scsi_req_q *scb = sc->sc_actscb;
- if ((scb->flags & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) != 0)
+ if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != 0)
scb->ha_stat = HOST_DO_DU;
for (;;) {
@@ -1618,7 +1605,7 @@ iha_xpad_out(sc)
bus_space_handle_t ioh = sc->sc_ioh;
struct iha_scsi_req_q *scb = sc->sc_actscb;
- if ((scb->flags & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) != 0)
+ if ((scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) != 0)
scb->ha_stat = HOST_DO_DU;
for (;;) {
@@ -2389,10 +2376,10 @@ iha_done_scb(sc, scb)
/* Cancel the timeout. */
callout_stop(&xs->xs_callout);
- if (xs->datalen > 0) {
+ if (scb->flags & (FLAG_DATAIN | FLAG_DATAOUT)) {
bus_dmamap_sync(sc->sc_dmat, scb->dmap,
0, scb->dmap->dm_mapsize,
- (xs->xs_control & XS_CTL_DATA_IN) ?
+ (scb->flags & FLAG_DATAIN) ?
BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->sc_dmat, scb->dmap);
}
@@ -2426,7 +2413,7 @@ iha_done_scb(sc, scb)
if ((scb->flags & FLAG_RSENS) != 0 ||
iha_push_sense_request(sc, scb) != 0) {
- scb->flags &= FLAG_RSENS;
+ scb->flags &= ~FLAG_RSENS;
printf("%s: request sense failed\n",
sc->sc_dev.dv_xname);
xs->error = XS_DRIVER_STUFFUP;
@@ -2522,8 +2509,9 @@ iha_exec_scb(sc, scb)
scb->sgoffset, IHA_SG_SIZE,
BUS_DMASYNC_PREWRITE);
- scb->flags |= FLAG_SG; /* XXX */
+ scb->flags |= FLAG_SG;
scb->sg_size = scb->sg_max = nseg;
+ scb->sg_index = 0;
scb->bufaddr = scb->sg_addr;
} else
@@ -2540,7 +2528,8 @@ iha_exec_scb(sc, scb)
s = splbio();
- if (((scb->flags & XS_RESET) != 0) || (scb->cmd[0] == REQUEST_SENSE))
+ if (((scb->xs->xs_control & XS_RESET) != 0) ||
+ (scb->cmd[0] == REQUEST_SENSE))
iha_push_pend_scb(sc, scb); /* Insert SCB at head of Pend */
else
iha_append_pend_scb(sc, scb); /* Append SCB to tail of Pend */
diff --git a/sys/dev/ic/ihareg.h b/sys/dev/ic/ihareg.h
index a4c66f69eb8..7e16b32d33d 100644
--- a/sys/dev/ic/ihareg.h
+++ b/sys/dev/ic/ihareg.h
@@ -1,4 +1,4 @@
-/* $NetBSD: ihareg.h,v 1.2 2001/07/27 16:16:34 tsutsui Exp $ */
+/* $NetBSD: ihareg.h,v 1.3 2001/11/17 21:26:12 tsutsui Exp $ */
/*
* Initio INI-9xxxU/UW SCSI Device Driver
*
@@ -207,10 +207,6 @@
#define ABTXFR 0x04 /* Abort Xfer */
#define FRXFR 0x02 /* Force Xfer */
#define STRXFR 0x01 /* Start Xfer */
-#define ST_X_IN (XDIR | STRXFR)
-#define ST_X_OUT ( STRXFR)
-#define ST_SG_IN (SGXFR | ST_X_IN)
-#define ST_SG_OUT (SGXFR | ST_X_OUT)
#define TUL_ISTUS0 0xDC /* R/W Interrupt Status Register */
#define DGINT 0x80 /* DMA Global Interrupt */
#define RSVRD0 0x40 /* Reserved */
diff --git a/sys/dev/ic/ihavar.h b/sys/dev/ic/ihavar.h
index f5802a5a467..a45e1ffdd57 100644
--- a/sys/dev/ic/ihavar.h
+++ b/sys/dev/ic/ihavar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: ihavar.h,v 1.5 2001/09/29 14:23:37 tsutsui Exp $ */
+/* $NetBSD: ihavar.h,v 1.6 2001/11/17 21:26:12 tsutsui Exp $ */
/*
* Initio INI-9xxxU/UW SCSI Device Driver
*
@@ -85,9 +85,11 @@ struct iha_scsi_req_q {
int nextstat; /* Next state function to apply */
int sg_index; /* Scatter/Gather Index */
int sg_max; /* Scatter/Gather # valid entries */
- int flags; /* SCB Flags (xs->flags + private)*/
-#define FLAG_RSENS 0x00010000 /* Request Sense sent */
-#define FLAG_SG 0x00020000 /* Scatter/Gather used */
+ int flags; /* SCB Flags */
+#define FLAG_DATAIN 0x00000001 /* Data In */
+#define FLAG_DATAOUT 0x00000002 /* Data Out */
+#define FLAG_RSENS 0x00000004 /* Request Sense sent */
+#define FLAG_SG 0x00000008 /* Scatter/Gather used */
int target; /* Target Id */
int lun; /* Lun */
@@ -103,7 +105,6 @@ struct iha_scsi_req_q {
#define HOST_SCSI_RST 0x1B /* SCSI bus was reset */
#define HOST_DEV_RST 0x1C /* Device was reset */
int ta_stat; /* SCSI Status Byte */
- int timeout; /* in milliseconds */
struct scsipi_xfer *xs; /* xs this SCB is executing */
struct tcs *tcs; /* tcs for SCB_Target */