diff options
author | gibbs <gibbs@FreeBSD.org> | 2000-11-12 05:19:46 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 2000-11-12 05:19:46 +0000 |
commit | d33dab279a6af703acd11e513c919f6710dadae9 (patch) | |
tree | b12b62a27628c92b53bd55e349d111ff0c9341df /sys/dev/aic7xxx | |
parent | be3c041cb16119448e795e5ed184330799eff3ce (diff) | |
download | FreeBSD-src-d33dab279a6af703acd11e513c919f6710dadae9.zip FreeBSD-src-d33dab279a6af703acd11e513c919f6710dadae9.tar.gz |
aic7xxx.c:
Shutdown the card when a catastrophic error occurs. This quenches
any interrupts stemming from the card.
aic7xxx_inline.h:
Return instead of processing additional interrupt state
after handling a catastrophic error. We now shutdown the
chip in this case in the hopes that the system can live
without this controller. The shutdown process invalidates any
other interrupt state.
aic7xxx.seq:
Only attempt to clear SCSIBUSL on Ultra2 controllers. The
clearing is workaround for a selection timeout bug on U2/U160
controllers and happens to be illegal on aic7770 (EISA/VL)
controllers.
Diffstat (limited to 'sys/dev/aic7xxx')
-rw-r--r-- | sys/dev/aic7xxx/aic7xxx.c | 3 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aic7xxx.seq | 12 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aic7xxx_inline.h | 5 |
3 files changed, 16 insertions, 4 deletions
diff --git a/sys/dev/aic7xxx/aic7xxx.c b/sys/dev/aic7xxx/aic7xxx.c index 2a51edc..e21b9a1 100644 --- a/sys/dev/aic7xxx/aic7xxx.c +++ b/sys/dev/aic7xxx/aic7xxx.c @@ -368,6 +368,9 @@ ahc_handle_brkadrint(struct ahc_softc *ahc) ahc_abort_scbs(ahc, CAM_TARGET_WILDCARD, ALL_CHANNELS, CAM_LUN_WILDCARD, SCB_LIST_NULL, ROLE_UNKNOWN, CAM_NO_HBA); + + /* Disable all interrupt sources by resetting the controller */ + ahc_shutdown(ahc); } void diff --git a/sys/dev/aic7xxx/aic7xxx.seq b/sys/dev/aic7xxx/aic7xxx.seq index 2c1bfdb1..2457e50 100644 --- a/sys/dev/aic7xxx/aic7xxx.seq +++ b/sys/dev/aic7xxx/aic7xxx.seq @@ -57,7 +57,9 @@ poll_for_work: call clear_target_state; and SXFRCTL0, ~SPIOEN; - clr SCSIBUSL; + if ((ahc->features & AHC_ULTRA2) != 0) { + clr SCSIBUSL; + } poll_for_work_loop: test SSTAT0, SELDO|SELDI jnz selection; test SCSISEQ, ENSELO jnz poll_for_work_loop; @@ -508,7 +510,9 @@ target_busfree_wait: test SCSISIGI, ACKI jnz .; target_busfree: and SIMODE1, ~ENBUSFREE; - clr SCSIBUSL; + if ((ahc->features & AHC_ULTRA2) != 0) { + clr SCSIBUSL; + } clr SCSISIGO; mvi LASTPHASE, P_BUSFREE; call complete_target_cmd; @@ -635,7 +639,9 @@ ITloop: await_busfree: and SIMODE1, ~ENBUSFREE; mov NONE, SCSIDATL; /* Ack the last byte */ - clr SCSIBUSL; /* Prevent bit leakage durint SELTO */ + if ((ahc->features & AHC_ULTRA2) != 0) { + clr SCSIBUSL; /* Prevent bit leakage durint SELTO */ + } and SXFRCTL0, ~SPIOEN; test SSTAT1,REQINIT|BUSFREE jz .; test SSTAT1, BUSFREE jnz poll_for_work; diff --git a/sys/dev/aic7xxx/aic7xxx_inline.h b/sys/dev/aic7xxx/aic7xxx_inline.h index c997632..6d6df14 100644 --- a/sys/dev/aic7xxx/aic7xxx_inline.h +++ b/sys/dev/aic7xxx/aic7xxx_inline.h @@ -400,8 +400,11 @@ ahc_intr(struct ahc_softc *ahc) ahc_run_tqinfifo(ahc, /*paused*/FALSE); #endif } - if (intstat & BRKADRINT) + if (intstat & BRKADRINT) { ahc_handle_brkadrint(ahc); + /* Fatal error, no more interrupts to handle. */ + return; + } if ((intstat & (SEQINT|SCSIINT)) != 0) ahc_pause_bug_fix(ahc); |