lkml.org 
[lkml]   [2019]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 166/271] scsi: NCR5380: Always re-enable reselection interrupt
    Date
    From: Finn Thain <fthain@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 <schmitzmic@gmail.com>
    Cc: stable@vger.kernel.org # v4.9+
    Fixes: 8b00c3d5d40d ("ncr5380: Implement new eh_abort_handler")
    Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
    Tested-by: Stan Johnson <userm57@yahoo.com>
    Tested-by: Michael Schmitz <schmitzmic@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@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();
    @@ -1106,8 +1108,6 @@ static struct scsi_cmnd *NCR5380_select(
    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;
    }
    @@ -1115,7 +1115,6 @@ static struct scsi_cmnd *NCR5380_select(
    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)
    @@ -1153,7 +1152,6 @@ static struct scsi_cmnd *NCR5380_select(
    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) {
    @@ -1820,9 +1818,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:
    @@ -1854,8 +1849,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
    @@ -1957,7 +1950,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;

    \
     
     \ /
      Last update: 2019-07-25 07:50    [W:5.959 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site