summaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorDavid Milburn <dmilburn@redhat.com>2008-01-25 19:16:18 +0100
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-30 20:03:39 +0100
commit969ceffb6696ac361db9dbc33c83f855dbdb1528 (patch)
treeb542507aa954eef1311b94f7b43ea31c23c10f1e /drivers/scsi
parent[SCSI] sgiwd93: use cached memory access to make driver work on IP28 (diff)
downloadlinux-969ceffb6696ac361db9dbc33c83f855dbdb1528.tar.xz
linux-969ceffb6696ac361db9dbc33c83f855dbdb1528.zip
[SCSI] aic7xxx: fix ahc_done check SCB_ACTIVE for tagged transactions
The driver only needs to check the SCB_ACTIVE flag if the SCB is not in the untagged queue. If the driver is in error recovery, you may end panic'ing on a TUR that is in the untagged queue. Attempting to queue an ABORT message CDB: 0x0 0x0 0x0 0x0 0x0 0x0 SCB 3 done'd twice This patch is included in Adaptec's 6.3.11 driver on their website. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/aic7xxx/aic7xxx_osm.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
index e310e414067f..bff7f8c59856 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c
@@ -1658,9 +1658,12 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb)
untagged_q = &(ahc->untagged_queues[target_offset]);
TAILQ_REMOVE(untagged_q, scb, links.tqe);
BUG_ON(!TAILQ_EMPTY(untagged_q));
- }
-
- if ((scb->flags & SCB_ACTIVE) == 0) {
+ } else if ((scb->flags & SCB_ACTIVE) == 0) {
+ /*
+ * Transactions aborted from the untagged queue may
+ * not have been dispatched to the controller, so
+ * only check the SCB_ACTIVE flag for tagged transactions.
+ */
printf("SCB %d done'd twice\n", scb->hscb->tag);
ahc_dump_card_state(ahc);
panic("Stopping for safety");