summaryrefslogtreecommitdiff
path: root/sys/dev/ic/ciss.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ic/ciss.c')
-rw-r--r--sys/dev/ic/ciss.c72
1 files changed, 48 insertions, 24 deletions
diff --git a/sys/dev/ic/ciss.c b/sys/dev/ic/ciss.c
index 565452b910f..3bae70fd335 100644
--- a/sys/dev/ic/ciss.c
+++ b/sys/dev/ic/ciss.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ciss.c,v 1.6 2005/08/20 18:01:35 mickey Exp $ */
+/* $OpenBSD: ciss.c,v 1.7 2005/09/07 04:00:16 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -131,6 +131,7 @@ ciss_attach(struct ciss_softc *sc)
struct ciss_inquiry *inq;
bus_dma_segment_t seg[1];
int error, i, total, rseg, maxfer;
+ ciss_lock_t lock;
paddr_t pa;
bus_space_read_region_4(sc->iot, sc->cfg_ioh, sc->cfgoff,
@@ -297,9 +298,11 @@ ciss_attach(struct ciss_softc *sc)
}
bzero(sc->scratch, PAGE_SIZE);
+ lock = CISS_LOCK_SCRATCH(sc);
inq = sc->scratch;
if (ciss_inq(sc, inq)) {
printf(": adapter inquiry failed\n");
+ CISS_UNLOCK_SCRATCH(sc, lock);
bus_dmamem_free(sc->dmat, sc->cmdseg, 1);
bus_dmamap_destroy(sc->dmat, sc->cmdmap);
return -1;
@@ -308,6 +311,7 @@ ciss_attach(struct ciss_softc *sc)
if (!(inq->flags & CISS_INQ_BIGMAP)) {
printf(": big map is not supported, flags=%b\n",
inq->flags, CISS_INQ_BITS);
+ CISS_UNLOCK_SCRATCH(sc, lock);
bus_dmamem_free(sc->dmat, sc->cmdseg, 1);
bus_dmamap_destroy(sc->dmat, sc->cmdmap);
return -1;
@@ -320,6 +324,11 @@ ciss_attach(struct ciss_softc *sc)
inq->numld, inq->numld == 1? "" : "s",
inq->hw_rev, inq->fw_running, inq->fw_stored);
+ CISS_UNLOCK_SCRATCH(sc, lock);
+
+ timeout_set(&sc->sc_hb, ciss_heartbeat, sc);
+ timeout_add(&sc->sc_hb, hz * 3);
+
/* map LDs */
if (ciss_ldmap(sc)) {
printf("%s: adapter LD map failed\n", sc->sc_dev.dv_xname);
@@ -331,7 +340,7 @@ ciss_attach(struct ciss_softc *sc)
/* TODO scan all physdev */
/* TODO scan all logdev */
-#if 0
+ sc->sc_flush = CISS_FLUSH_ENABLE;
if (!(sc->sc_sh = shutdownhook_establish(ciss_shutdown, sc))) {
printf(": unable to establish shutdown hook\n");
bus_dmamem_free(sc->dmat, sc->cmdseg, 1);
@@ -339,6 +348,7 @@ ciss_attach(struct ciss_softc *sc)
return -1;
}
+#if 0
if (kthread_create(ciss_kthread, sc, NULL, "%s", sc->sc_dev.dv_xname)) {
printf(": unable to create kernel thread\n");
shutdownhook_disestablish(sc->sc_sh);
@@ -348,9 +358,6 @@ ciss_attach(struct ciss_softc *sc)
}
#endif
- timeout_set(&sc->sc_hb, ciss_heartbeat, sc);
- timeout_add(&sc->sc_hb, hz * 3);
-
sc->sc_link.device = &ciss_dev;
sc->sc_link.adapter_softc = sc;
sc->sc_link.openings = sc->maxcmd / sc->maxunits; /* XXX */
@@ -382,8 +389,9 @@ ciss_shutdown(void *v)
{
struct ciss_softc *sc = v;
- ciss_sync(sc);
+ sc->sc_flush = CISS_FLUSH_DISABLE;
timeout_del(&sc->sc_hb);
+ ciss_sync(sc);
}
void
@@ -539,7 +547,7 @@ ciss_cmd(struct ciss_ccb *ccb, int flags, int wait)
}
int
-ciss_done(struct ciss_ccb *ccb) /* TODO */
+ciss_done(struct ciss_ccb *ccb)
{
struct ciss_softc *sc = ccb->ccb_sc;
struct scsi_xfer *xs = ccb->ccb_xs;
@@ -669,11 +677,14 @@ ciss_ldmap(struct ciss_softc *sc)
struct ciss_ccb *ccb;
struct ciss_cmd *cmd;
struct ciss_ldmap *lmap;
- int total, error;
+ ciss_lock_t lock;
+ int total, rv;
+ lock = CISS_LOCK_SCRATCH(sc);
lmap = sc->scratch;
lmap->size = htobe32(sc->maxunits * sizeof(lmap->map));
total = sizeof(*lmap) + (sc->maxunits - 1) * sizeof(lmap->map);
+
ccb = ciss_get_ccb(sc);
ccb->ccb_len = total;
ccb->ccb_data = lmap;
@@ -688,41 +699,49 @@ ciss_ldmap(struct ciss_softc *sc)
cmd->cdb[8] = total >> 8; /* biiiig endian */
cmd->cdb[9] = total & 0xff;
- if ((error = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL|SCSI_NOSLEEP)))
- return error;
+ rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL|SCSI_NOSLEEP);
+ CISS_UNLOCK_SCRATCH(sc, lock);
+ if (rv)
+ return rv;
printf("lmap %x:%x ", lmap->map[0].tgt, lmap->map[0].tgt2);
return 0;
}
int
-ciss_sync(struct ciss_softc *sc) /* TODO */
+ciss_sync(struct ciss_softc *sc)
{
-#if 0
struct ciss_ccb *ccb;
struct ciss_cmd *cmd;
+ struct ciss_flush *flush;
+ ciss_lock_t lock;
+ int rv;
+
+ lock = CISS_LOCK_SCRATCH(sc);
+ flush = sc->scratch;
+ bzero(flush, sizeof(*flush));
+ flush->flush = sc->sc_flush;
- inq = sc->scratch;
ccb = ciss_get_ccb(sc);
- ccb->ccb_len = sizeof(*inq);
- ccb->ccb_data = inq;
+ ccb->ccb_len = sizeof(*flush);
+ ccb->ccb_data = flush;
cmd = &ccb->ccb_cmd;
cmd->tgt = CISS_CMD_MODE_PERIPH;
cmd->tgt2 = 0;
cmd->cdblen = 10;
- cmd->flags = CISS_CDB_CMD | CISS_CDB_SIMPL | CISS_CDB_IN;
+ cmd->flags = CISS_CDB_CMD | CISS_CDB_SIMPL | CISS_CDB_OUT;
cmd->tmo = 0;
bzero(&cmd->cdb[0], sizeof(cmd->cdb));
- cmd->cdb[0] = CISS_CMD_CTRL_GET;
- cmd->cdb[6] = CISS_CMS_CTRL_CTRL;
- cmd->cdb[7] = sizeof(*inq) >> 8; /* biiiig endian */
- cmd->cdb[8] = sizeof(*inq) & 0xff;
+ cmd->cdb[0] = CISS_CMD_CTRL_SET;
+ cmd->cdb[6] = CISS_CMS_CTRL_FLUSH;
+ cmd->cdb[7] = sizeof(*flush) >> 8; /* biiiig endian */
+ cmd->cdb[8] = sizeof(*flush) & 0xff;
- return ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL|SCSI_NOSLEEP);
-#else
- return 0;
-#endif
+ rv = ciss_cmd(ccb, BUS_DMA_NOWAIT, SCSI_POLL|SCSI_NOSLEEP);
+ CISS_UNLOCK_SCRATCH(sc, lock);
+
+ return rv;
}
int
@@ -762,6 +781,7 @@ ciss_scsi_raw_cmd(struct scsi_xfer *xs) /* TODO */
ccb->ccb_xs = xs;
+
cmd->cdblen = xs->cmdlen;
cmd->flags = CISS_CDB_CMD | CISS_CDB_SIMPL;
if (xs->flags & SCSI_DATA_IN)
@@ -812,6 +832,8 @@ ciss_scsi_cmd(struct scsi_xfer *xs)
error = 0;
xs->error = XS_NOERROR;
+ /* XXX emulate SYNCHRONIZE_CACHE ??? */
+
ccb = ciss_get_ccb(sc);
cmd = &ccb->ccb_cmd;
ccb->ccb_len = xs->datalen;
@@ -933,6 +955,8 @@ ciss_ioctl(struct device *dev, u_long cmd, caddr_t addr) /* TODO */
case BIOCVOL:
case BIOCDISK:
case BIOCALARM:
+ case BIOCBLINK:
+ case BIOCSETSTATE:
default:
CISS_DPRINTF(CISS_D_IOCTL, ("%s: invalid ioctl\n",
sc->sc_dev.dv_xname));