diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2008-04-10 06:39:01 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2008-04-10 06:39:01 +0000 |
commit | 7df2155c114e4ecc55c6a01714e31fbd15d88d1b (patch) | |
tree | 5e3b681fa821142e7ae1d80bccc7745bf6e65dc6 /sys | |
parent | 2444d80f4a0fc67af0fd6f77f251f7110bc8032d (diff) |
the success of a command is reported in the mbox, but not passed on to the
completion routines to do anything useful with.
this stashes the commands status in the ccb for the ccb_done handlers to
use. the completion path for passthru commands now checks the mbox status
to see if the command actually works. this prevents phantom devices from
appearing on the passthru busses.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ic/ami.c | 15 | ||||
-rw-r--r-- | sys/dev/ic/amivar.h | 3 |
2 files changed, 11 insertions, 7 deletions
diff --git a/sys/dev/ic/ami.c b/sys/dev/ic/ami.c index f1858af47cc..b188766fc6e 100644 --- a/sys/dev/ic/ami.c +++ b/sys/dev/ic/ami.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ami.c,v 1.186 2007/12/28 16:19:14 dlg Exp $ */ +/* $OpenBSD: ami.c,v 1.187 2008/04/10 06:39:00 dlg Exp $ */ /* * Copyright (c) 2001 Michael Shalayeff @@ -134,7 +134,7 @@ int ami_alloc_ccbs(struct ami_softc *, int); int ami_poll(struct ami_softc *, struct ami_ccb *); void ami_start(struct ami_softc *, struct ami_ccb *); void ami_complete(struct ami_softc *, struct ami_ccb *, int); -int ami_done(struct ami_softc *, int); +int ami_done(struct ami_softc *, int, int); void ami_runqueue_tick(void *); void ami_runqueue(struct ami_softc *); @@ -1040,7 +1040,7 @@ ami_complete(struct ami_softc *sc, struct ami_ccb *ccb, int timeout) if (sc->sc_done(sc, &mbox) != 0) { for (j = 0; j < mbox.acc_nstat; j++) { int ready = mbox.acc_cmplidl[j]; - ami_done(sc, ready); + ami_done(sc, ready, mbox.acc_status); if (ready == ccb->ccb_cmd.acc_id) done = 1; } @@ -1107,7 +1107,7 @@ ami_stimeout(void *v) } int -ami_done(struct ami_softc *sc, int idx) +ami_done(struct ami_softc *sc, int idx, int status) { struct ami_ccb *ccb = &sc->sc_ccbs[idx - 1]; @@ -1120,6 +1120,7 @@ ami_done(struct ami_softc *sc, int idx) } ccb->ccb_state = AMI_CCB_READY; + ccb->ccb_status = status; TAILQ_REMOVE(&sc->sc_ccb_runq, ccb, ccb_link); ccb->ccb_done(sc, ccb); @@ -1154,7 +1155,9 @@ ami_done_pt(struct ami_softc *sc, struct ami_ccb *ccb) if (ccb->ccb_flags & AMI_CCB_F_ERR) xs->error = XS_DRIVER_STUFFUP; - else if (xs->flags & SCSI_POLL && xs->cmd->opcode == INQUIRY) { + else if (ccb->ccb_status != 0x00) + xs->error = XS_DRIVER_STUFFUP; + else if (xs->flags & SCSI_POLL && xs->cmd->opcode == INQUIRY) { type = ((struct scsi_inquiry_data *)xs->data)->device & SID_TYPE; if (!(type == T_PROCESSOR || type == T_ENCLOSURE)) @@ -1630,7 +1633,7 @@ ami_intr(void *v) AMI_DPRINTF(AMI_D_CMD, ("ready=%d ", ready)); - if (!ami_done(sc, ready)) + if (!ami_done(sc, ready, mbox.acc_status)) rv |= 1; } } diff --git a/sys/dev/ic/amivar.h b/sys/dev/ic/amivar.h index 577bd0ba885..b448c7d14ad 100644 --- a/sys/dev/ic/amivar.h +++ b/sys/dev/ic/amivar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: amivar.h,v 1.52 2007/03/22 16:55:31 deraadt Exp $ */ +/* $OpenBSD: amivar.h,v 1.53 2008/04/10 06:39:00 dlg Exp $ */ /* * Copyright (c) 2001 Michael Shalayeff @@ -70,6 +70,7 @@ struct ami_ccb { } ccb_state; int ccb_flags; #define AMI_CCB_F_ERR (1<<0) + int ccb_status; TAILQ_ENTRY(ami_ccb) ccb_link; }; |