[SCSI] aic94xx: fix sequencer hang on error recovery
authorJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 22 Feb 2008 23:01:59 +0000 (17:01 -0600)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 22 Feb 2008 23:23:36 +0000 (17:23 -0600)
The clear nexus I_T and clear nexus I_T_L functions in the aic94xx
specify the SUSPEND_TX flag which causes the sequencer to be suspended
until it receives a RESUME_TX.  Unfortunately, nothing ever sends the
resume, so the sequencer on the link is stopped forever, leading to
eventual timeouts and I/O errors.

Since clear nexus commands are only executed as part of error recovery,
it's perfectly fine to keep the sequencer running on the link ... as
soon as the recovery function is completed, we'll send it the commands
to retry.

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/aic94xx/aic94xx_tmf.c

index b52124f3d3ac41dd704aab1a2a2d7895ce3cfc3d..144f5ad20453bbc56ec010d8e870c881c0ef0fd2 100644 (file)
@@ -151,8 +151,6 @@ static int asd_clear_nexus_I_T(struct domain_device *dev)
        CLEAR_NEXUS_PRE;
        scb->clear_nexus.nexus = NEXUS_I_T;
        scb->clear_nexus.flags = SEND_Q | EXEC_Q | NOTINQ;
-       if (dev->tproto)
-               scb->clear_nexus.flags |= SUSPEND_TX;
        scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long)
                                                   dev->lldd_dev);
        CLEAR_NEXUS_POST;
@@ -169,8 +167,6 @@ static int asd_clear_nexus_I_T_L(struct domain_device *dev, u8 *lun)
        CLEAR_NEXUS_PRE;
        scb->clear_nexus.nexus = NEXUS_I_T_L;
        scb->clear_nexus.flags = SEND_Q | EXEC_Q | NOTINQ;
-       if (dev->tproto)
-               scb->clear_nexus.flags |= SUSPEND_TX;
        memcpy(scb->clear_nexus.ssp_task.lun, lun, 8);
        scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long)
                                                   dev->lldd_dev);