diff options
author | Finn Thain <fthain@telegraphics.com.au> | 2016-01-03 05:05:32 (GMT) |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-01-07 02:42:57 (GMT) |
commit | 1cc160e1ba938d34581181517221913683031d29 (patch) | |
tree | 714939893feac7f9ede33c3a9aa3930abf0de599 /drivers/scsi/NCR5380.c | |
parent | 340b96126d8abf859aa8af2fed31ed11ef9f4600 (diff) | |
download | linux-1cc160e1ba938d34581181517221913683031d29.tar.xz |
ncr5380: Fix !REQ timeout in do_abort()
NCR5380_poll_politely() never returns -1. That means do_abort() can fail
to handle a timeout after waiting for the target to negate REQ. Fix this
and cleanup other NCR5380_poll_politely() call sites.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Tested-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/NCR5380.c')
-rw-r--r-- | drivers/scsi/NCR5380.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index 97100a1..baa8785 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c @@ -1271,7 +1271,7 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) err = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ); spin_lock_irq(instance->host_lock); - if(err) { + if (err < 0) { printk(KERN_ERR "scsi%d: timeout at NCR5380.c:%d\n", instance->host_no, __LINE__); NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); return -1; @@ -1490,8 +1490,7 @@ static int do_abort(struct Scsi_Host *instance) */ rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, 60 * HZ); - - if(rc < 0) + if (rc < 0) return -1; tmp = (unsigned char)rc; @@ -1502,7 +1501,7 @@ static int do_abort(struct Scsi_Host *instance) 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 == -1) + if (rc < 0) return -1; } tmp = ABORT; @@ -2199,7 +2198,8 @@ static void NCR5380_reselect(struct Scsi_Host *instance) { * FIXME: timeout needed and fail to work queeu */ - if(NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, 2*HZ)) + if (NCR5380_poll_politely(instance, + STATUS_REG, SR_REQ, SR_REQ, 2 * HZ) < 0) abort = 1; len = 1; |