diff options
-rw-r--r-- | sys/dev/ic/ciss.c | 72 | ||||
-rw-r--r-- | sys/dev/ic/cissvar.h | 3 |
2 files changed, 37 insertions, 38 deletions
diff --git a/sys/dev/ic/ciss.c b/sys/dev/ic/ciss.c index 2b1c7afc7df..013a94c2f8a 100644 --- a/sys/dev/ic/ciss.c +++ b/sys/dev/ic/ciss.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ciss.c,v 1.50 2010/06/02 05:38:00 dlg Exp $ */ +/* $OpenBSD: ciss.c,v 1.51 2010/06/02 13:34:21 dlg Exp $ */ /* * Copyright (c) 2005,2006 Michael Shalayeff @@ -93,8 +93,8 @@ void ciss_kthread(void *v); void ciss_sensors(void *); #endif -struct ciss_ccb *ciss_get_ccb(struct ciss_softc *sc); -void ciss_put_ccb(struct ciss_ccb *ccb); +void * ciss_get_ccb(void *); +void ciss_put_ccb(void *, void *); int ciss_cmd(struct ciss_ccb *ccb, int flags, int wait); int ciss_done(struct ciss_ccb *ccb); int ciss_error(struct ciss_ccb *ccb); @@ -107,9 +107,10 @@ int ciss_ldstat(struct ciss_softc *, int, struct ciss_ldstat *); int ciss_pdid(struct ciss_softc *, u_int8_t, struct ciss_pdid *, int); int ciss_blink(struct ciss_softc *, int, int, int, struct ciss_blink *); -struct ciss_ccb * -ciss_get_ccb(struct ciss_softc *sc) +void * +ciss_get_ccb(void *xsc) { + struct ciss_softc *sc = xsc; struct ciss_ccb *ccb; mtx_enter(&sc->sc_free_ccb_mtx); @@ -124,9 +125,10 @@ ciss_get_ccb(struct ciss_softc *sc) } void -ciss_put_ccb(struct ciss_ccb *ccb) +ciss_put_ccb(void *xsc, void *xccb) { - struct ciss_softc *sc = ccb->ccb_sc; + struct ciss_softc *sc = xsc; + struct ciss_ccb *ccb = xccb; ccb->ccb_state = CISS_CCB_FREE; ccb->ccb_xs = NULL; @@ -284,6 +286,8 @@ ciss_attach(struct ciss_softc *sc) TAILQ_INSERT_TAIL(&sc->sc_free_ccb, ccb, ccb_link); } + scsi_iopool_init(&sc->sc_iopool, sc, ciss_get_ccb, ciss_put_ccb); + if (i < sc->maxcmd) { printf(": cannot create ccb#%d dmamap (%d)\n", i, error); if (i == 0) { @@ -382,6 +386,7 @@ ciss_attach(struct ciss_softc *sc) sc->sc_link.luns = 1; sc->sc_link.adapter_target = sc->maxunits; sc->sc_link.adapter_buswidth = sc->maxunits; + sc->sc_link.pool = &sc->sc_iopool; bzero(&saa, sizeof(saa)); saa.saa_sc_link = &sc->sc_link; scsibus = (struct scsibus_softc *)config_found_sm(&sc->sc_dev, @@ -490,7 +495,6 @@ ciss_cmd(struct ciss_ccb *ccb, int flags, int wait) ccb->ccb_xs->error = XS_DRIVER_STUFFUP; scsi_done(ccb->ccb_xs); } - ciss_put_ccb(ccb); return (error); } cmd->sgin = dmap->dm_nsegs; @@ -522,10 +526,6 @@ ciss_cmd(struct ciss_ccb *ccb, int flags, int wait) bus_dmamap_sync(sc->dmat, sc->cmdmap, 0, sc->cmdmap->dm_mapsize, BUS_DMASYNC_PREWRITE); - if ((wait & (SCSI_POLL|SCSI_NOSLEEP)) == (SCSI_POLL|SCSI_NOSLEEP)) - bus_space_write_4(sc->iot, sc->ioh, CISS_IMR, - bus_space_read_4(sc->iot, sc->ioh, CISS_IMR) | sc->iem); - ccb->ccb_state = CISS_CCB_ONQ; CISS_DPRINTF(CISS_D_CMD, ("submit=0x%x ", cmd->id)); if (sc->cfg.methods & (CISS_METH_FIFO64|CISS_METH_FIFO64_RRO)) { @@ -612,23 +612,17 @@ ciss_cmd(struct ciss_ccb *ccb, int flags, int wait) error = ciss_done(ccb1); if (ccb1 == ccb) - break; + return (error); } /* if never got a chance to be done above... */ - if (ccb->ccb_state != CISS_CCB_FREE) { - ccb->ccb_err.cmd_stat = CISS_ERR_TMO; - error = ciss_done(ccb); - } + ccb->ccb_err.cmd_stat = CISS_ERR_TMO; + error = ciss_done(ccb); CISS_DPRINTF(CISS_D_CMD, ("done %d:%d", ccb->ccb_err.cmd_stat, ccb->ccb_err.scsi_stat)); } - if ((wait & (SCSI_POLL|SCSI_NOSLEEP)) == (SCSI_POLL|SCSI_NOSLEEP)) - bus_space_write_4(sc->iot, sc->ioh, CISS_IMR, - bus_space_read_4(sc->iot, sc->ioh, CISS_IMR) & ~sc->iem); - return (error); } @@ -666,8 +660,6 @@ ciss_done(struct ciss_ccb *ccb) scsi_done(ccb->ccb_xs); } - ciss_put_ccb(ccb); - CISS_UNLOCK(sc, lock); return error; @@ -745,7 +737,7 @@ ciss_inq(struct ciss_softc *sc, struct ciss_inquiry *inq) int rv; int s; - ccb = ciss_get_ccb(sc); + ccb = scsi_io_get(&sc->sc_iopool, SCSI_POLL|SCSI_NOSLEEP); if (ccb == NULL) return ENOMEM; @@ -767,6 +759,8 @@ ciss_inq(struct ciss_softc *sc, struct ciss_inquiry *inq) rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL|SCSI_NOSLEEP); splx(s); + scsi_io_put(&sc->sc_iopool, ccb); + return (rv); } @@ -784,7 +778,7 @@ ciss_ldmap(struct ciss_softc *sc) lmap->size = htobe32(sc->maxunits * sizeof(lmap->map)); total = sizeof(*lmap) + (sc->maxunits - 1) * sizeof(lmap->map); - ccb = ciss_get_ccb(sc); + ccb = scsi_io_get(&sc->sc_iopool, SCSI_POLL|SCSI_NOSLEEP); if (ccb == NULL) return ENOMEM; @@ -802,6 +796,7 @@ ciss_ldmap(struct ciss_softc *sc) cmd->cdb[9] = total & 0xff; rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL|SCSI_NOSLEEP); + scsi_io_put(&sc->sc_iopool, ccb); CISS_UNLOCK_SCRATCH(sc, lock); if (rv) @@ -827,7 +822,7 @@ ciss_sync(struct ciss_softc *sc) bzero(flush, sizeof(*flush)); flush->flush = sc->sc_flush; - ccb = ciss_get_ccb(sc); + ccb = scsi_io_get(&sc->sc_iopool, SCSI_POLL|SCSI_NOSLEEP); if (ccb == NULL) return ENOMEM; @@ -846,6 +841,7 @@ ciss_sync(struct ciss_softc *sc) cmd->cdb[8] = sizeof(*flush) & 0xff; rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL|SCSI_NOSLEEP); + scsi_io_put(&sc->sc_iopool, ccb); CISS_UNLOCK_SCRATCH(sc, lock); return rv; @@ -855,7 +851,6 @@ void ciss_scsi_cmd(struct scsi_xfer *xs) { struct scsi_link *link = xs->sc_link; - struct ciss_softc *sc = link->adapter_softc; u_int8_t target = link->target; struct ciss_ccb *ccb; struct ciss_cmd *cmd; @@ -878,12 +873,7 @@ ciss_scsi_cmd(struct scsi_xfer *xs) /* XXX emulate SYNCHRONIZE_CACHE ??? */ - ccb = ciss_get_ccb(sc); - if (ccb == NULL) { - xs->error = XS_NO_CCB; - scsi_done(xs); - return; - } + ccb = xs->io; cmd = &ccb->ccb_cmd; ccb->ccb_len = xs->datalen; @@ -1231,7 +1221,7 @@ ciss_ldid(struct ciss_softc *sc, int target, struct ciss_ldid *id) int rv; int s; - ccb = ciss_get_ccb(sc); + ccb = scsi_io_get(&sc->sc_iopool, SCSI_POLL); if (ccb == NULL) return ENOMEM; @@ -1254,6 +1244,8 @@ ciss_ldid(struct ciss_softc *sc, int target, struct ciss_ldid *id) rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL); splx(s); + scsi_io_put(&sc->sc_iopool, ccb); + return (rv); } @@ -1265,7 +1257,7 @@ ciss_ldstat(struct ciss_softc *sc, int target, struct ciss_ldstat *stat) int rv; int s; - ccb = ciss_get_ccb(sc); + ccb = scsi_io_get(&sc->sc_iopool, SCSI_POLL); if (ccb == NULL) return ENOMEM; @@ -1288,6 +1280,8 @@ ciss_ldstat(struct ciss_softc *sc, int target, struct ciss_ldstat *stat) rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL); splx(s); + scsi_io_put(&sc->sc_iopool, ccb); + return (rv); } @@ -1299,7 +1293,7 @@ ciss_pdid(struct ciss_softc *sc, u_int8_t drv, struct ciss_pdid *id, int wait) int rv; int s; - ccb = ciss_get_ccb(sc); + ccb = scsi_io_get(&sc->sc_iopool, SCSI_POLL); if (ccb == NULL) return ENOMEM; @@ -1322,6 +1316,8 @@ ciss_pdid(struct ciss_softc *sc, u_int8_t drv, struct ciss_pdid *id, int wait) rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, wait); splx(s); + scsi_io_put(&sc->sc_iopool, ccb); + return (rv); } @@ -1383,7 +1379,7 @@ ciss_blink(struct ciss_softc *sc, int ld, int pd, int stat, CISS_BLINK_ALL; bcopy(&ldp->bling, blink, sizeof(*blink)); - ccb = ciss_get_ccb(sc); + ccb = scsi_io_get(&sc->sc_iopool, SCSI_POLL); if (ccb == NULL) return ENOMEM; @@ -1405,6 +1401,8 @@ ciss_blink(struct ciss_softc *sc, int ld, int pd, int stat, rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL); splx(s); + scsi_io_put(&sc->sc_iopool, ccb); + return (rv); } #endif diff --git a/sys/dev/ic/cissvar.h b/sys/dev/ic/cissvar.h index 049c9ff9983..abb476739ab 100644 --- a/sys/dev/ic/cissvar.h +++ b/sys/dev/ic/cissvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cissvar.h,v 1.11 2010/06/02 01:33:57 dlg Exp $ */ +/* $OpenBSD: cissvar.h,v 1.12 2010/06/02 13:34:21 dlg Exp $ */ /* * Copyright (c) 2005,2006 Michael Shalayeff @@ -42,6 +42,7 @@ struct ciss_softc { int ccblen, maxcmd, maxsg, nbus, ndrives, maxunits; ciss_queue_head sc_free_ccb; struct mutex sc_free_ccb_mtx; + struct scsi_iopool sc_iopool; bus_space_tag_t iot; bus_space_handle_t ioh, cfg_ioh; |