summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ic/mpi.c79
-rw-r--r--sys/dev/ic/mpivar.h8
2 files changed, 42 insertions, 45 deletions
diff --git a/sys/dev/ic/mpi.c b/sys/dev/ic/mpi.c
index 2701d433306..ef3930e36f9 100644
--- a/sys/dev/ic/mpi.c
+++ b/sys/dev/ic/mpi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpi.c,v 1.4 2006/05/28 01:29:21 dlg Exp $ */
+/* $OpenBSD: mpi.c,v 1.5 2006/05/28 02:32:55 dlg Exp $ */
/*
* Copyright (c) 2005, 2006 David Gwynne <dlg@openbsd.org>
@@ -49,7 +49,7 @@ struct cfdriver mpi_cd = {
};
int mpi_scsi_cmd(struct scsi_xfer *);
-void mpi_scsi_cmd_done(struct mpi_ccb *, void *, paddr_t);
+void mpi_scsi_cmd_done(struct mpi_ccb *);
void mpi_minphys(struct buf *bp);
int mpi_scsi_ioctl(struct scsi_link *, u_long, caddr_t,
int, struct proc *);
@@ -91,14 +91,14 @@ int mpi_handshake_recv_dword(struct mpi_softc *,
u_int32_t *);
int mpi_handshake_recv(struct mpi_softc *, void *, size_t);
+void mpi_empty_done(struct mpi_ccb *);
+
int mpi_iocinit(struct mpi_softc *);
int mpi_iocfacts(struct mpi_softc *);
int mpi_portfacts(struct mpi_softc *);
-void mpi_portfacts_done(struct mpi_ccb *, void *, paddr_t);
int mpi_eventnotify(struct mpi_softc *);
-void mpi_eventnotify_done(struct mpi_ccb *, void *, paddr_t);
+void mpi_eventnotify_done(struct mpi_ccb *);
int mpi_portenable(struct mpi_softc *);
-void mpi_portenable_done(struct mpi_ccb *, void *, paddr_t);
#define DEVNAME(s) ((s)->sc_dev.dv_xname)
@@ -263,8 +263,11 @@ mpi_intr(void *arg)
bus_dmamap_sync(sc->sc_dmat, MPI_DMA_MAP(sc->sc_requests),
ccb->ccb_offset, MPI_REQUEST_SIZE, BUS_DMASYNC_POSTWRITE);
+ ccb->ccb_state = MPI_CCB_READY;
+ ccb->ccb_reply = reply;
+ ccb->ccb_reply_dva = reply_dva;
- ccb->ccb_done(ccb, reply, reply_dva);
+ ccb->ccb_done(ccb);
rv = 1;
}
@@ -333,7 +336,6 @@ mpi_alloc_ccbs(struct mpi_softc *sc)
int i;
TAILQ_INIT(&sc->sc_ccb_free);
- TAILQ_INIT(&sc->sc_ccb_runq);
sc->sc_ccbs = malloc(sizeof(struct mpi_ccb) * sc->sc_maxcmds,
M_DEVBUF, M_WAITOK);
@@ -445,7 +447,6 @@ mpi_start(struct mpi_softc *sc, struct mpi_ccb *ccb)
ccb->ccb_offset, MPI_REQUEST_SIZE, BUS_DMASYNC_PREWRITE);
ccb->ccb_state = MPI_CCB_QUEUED;
- TAILQ_INSERT_TAIL(&sc->sc_ccb_runq, ccb, ccb_link);
mpi_write(sc, MPI_REQ_QUEUE, ccb->ccb_cmd_dva);
}
@@ -509,8 +510,11 @@ mpi_poll(struct mpi_softc *sc, struct mpi_ccb *nccb)
bus_dmamap_sync(sc->sc_dmat, MPI_DMA_MAP(sc->sc_requests),
ccb->ccb_offset, MPI_REQUEST_SIZE, BUS_DMASYNC_POSTWRITE);
+ ccb->ccb_state = MPI_CCB_READY;
+ ccb->ccb_reply = reply;
+ ccb->ccb_reply_dva = reply_dva;
- ccb->ccb_done(ccb, reply, reply_dva);
+ ccb->ccb_done(ccb);
} while (nccb->ccb_id != id);
@@ -610,13 +614,13 @@ mpi_scsi_cmd(struct scsi_xfer *xs)
}
void
-mpi_scsi_cmd_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
+mpi_scsi_cmd_done(struct mpi_ccb *ccb)
{
struct mpi_softc *sc = ccb->ccb_sc;
struct scsi_xfer *xs = ccb->ccb_xs;
struct mpi_ccb_bundle *mcb = ccb->ccb_cmd;
bus_dmamap_t dmap = ccb->ccb_dmamap;
- struct mpi_msg_scsi_io_error *sie = reply;
+ struct mpi_msg_scsi_io_error *sie = ccb->ccb_reply;
if (xs->datalen != 0) {
bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
@@ -674,7 +678,6 @@ mpi_scsi_cmd_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
}
#endif /* MPI_DEBUG */
-
xs->status = sie->scsi_status;
switch (sie->ioc_status) {
case MPI_IOCSTATUS_SCSI_DATA_OVERRUN:
@@ -771,7 +774,7 @@ mpi_scsi_cmd_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
DPRINTFN(10, "%s: xs error: 0x%02x len: %d\n", DEVNAME(sc),
xs->error, xs->status);
- mpi_push_reply(sc, reply_dva);
+ mpi_push_reply(sc, ccb->ccb_reply_dva);
mpi_put_ccb(sc, ccb);
scsi_done(xs);
}
@@ -1102,6 +1105,12 @@ mpi_handshake_recv(struct mpi_softc *sc, void *buf, size_t dwords)
return (0);
}
+void
+mpi_empty_done(struct mpi_ccb *ccb)
+{
+ /* nothing to do */
+}
+
int
mpi_iocfacts(struct mpi_softc *sc)
{
@@ -1270,6 +1279,7 @@ mpi_portfacts(struct mpi_softc *sc)
{
struct mpi_ccb *ccb;
struct mpi_msg_portfacts_request *pfq;
+ struct mpi_msg_portfacts_reply *pfp;
int s;
DPRINTF("%s: %s\n", DEVNAME(sc), __func__);
@@ -1282,7 +1292,7 @@ mpi_portfacts(struct mpi_softc *sc)
return (1);
}
- ccb->ccb_done = mpi_portfacts_done;
+ ccb->ccb_done = mpi_empty_done;
pfq = ccb->ccb_cmd;
pfq->function = MPI_FUNCTION_PORT_FACTS;
@@ -1293,17 +1303,7 @@ mpi_portfacts(struct mpi_softc *sc)
mpi_poll(sc, ccb);
- return (0);
-}
-
-void
-mpi_portfacts_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
-{
- struct mpi_softc *sc = ccb->ccb_sc;
- struct mpi_msg_portfacts_reply *pfp = reply;
-
- DPRINTF("%s: %s\n", DEVNAME(sc), __func__);
-
+ pfp = ccb->ccb_reply;
if (pfp == NULL)
panic("%s: empty portfacts reply\n", DEVNAME(sc));
@@ -1344,8 +1344,10 @@ mpi_portfacts_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
sc->sc_porttype = pfp->port_type;
sc->sc_target = letoh16(pfp->port_scsi_id);
- mpi_push_reply(sc, reply_dva);
+ mpi_push_reply(sc, ccb->ccb_reply_dva);
mpi_put_ccb(sc, ccb);
+
+ return (0);
}
int
@@ -1377,10 +1379,10 @@ mpi_eventnotify(struct mpi_softc *sc)
}
void
-mpi_eventnotify_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
+mpi_eventnotify_done(struct mpi_ccb *ccb)
{
struct mpi_softc *sc = ccb->ccb_sc;
- struct mpi_msg_event_reply *enp = reply;
+ struct mpi_msg_event_reply *enp = ccb->ccb_reply;
u_int32_t *data;
int i;
@@ -1402,7 +1404,7 @@ mpi_eventnotify_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
printf("%s: ioc_loginfo: 0x%08x\n", DEVNAME(sc),
letoh32(enp->ioc_loginfo));
- data = reply;
+ data = ccb->ccb_reply;
data += dwordsof(struct mpi_msg_event_reply);
for (i = 0; i < letoh16(enp->data_length); i++) {
printf("%s: data[%d]: 0x%08x\n", DEVNAME(sc), i, data[i]);
@@ -1414,6 +1416,7 @@ mpi_portenable(struct mpi_softc *sc)
{
struct mpi_ccb *ccb;
struct mpi_msg_portenable_request *peq;
+ struct mpi_msg_portenable_repy *pep;
int s;
DPRINTF("%s: %s\n", DEVNAME(sc), __func__);
@@ -1426,7 +1429,7 @@ mpi_portenable(struct mpi_softc *sc)
return (1);
}
- ccb->ccb_done = mpi_portenable_done;
+ ccb->ccb_done = mpi_empty_done;
peq = ccb->ccb_cmd;
peq->function = MPI_FUNCTION_PORT_ENABLE;
@@ -1435,20 +1438,12 @@ mpi_portenable(struct mpi_softc *sc)
mpi_poll(sc, ccb);
- return (0);
-}
-
-void
-mpi_portenable_done(struct mpi_ccb *ccb, void *reply, paddr_t reply_dva)
-{
- struct mpi_softc *sc = ccb->ccb_sc;
- struct mpi_msg_portenable_reply *pep = reply;
-
- DPRINTF("%s: %s\n", DEVNAME(sc), __func__);
-
+ pep = ccb->ccb_reply;
if (pep == NULL)
panic("%s: empty portfacts reply\n", DEVNAME(sc));
- mpi_push_reply(sc, reply_dva);
+ mpi_push_reply(sc, ccb->ccb_reply_dva);
mpi_put_ccb(sc, ccb);
+
+ return (0);
}
diff --git a/sys/dev/ic/mpivar.h b/sys/dev/ic/mpivar.h
index d1a70619e71..be1f3bcb633 100644
--- a/sys/dev/ic/mpivar.h
+++ b/sys/dev/ic/mpivar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpivar.h,v 1.1 2006/05/27 19:03:55 dlg Exp $ */
+/* $OpenBSD: mpivar.h,v 1.2 2006/05/28 02:32:55 dlg Exp $ */
/*
* Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
@@ -57,7 +57,9 @@ struct mpi_ccb {
MPI_CCB_READY,
MPI_CCB_QUEUED
} ccb_state;
- void (*ccb_done)(struct mpi_ccb *, void *, paddr_t);
+ void (*ccb_done)(struct mpi_ccb *);
+ void *ccb_reply;
+ paddr_t ccb_reply_dva;
TAILQ_ENTRY(mpi_ccb) ccb_link;
};
@@ -82,7 +84,7 @@ struct mpi_softc {
struct mpi_dmamem *sc_requests;
struct mpi_ccb *sc_ccbs;
- struct mpi_ccb_list sc_ccb_free, sc_ccb_runq;
+ struct mpi_ccb_list sc_ccb_free;
struct mpi_dmamem *sc_replies;
};