From: Finn Thain <fth...@telegraphics.com.au>

commit 57f31326518e98ee4cabf9a04efe00ed57c54147 upstream.

The reselection interrupt gets disabled during selection and must be
re-enabled when hostdata->connected becomes NULL. If it isn't re-enabled a
disconnected command may time-out or the target may wedge the bus while
trying to reselect the host. This can happen after a command is aborted.

Fix this by enabling the reselection interrupt in NCR5380_main() after
calls to NCR5380_select() and NCR5380_information_transfer() return.

Cc: Michael Schmitz <schmitz...@gmail.com>
Cc: sta...@vger.kernel.org # v4.9+
Fixes: 8b00c3d5d40d ("ncr5380: Implement new eh_abort_handler")
Signed-off-by: Finn Thain <fth...@telegraphics.com.au>
Tested-by: Stan Johnson <user...@yahoo.com>
Tested-by: Michael Schmitz <schmitz...@gmail.com>
Signed-off-by: Martin K. Petersen <martin.peter...@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/scsi/NCR5380.c |   12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -710,6 +710,8 @@ static void NCR5380_main(struct work_str
                        NCR5380_information_transfer(instance);
                        done = 0;
                }
+               if (!hostdata->connected)
+                       NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
                spin_unlock_irq(&hostdata->lock);
                if (!done)
                        cond_resched();
@@ -1111,8 +1113,6 @@ static bool NCR5380_select(struct Scsi_H
                spin_lock_irq(&hostdata->lock);
                NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
                NCR5380_reselect(instance);
-               if (!hostdata->connected)
-                       NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
                shost_printk(KERN_ERR, instance, "reselection after won 
arbitration?\n");
                goto out;
        }
@@ -1120,7 +1120,6 @@ static bool NCR5380_select(struct Scsi_H
        if (err < 0) {
                spin_lock_irq(&hostdata->lock);
                NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-               NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
 
                /* Can't touch cmd if it has been reclaimed by the scsi ML */
                if (!hostdata->selecting)
@@ -1158,7 +1157,6 @@ static bool NCR5380_select(struct Scsi_H
        if (err < 0) {
                shost_printk(KERN_ERR, instance, "select: REQ timeout\n");
                NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-               NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
                goto out;
        }
        if (!hostdata->selecting) {
@@ -1827,9 +1825,6 @@ static void NCR5380_information_transfer
                                         */
                                        NCR5380_write(TARGET_COMMAND_REG, 0);
 
-                                       /* Enable reselect interrupts */
-                                       NCR5380_write(SELECT_ENABLE_REG, 
hostdata->id_mask);
-
                                        maybe_release_dma_irq(instance);
                                        return;
                                case MESSAGE_REJECT:
@@ -1861,8 +1856,6 @@ static void NCR5380_information_transfer
                                         */
                                        NCR5380_write(TARGET_COMMAND_REG, 0);
 
-                                       /* Enable reselect interrupts */
-                                       NCR5380_write(SELECT_ENABLE_REG, 
hostdata->id_mask);
 #ifdef SUN3_SCSI_VME
                                        dregs->csr |= CSR_DMA_ENABLE;
 #endif
@@ -1965,7 +1958,6 @@ static void NCR5380_information_transfer
                                        cmd->result = DID_ERROR << 16;
                                        complete_cmd(instance, cmd);
                                        maybe_release_dma_irq(instance);
-                                       NCR5380_write(SELECT_ENABLE_REG, 
hostdata->id_mask);
                                        return;
                                }
                                msgout = NOP;


Reply via email to