summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/iha.c279
-rw-r--r--sys/dev/ic/iha.h37
2 files changed, 175 insertions, 141 deletions
diff --git a/sys/dev/ic/iha.c b/sys/dev/ic/iha.c
index c01441e61bd..50c23095fad 100644
--- a/sys/dev/ic/iha.c
+++ b/sys/dev/ic/iha.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: iha.c,v 1.18 2003/03/29 02:34:17 krw Exp $ */
+/* $OpenBSD: iha.c,v 1.19 2003/03/29 17:52:01 krw Exp $ */
/*-------------------------------------------------------------------------
*
* Device driver for the INI-9XXXU/UW or INIC-940/950 PCI SCSI Controller.
@@ -84,8 +84,9 @@ static const u_int8_t iha_rate_tbl[8] = {
62 /* 250ns, 4M */
};
+int iha_setup_sg_list(struct iha_softc *, struct iha_scsi_req_q *);
u_int8_t iha_data_over_run(struct iha_scsi_req_q *);
-void iha_push_sense_request(struct iha_softc *, struct iha_scsi_req_q *);
+int iha_push_sense_request(struct iha_softc *, struct iha_scsi_req_q *);
void iha_timeout(void *);
int iha_alloc_scbs(struct iha_softc *);
void iha_read_eeprom(bus_space_tag_t, bus_space_handle_t,
@@ -210,6 +211,47 @@ iha_intr(arg)
}
/*
+ * iha_setup_sg_list - initialize scatter gather list of pScb from
+ * pScb->SCB_DataDma.
+ */
+int
+iha_setup_sg_list(sc, pScb)
+ struct iha_softc *sc;
+ struct iha_scsi_req_q *pScb;
+{
+ bus_dma_segment_t *segs = pScb->SCB_DataDma->dm_segs;
+ int i, error, nseg = pScb->SCB_DataDma->dm_nsegs;
+
+ if (nseg > 1) {
+ pScb->SCB_Flags |= FLAG_SG;
+ bzero(pScb->SCB_SGList, sizeof(pScb->SCB_SGList));
+
+ error = bus_dmamap_load(sc->sc_dmat, pScb->SCB_SGDma,
+ pScb->SCB_SGList, sizeof(pScb->SCB_SGList), NULL,
+ (pScb->SCB_Flags & SCSI_NOSLEEP) ?
+ BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
+ if (error) {
+ sc_print_addr(pScb->SCB_Xs->sc_link);
+ printf("error %d loading SG list dma map\n", error);
+ return (error);
+ }
+
+ pScb->SCB_SGIdx = 0;
+ pScb->SCB_SGCount = nseg;
+
+ for (i=0; i < nseg; i++) {
+ pScb->SCB_SGList[i].SG_Len = segs[i].ds_len;
+ pScb->SCB_SGList[i].SG_Addr = segs[i].ds_addr;
+ }
+
+ bus_dmamap_sync(sc->sc_dmat, pScb->SCB_SGDma,
+ 0, sizeof(pScb->SCB_SGList), BUS_DMASYNC_PREWRITE);
+ }
+
+ return (0);
+}
+
+/*
* iha_scsi_cmd - start execution of a SCSI command. This is called
* from the generic SCSI driver via the field
* sc_adapter.scsi_cmd of iha_softc.
@@ -219,11 +261,9 @@ iha_scsi_cmd(xs)
struct scsi_xfer *xs;
{
struct iha_scsi_req_q *pScb;
- struct iha_sg_element *sg;
struct scsi_link *sc_link = xs->sc_link;
struct iha_softc *sc = sc_link->adapter_softc;
- bus_dmamap_t dm;
- int error, nseg, i;
+ int error;
if ((xs->cmdlen > 12) || (sc_link->target >= IHA_MAX_TARGETS)) {
xs->error = XS_DRIVER_STUFFUP;
@@ -253,19 +293,19 @@ iha_scsi_cmd(xs)
pScb->SCB_CDBLen = xs->cmdlen;
bcopy(xs->cmd, &pScb->SCB_CDB, xs->cmdlen);
- pScb->SCB_BufLen = xs->datalen;
+ pScb->SCB_BufCharsLeft = pScb->SCB_BufChars = xs->datalen;
- if (pScb->SCB_BufLen > 0) {
+ if ((pScb->SCB_Flags & (SCSI_DATA_IN | SCSI_DATA_OUT)) != 0) {
#ifdef TFS
if (pScb->SCB_Flags & SCSI_DATA_UIO)
error = bus_dmamap_load_uio(sc->sc_dmat,
- pScb->SCB_Dmamap, (struct uio *)xs->data,
+ pScb->SCB_DataDma, (struct uio *)xs->data,
(pScb->SCB_Flags & SCSI_NOSLEEP) ?
BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
else
#endif /* TFS */
- error = bus_dmamap_load(sc->sc_dmat, pScb->SCB_Dmamap,
- xs->data, pScb->SCB_BufLen, NULL,
+ error = bus_dmamap_load(sc->sc_dmat, pScb->SCB_DataDma,
+ xs->data, pScb->SCB_BufChars, NULL,
(pScb->SCB_Flags & SCSI_NOSLEEP) ?
BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
@@ -284,33 +324,19 @@ iha_scsi_cmd(xs)
return (COMPLETE);
}
- dm = pScb->SCB_Dmamap;
- nseg = dm->dm_nsegs;
-
- if (nseg > 1) {
- sg = pScb->SCB_SGList;
-
- for (i=0; i < nseg; i++) {
- sg[i].SG_Len = dm->dm_segs[i].ds_len;
- sg[i].SG_Ptr = dm->dm_segs[i].ds_addr;
- }
-
- pScb->SCB_Flags |= FLAG_SG;
- pScb->SCB_SGLen = nseg;
-
- pScb->SCB_BufPAddr = pScb->SCB_SGPAddr;
- } else
- pScb->SCB_BufPAddr = dm->dm_segs[0].ds_addr;
+ error = iha_setup_sg_list(sc, pScb);
+ if (error) {
+ bus_dmamap_unload(sc->sc_dmat, pScb->SCB_DataDma);
+ xs->error = XS_DRIVER_STUFFUP;
+ return (COMPLETE);
+ }
- bus_dmamap_sync(sc->sc_dmat, pScb->SCB_Dmamap,
- 0, pScb->SCB_Dmamap->dm_mapsize,
- (pScb->SCB_Flags & SCSI_DATA_IN) ?
- BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(sc->sc_dmat, pScb->SCB_DataDma,
+ 0, pScb->SCB_BufChars,
+ (pScb->SCB_Flags & SCSI_DATA_IN) ?
+ BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
}
- pScb->SCB_SGMax = pScb->SCB_SGLen;
- pScb->SCB_Timeout = xs->timeout;
-
/*
* Always initialize the stimeout structure as it may
* contain garbage that confuses timeout_del() later on.
@@ -377,25 +403,29 @@ iha_init_tulip(sc)
for (i = 0, pScb = sc->HCS_Scb; i < IHA_MAX_SCB; i++, pScb++) {
pScb->SCB_TagId = i;
- pScb->SCB_SGPAddr = sc->sc_dmamap->dm_segs[0].ds_addr
- + i*sizeof(struct iha_scsi_req_q)
- + offsetof(struct iha_scsi_req_q, SCB_SGList);
-
- pScb->SCB_SenseLen = sizeof(struct scsi_sense_data);
- pScb->SCB_SensePAddr = sc->sc_dmamap->dm_segs[0].ds_addr
- + i*sizeof(struct iha_scsi_req_q)
- + offsetof(struct iha_scsi_req_q, SCB_ScsiSenseData);
error = bus_dmamap_create(sc->sc_dmat,
(IHA_MAX_SG_ENTRIES-1) * PAGE_SIZE, IHA_MAX_SG_ENTRIES,
(IHA_MAX_SG_ENTRIES-1) * PAGE_SIZE, 0,
- BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &pScb->SCB_Dmamap);
+ BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &pScb->SCB_DataDma);
+
+ if (error != 0) {
+ printf("%s: couldn't create SCB data DMA map, error = %d\n",
+ sc->sc_dev.dv_xname, error);
+ return (error);
+ }
+ error = bus_dmamap_create(sc->sc_dmat,
+ sizeof(pScb->SCB_SGList), 1,
+ sizeof(pScb->SCB_SGList), 0,
+ BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
+ &pScb->SCB_SGDma);
if (error != 0) {
- printf("%s: couldn't create SCB DMA map, error = %d\n",
+ printf("%s: couldn't create SCB SG DMA map, error = %d\n",
sc->sc_dev.dv_xname, error);
return (error);
}
+
TAILQ_INSERT_TAIL(&sc->HCS_FreeScb, pScb, SCB_ScbList);
}
@@ -518,35 +548,28 @@ iha_append_free_scb(sc, pScb)
if (pScb == sc->HCS_ActScb)
sc->HCS_ActScb = NULL;
- pScb->SCB_Status = STATUS_QUEUED;
- pScb->SCB_HaStat = HOST_OK;
- pScb->SCB_TaStat = SCSI_OK;
+ pScb->SCB_Status = STATUS_QUEUED;
+ pScb->SCB_HaStat = HOST_OK;
+ pScb->SCB_TaStat = SCSI_OK;
pScb->SCB_NxtStat = 0;
- pScb->SCB_SGIdx = 0;
- pScb->SCB_SGMax = 0;
pScb->SCB_Flags = 0;
pScb->SCB_Target = 0;
pScb->SCB_Lun = 0;
- pScb->SCB_BufLen = 0;
- pScb->SCB_SGLen = 0;
pScb->SCB_CDBLen = 0;
pScb->SCB_Ident = 0;
pScb->SCB_TagMsg = 0;
- pScb->SCB_Timeout = 0;
- pScb->SCB_BufPAddr = 0;
+
+ pScb->SCB_BufChars = 0;
+ pScb->SCB_BufCharsLeft = 0;
pScb->SCB_Xs = NULL;
pScb->SCB_Tcs = NULL;
- bzero( pScb->SCB_CDB, sizeof(pScb->SCB_CDB));
- bzero(&pScb->SCB_ScsiSenseData, sizeof(pScb->SCB_ScsiSenseData));
- bzero( pScb->SCB_SGList, sizeof(pScb->SCB_SGList));
+ bzero(pScb->SCB_CDB, sizeof(pScb->SCB_CDB));
/*
- * SCB_TagId, SCB_SGPAddr, SCB_SenseLen, SCB_SGList
- * SCB_SensePtr are set at initialization
- * and never change
+ * SCB_TagId is set at initialization and never changes
*/
TAILQ_INSERT_TAIL(&sc->HCS_FreeScb, pScb, SCB_ScbList);
@@ -808,26 +831,50 @@ iha_bad_seq(sc)
* SCB needing it back onto the pending
* queue with a REQUEST_SENSE CDB.
*/
-void
+int
iha_push_sense_request(sc, pScb)
struct iha_softc *sc;
struct iha_scsi_req_q *pScb;
{
struct scsi_sense *sensecmd;
+ int error;
- pScb->SCB_BufLen = pScb->SCB_SenseLen;
- pScb->SCB_BufPAddr = pScb->SCB_SensePAddr;
-
- pScb->SCB_Flags &= SCSI_POLL;
+ pScb->SCB_Flags &= SCSI_POLL | SCSI_NOSLEEP;
pScb->SCB_Flags |= FLAG_RSENS | SCSI_DATA_IN;
+ pScb->SCB_BufChars = sizeof(pScb->SCB_ScsiSenseData);
+ pScb->SCB_BufCharsLeft = sizeof(pScb->SCB_ScsiSenseData);
+ bzero(&pScb->SCB_ScsiSenseData, sizeof(pScb->SCB_ScsiSenseData));
+
+ error = bus_dmamap_load(sc->sc_dmat, pScb->SCB_DataDma,
+ &pScb->SCB_ScsiSenseData,
+ sizeof(pScb->SCB_ScsiSenseData), NULL,
+ (pScb->SCB_Flags & SCSI_NOSLEEP) ?
+ BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
+ if (error) {
+ sc_print_addr(pScb->SCB_Xs->sc_link);
+ printf("error %d loading request sense buffer dma map\n",
+ error);
+ return (1);
+ }
+
+ error = iha_setup_sg_list(sc, pScb);
+ if (error) {
+ bus_dmamap_unload(sc->sc_dmat, pScb->SCB_DataDma);
+ return (error);
+ }
+
+ bus_dmamap_sync(sc->sc_dmat, pScb->SCB_DataDma,
+ 0, pScb->SCB_BufChars,
+ (pScb->SCB_Flags & SCSI_DATA_IN) ?
+ BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
+
pScb->SCB_Ident &= ~MSG_IDENTIFY_DISCFLAG;
pScb->SCB_TagMsg = 0;
pScb->SCB_TaStat = SCSI_OK;
bzero(pScb->SCB_CDB, sizeof(pScb->SCB_CDB));
- bzero(&pScb->SCB_ScsiSenseData, sizeof(pScb->SCB_ScsiSenseData));
sensecmd = (struct scsi_sense *)pScb->SCB_CDB;
pScb->SCB_CDBLen = sizeof(*sensecmd);
@@ -837,9 +884,11 @@ iha_push_sense_request(sc, pScb)
if ((pScb->SCB_Flags & SCSI_POLL) == 0)
timeout_add(&pScb->SCB_Xs->stimeout,
- (pScb->SCB_Timeout/1000) * hz);
+ (pScb->SCB_Xs->timeout/1000) * hz);
iha_push_pend_scb(sc, pScb);
+
+ return (0);
}
/*
@@ -872,11 +921,9 @@ iha_scsi_label:
if ((pScb->SCB_Flags & FLAG_RSENS) != 0)
/* Check condition on check condition*/
pScb->SCB_HaStat = HOST_BAD_PHAS;
-
- else {
- iha_push_sense_request(sc, pScb);
+ else if (iha_push_sense_request(sc, pScb) == 0)
+ /* REQUEST SENSE ready to process */
goto iha_scsi_label;
- }
break;
default:
@@ -918,6 +965,7 @@ iha_scsi(sc, iot, ioh)
struct iha_scsi_req_q *pScb;
struct tcs *pTcs;
u_int8_t stat;
+ int i;
/* service pending interrupts asap */
@@ -986,7 +1034,7 @@ iha_scsi(sc, iot, ioh)
}
if ((pScb->SCB_Flags & SCSI_POLL) != 0) {
- for (; pScb->SCB_Timeout > 0; pScb->SCB_Timeout--) {
+ for (i = pScb->SCB_Xs->timeout; i > 0; i--) {
if (iha_wait(sc, iot, ioh, NO_OP) == -1)
break;
if (iha_next_state(sc, iot, ioh) == -1)
@@ -1001,7 +1049,7 @@ iha_scsi(sc, iot, ioh)
*
* Conversely, xs->error has not been set yet
*/
- if (pScb->SCB_Timeout == 0)
+ if (i == 0)
iha_timeout(pScb);
else if ((pScb->SCB_CDB[0] == INQUIRY)
@@ -1013,7 +1061,7 @@ iha_scsi(sc, iot, ioh)
}
/*
- * iha_data_over_run - return HOST_OK for all SCSI opcodes where BufLen
+ * iha_data_over_run - return HOST_OK for all SCSI opcodes where BufCharsLeft
* is an 'Allocation Length'. All other SCSI opcodes
* get HOST_DO_DU as they SHOULD have xferred all the
* data requested.
@@ -1310,7 +1358,7 @@ iha_state_4(sc, iot, ioh)
return (6); /* Both dir flags set => NO xfer was requested */
for (;;) {
- if (pScb->SCB_BufLen == 0)
+ if (pScb->SCB_BufCharsLeft == 0)
return (6);
switch (sc->HCS_Phase) {
@@ -1329,7 +1377,7 @@ iha_state_4(sc, iot, ioh)
case PHASE_MSG_OUT:
if ((sc->HCS_JSStatus0 & SPERR) != 0) {
- pScb->SCB_BufLen = 0;
+ pScb->SCB_BufCharsLeft = 0;
pScb->SCB_HaStat = HOST_SPERR;
if (iha_msgout(sc, iot, ioh,
MSG_INITIATOR_DET_ERR) == -1)
@@ -1373,7 +1421,6 @@ iha_state_5(sc, iot, ioh)
u_int16_t period;
u_int8_t stat;
long xcnt; /* cannot use unsigned!! see code: if (xcnt < 0) */
- int i;
cnt = bus_space_read_4(iot, ioh, TUL_STCNT0) & TCNT;
@@ -1422,37 +1469,38 @@ iha_state_5(sc, iot, ioh)
}
if (cnt == 0) {
- pScb->SCB_BufLen = 0;
+ pScb->SCB_BufCharsLeft = 0;
return (6);
}
/* Update active data pointer and restart the I/O at the new point */
- xcnt = pScb->SCB_BufLen - cnt; /* xcnt == bytes xferred */
- pScb->SCB_BufLen = cnt; /* cnt == bytes left */
+ xcnt = pScb->SCB_BufCharsLeft - cnt; /* xcnt == bytes xferred */
+ pScb->SCB_BufCharsLeft = cnt; /* cnt == bytes left */
+
+ bus_dmamap_sync(sc->sc_dmat, pScb->SCB_SGDma,
+ 0, sizeof(pScb->SCB_SGList), BUS_DMASYNC_POSTWRITE);
if ((pScb->SCB_Flags & FLAG_SG) != 0) {
pSg = &pScb->SCB_SGList[pScb->SCB_SGIdx];
- for (i = pScb->SCB_SGIdx; i < pScb->SCB_SGMax; pSg++, i++) {
+ for (; pScb->SCB_SGIdx < pScb->SCB_SGCount; pSg++, pScb->SCB_SGIdx++) {
xcnt -= pSg->SG_Len;
if (xcnt < 0) {
xcnt += pSg->SG_Len;
- pSg->SG_Ptr += xcnt;
+ pSg->SG_Addr += xcnt;
pSg->SG_Len -= xcnt;
- pScb->SCB_BufPAddr += (i - pScb->SCB_SGIdx)
- * sizeof(struct iha_sg_element);
- pScb->SCB_SGLen = pScb->SCB_SGMax - i;
- pScb->SCB_SGIdx = i;
+ bus_dmamap_sync(sc->sc_dmat, pScb->SCB_SGDma,
+ 0, sizeof(pScb->SCB_SGList),
+ BUS_DMASYNC_PREWRITE);
return (4);
}
}
return (6);
- } else
- pScb->SCB_BufPAddr += xcnt;
+ }
return (4);
}
@@ -1562,25 +1610,30 @@ iha_xfer_data(pScb, iot, ioh, direction)
bus_space_handle_t ioh;
int direction;
{
- u_int32_t xferlen;
+ u_int32_t xferaddr, xferlen;
u_int8_t xfertype;
if ((pScb->SCB_Flags & FLAG_DIR) != direction)
return (6); /* wrong direction, abandon I/O */
- bus_space_write_4(iot, ioh, TUL_STCNT0, pScb->SCB_BufLen);
+ bus_space_write_4(iot, ioh, TUL_STCNT0, pScb->SCB_BufCharsLeft);
if ((pScb->SCB_Flags & FLAG_SG) == 0) {
- xferlen = pScb->SCB_BufLen;
+ xferaddr = pScb->SCB_DataDma->dm_segs[0].ds_addr
+ + (pScb->SCB_BufChars - pScb->SCB_BufCharsLeft);
+ xferlen = pScb->SCB_BufCharsLeft;
xfertype = (direction == SCSI_DATA_IN) ? ST_X_IN : ST_X_OUT;
} else {
- xferlen = pScb->SCB_SGLen * sizeof(struct iha_sg_element);
+ xferaddr = pScb->SCB_SGDma->dm_segs[0].ds_addr
+ + (pScb->SCB_SGIdx * sizeof(struct iha_sg_element));
+ xferlen = (pScb->SCB_SGCount - pScb->SCB_SGIdx)
+ * sizeof(struct iha_sg_element);
xfertype = (direction == SCSI_DATA_IN) ? ST_SG_IN : ST_SG_OUT;
}
bus_space_write_4(iot, ioh, TUL_DXC, xferlen);
- bus_space_write_4(iot, ioh, TUL_DXPA, pScb->SCB_BufPAddr);
+ bus_space_write_4(iot, ioh, TUL_DXPA, xferaddr);
bus_space_write_1(iot, ioh, TUL_DCMD, xfertype);
bus_space_write_1(iot, ioh, TUL_SCMD,
@@ -2423,12 +2476,18 @@ iha_done_scb(sc, pScb)
xs->status = pScb->SCB_TaStat;
- if (pScb->SCB_BufLen > 0) {
- bus_dmamap_sync(sc->sc_dmat, pScb->SCB_Dmamap,
- 0, pScb->SCB_Dmamap->dm_mapsize,
- ((pScb->SCB_Flags & SCSI_DATA_IN) ?
- BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE));
- bus_dmamap_unload(sc->sc_dmat, pScb->SCB_Dmamap);
+ if ((pScb->SCB_Flags & (SCSI_DATA_IN | SCSI_DATA_OUT)) != 0) {
+ bus_dmamap_sync(sc->sc_dmat, pScb->SCB_DataDma,
+ 0, pScb->SCB_BufChars,
+ ((pScb->SCB_Flags & SCSI_DATA_IN) ?
+ BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE));
+ bus_dmamap_unload(sc->sc_dmat, pScb->SCB_DataDma);
+ }
+ if ((pScb->SCB_Flags & FLAG_SG) != 0) {
+ bus_dmamap_sync(sc->sc_dmat, pScb->SCB_SGDma,
+ 0, sizeof(pScb->SCB_SGList),
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(sc->sc_dmat, pScb->SCB_SGDma);
}
switch (pScb->SCB_HaStat) {
@@ -2438,7 +2497,7 @@ iha_done_scb(sc, pScb)
case SCSI_COND_MET:
case SCSI_INTERM:
case SCSI_INTERM_COND_MET:
- xs->resid = pScb->SCB_BufLen;
+ xs->resid = pScb->SCB_BufCharsLeft;
xs->error = XS_NOERROR;
break;
@@ -2625,28 +2684,6 @@ iha_alloc_scbs(sc)
sc->sc_dev.dv_xname, error);
return (error);
}
-
- /*
- * Create and load the DMA map used for the SCBs
- */
- if ((error = bus_dmamap_create(sc->sc_dmat,
- sizeof(struct iha_scsi_req_q)*IHA_MAX_SCB,
- 1, sizeof(struct iha_scsi_req_q)*IHA_MAX_SCB,
- 0, BUS_DMA_NOWAIT, &sc->sc_dmamap))
- != 0) {
- printf("%s: unable to create control DMA map, error = %d\n",
- sc->sc_dev.dv_xname, error);
- return (error);
- }
- if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap,
- sc->HCS_Scb, sizeof(struct iha_scsi_req_q)*IHA_MAX_SCB,
- NULL, BUS_DMA_NOWAIT))
- != 0) {
- printf("%s: unable to load control DMA map, error = %d\n",
- sc->sc_dev.dv_xname, error);
- return (error);
- }
-
bzero(sc->HCS_Scb, sizeof(struct iha_scsi_req_q)*IHA_MAX_SCB);
return (0);
diff --git a/sys/dev/ic/iha.h b/sys/dev/ic/iha.h
index 44bfc6824b2..cfad53dcc33 100644
--- a/sys/dev/ic/iha.h
+++ b/sys/dev/ic/iha.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: iha.h,v 1.11 2002/11/14 02:31:46 krw Exp $ */
+/* $OpenBSD: iha.h,v 1.12 2003/03/29 17:52:01 krw Exp $ */
/*-------------------------------------------------------------------------
*
* Device driver for the INI-9XXXU/UW or INIC-940/950 PCI SCSI Controller.
@@ -42,8 +42,8 @@
* Scatter-Gather Element Structure
*/
struct iha_sg_element {
- u_int32_t SG_Ptr; /* Data Pointer */
- u_int32_t SG_Len; /* Data Length */
+ u_int32_t SG_Addr; /* Physical address of segment */
+ u_int32_t SG_Len; /* Length of segment */
};
/*
@@ -55,22 +55,23 @@ struct iha_sg_element {
struct iha_scsi_req_q {
TAILQ_ENTRY(iha_scsi_req_q) SCB_ScbList;
+ bus_dmamap_t SCB_DataDma; /* maps xfer buffer */
+ bus_dmamap_t SCB_SGDma; /* maps scatter-gather list */
+
int SCB_Status; /* Current status of the SCB */
#define STATUS_QUEUED 0 /* SCB one of Free/Done/Pend */
#define STATUS_RENT 1 /* SCB allocated, not queued */
#define STATUS_SELECT 2 /* SCB being selected */
#define STATUS_BUSY 3 /* SCB I/O is active */
u_int8_t SCB_NxtStat; /* Next state function to apply */
- u_int16_t SCB_SGIdx; /* Scatter/Gather Index */
- u_int16_t SCB_SGMax; /* Scatter/Gather # valid entries */
int SCB_Flags; /* SCB Flags (xs->flags + private)*/
#define FLAG_RSENS 0x00010000 /* Request Sense sent */
#define FLAG_SG 0x00020000 /* Scatter/Gather used */
#define FLAG_DIR (SCSI_DATA_IN | SCSI_DATA_OUT)
u_int8_t SCB_Target; /* Target Id */
u_int8_t SCB_Lun; /* Lun */
- u_int32_t SCB_BufPAddr; /* Data Buffer Physical Addr */
- u_int32_t SCB_BufLen; /* Data Allocation Length */
+ u_int32_t SCB_BufChars; /* size of data buf */
+ u_int32_t SCB_BufCharsLeft; /* Chars left to xfer to/from buf */
u_int8_t SCB_HaStat; /* Status of Host Adapter */
#define HOST_OK 0x00 /* OK - operation a success */
#define HOST_TIMED_OUT 0x01 /* Request timed out */
@@ -81,25 +82,21 @@ struct iha_scsi_req_q {
#define HOST_SCSI_RST 0x1B /* SCSI bus was reset */
#define HOST_DEV_RST 0x1C /* Device was reset */
u_int8_t SCB_TaStat; /* SCSI Status Byte */
- u_int8_t SCB_SGLen; /* # of valid entries in SGList */
- u_int8_t SCB_SenseLen; /* Sense Data Allocation Length */
- u_int8_t SCB_CDBLen; /* CDB Length */
u_int8_t SCB_Ident; /* Identity Message */
u_int8_t SCB_TagMsg; /* Tag Message */
u_int8_t SCB_TagId; /* Queue Tag */
- u_int8_t SCB_CDB[12]; /* SCSI Command */
- u_int32_t SCB_SGPAddr; /* SGList Physical Address */
- u_int32_t SCB_SensePAddr; /* Sense Data PhysicalAddress */
- struct scsi_xfer *SCB_Xs; /* xs this SCB is executing */
+ u_int8_t SCB_CDB[12]; /* SCSI command being executed */
+ u_int8_t SCB_CDBLen; /* Length of SCSI command in CDB */
- /* Start of SG list */
- struct iha_sg_element SCB_SGList[IHA_MAX_SG_ENTRIES];
+ struct scsi_xfer *SCB_Xs; /* xs this SCB is executing */
+
+ struct iha_sg_element SCB_SGList[IHA_MAX_SG_ENTRIES]; /* SG list */
+ u_int16_t SCB_SGCount; /* # segments in list */
+ u_int16_t SCB_SGIdx; /* index to current element */
- struct scsi_sense_data SCB_ScsiSenseData;
- bus_dmamap_t SCB_Dmamap;/* maps xs->buf xfer buffer */
- int SCB_Timeout; /* in milliseconds */
- struct tcs *SCB_Tcs; /* tcs for SCB_Target */
+ struct scsi_sense_data SCB_ScsiSenseData; /* DMA-able sense buffer */
+ struct tcs *SCB_Tcs; /* tcs for SCB_Target */
};
/*