lkml.org 
[lkml]   [2015]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 33/71] atari_NCR5380: Set do_abort() timeouts
    Use timeouts in do_abort() in atari_NCR5380.c instead of infinite loops.
    Also fix the kernel-doc comment. Keep the two core driver forks in sync.

    Signed-off-by: Finn Thain <fthain@telegraphics.com.au>

    ---
    drivers/scsi/NCR5380.c | 26 +++++++++++++-------------
    drivers/scsi/atari_NCR5380.c | 34 +++++++++++++++++++++-------------
    2 files changed, 34 insertions(+), 26 deletions(-)

    Index: linux/drivers/scsi/atari_NCR5380.c
    ===================================================================
    --- linux.orig/drivers/scsi/atari_NCR5380.c 2015-11-18 19:33:42.000000000 +1100
    +++ linux/drivers/scsi/atari_NCR5380.c 2015-11-18 19:33:46.000000000 +1100
    @@ -1829,19 +1829,19 @@ static void do_reset(struct Scsi_Host *i
    local_irq_restore(flags);
    }

    -/*
    - * Function : do_abort (Scsi_Host *host)
    +/**
    + * do_abort - abort the currently established nexus by going to
    + * MESSAGE OUT phase and sending an ABORT message.
    + * @instance: relevant scsi host instance
    *
    - * Purpose : abort the currently established nexus. Should only be
    - * called from a routine which can drop into a
    - *
    - * Returns : 0 on success, -1 on failure.
    + * Returns 0 on success, -1 on failure.
    */

    static int do_abort(struct Scsi_Host *instance)
    {
    unsigned char tmp, *msgptr, phase;
    int len;
    + int rc;

    /* Request message out phase */
    NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
    @@ -1856,16 +1856,20 @@ static int do_abort(struct Scsi_Host *in
    * the target sees, so we just handshake.
    */

    - while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ))
    - ;
    + rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, 10 * HZ);
    + if (rc < 0)
    + goto timeout;
    +
    + tmp = NCR5380_read(STATUS_REG) & PHASE_MASK;

    NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));

    - if ((tmp & PHASE_MASK) != PHASE_MSGOUT) {
    - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN |
    - ICR_ASSERT_ACK);
    - while (NCR5380_read(STATUS_REG) & SR_REQ)
    - ;
    + if (tmp != PHASE_MSGOUT) {
    + NCR5380_write(INITIATOR_COMMAND_REG,
    + ICR_BASE | ICR_ASSERT_ATN | ICR_ASSERT_ACK);
    + rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, 0, 3 * HZ);
    + if (rc < 0)
    + goto timeout;
    NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
    }

    @@ -1881,6 +1885,10 @@ static int do_abort(struct Scsi_Host *in
    */

    return len ? -1 : 0;
    +
    +timeout:
    + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
    + return -1;
    }

    #if defined(REAL_DMA)
    Index: linux/drivers/scsi/NCR5380.c
    ===================================================================
    --- linux.orig/drivers/scsi/NCR5380.c 2015-11-18 19:33:45.000000000 +1100
    +++ linux/drivers/scsi/NCR5380.c 2015-11-18 19:33:46.000000000 +1100
    @@ -1451,16 +1451,12 @@ static void do_reset(struct Scsi_Host *i
    local_irq_restore(flags);
    }

    -/*
    - * Function : do_abort (Scsi_Host *host)
    - *
    - * Purpose : abort the currently established nexus. Should only be
    - * called from a routine which can drop into a
    - *
    - * Returns : 0 on success, -1 on failure.
    +/**
    + * do_abort - abort the currently established nexus by going to
    + * MESSAGE OUT phase and sending an ABORT message.
    + * @instance: relevant scsi host instance
    *
    - * Locks: queue lock held by caller
    - * FIXME: sort this out and get new_eh running
    + * Returns 0 on success, -1 on failure.
    */

    static int do_abort(struct Scsi_Host *instance)
    @@ -1482,9 +1478,9 @@ static int do_abort(struct Scsi_Host *in
    * the target sees, so we just handshake.
    */

    - rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, 60 * HZ);
    + rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, 10 * HZ);
    if (rc < 0)
    - return -1;
    + goto timeout;

    tmp = NCR5380_read(STATUS_REG) & PHASE_MASK;

    @@ -1493,9 +1489,9 @@ static int do_abort(struct Scsi_Host *in
    if (tmp != PHASE_MSGOUT) {
    NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN | ICR_ASSERT_ACK);
    rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, 0, 3 * HZ);
    - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
    if (rc < 0)
    - return -1;
    + goto timeout;
    + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
    }
    tmp = ABORT;
    msgptr = &tmp;
    @@ -1509,6 +1505,10 @@ static int do_abort(struct Scsi_Host *in
    */

    return len ? -1 : 0;
    +
    +timeout:
    + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
    + return -1;
    }

    #if defined(REAL_DMA) || defined(PSEUDO_DMA) || defined (REAL_DMA_POLL)



    \
     
     \ /
      Last update: 2015-11-18 10:21    [W:2.801 / U:1.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site