diff options
author | gibbs <gibbs@FreeBSD.org> | 1998-10-09 21:42:19 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 1998-10-09 21:42:19 +0000 |
commit | c0733ada126ddbaab9ed877fd33efb436232947d (patch) | |
tree | 01a44d71a77c2b4c41e0884b380a0946ff303b53 /sys/dev | |
parent | 1b69a2490496d0ccbdcc83503b98381afb1a3991 (diff) | |
download | FreeBSD-src-c0733ada126ddbaab9ed877fd33efb436232947d.zip FreeBSD-src-c0733ada126ddbaab9ed877fd33efb436232947d.tar.gz |
Call dpt_intr from our timeout routine to clear any pending commands before
performing actual timeout processing.
Modify a few printf statements.
Submitted by: Simon Shapiro <shimon@simon-shapiro.org>
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/dpt/dpt_scsi.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/dev/dpt/dpt_scsi.c b/sys/dev/dpt/dpt_scsi.c index 75dad1a..6e41de9 100644 --- a/sys/dev/dpt/dpt_scsi.c +++ b/sys/dev/dpt/dpt_scsi.c @@ -43,7 +43,7 @@ * arrays that span controllers (Wow!). */ -#ident "$Id: dpt_scsi.c,v 1.16 1998/09/22 04:55:07 gibbs Exp $" +#ident "$Id: dpt_scsi.c,v 1.17 1998/10/02 03:40:53 gibbs Exp $" #define _DPT_C_ @@ -1590,7 +1590,7 @@ dptprocesserror(dpt_softc_t *dpt, dpt_ccb_t *dccb, union ccb *ccb, break; default: printf("dpt%d: Undocumented Error %x\n", dpt->unit, hba_stat); - printf("Please mail this message to shimon@i-connect.net\n"); + printf("Please mail this message to shimon@simon-shapiro.org\n"); ccb->ccb_h.status = CAM_REQ_CMP_ERR; break; } @@ -1614,6 +1614,14 @@ dpttimeout(void *arg) s = splcam(); + /* + * Try to clear any pending jobs. FreeBSD will loose interrupts, + * leaving the controller suspended, and commands timed-out. + * By calling the interrupt handler, any command thus stuck will be + * completed. + */ + dpt_intr(dpt); + if ((dccb->state & DCCB_ACTIVE) == 0) { xpt_print_path(ccb->ccb_h.path); printf("CCB %p - timed out CCB already completed\n", @@ -1622,7 +1630,7 @@ dpttimeout(void *arg) return; } - /* Do an abort. I have no idea what this really does... */ + /* Abort this particular command. Leave all others running */ dpt_send_immediate(dpt, &dccb->eata_ccb, dccb->eata_ccb.cp_busaddr, /*retries*/20000, EATA_SPECIFIC_ABORT, 0, 0); ccb->ccb_h.status = CAM_CMD_TIMEOUT; |