diff options
author | Finn Thain <fthain@telegraphics.com.au> | 2017-01-15 18:50:57 -0500 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2017-01-31 21:38:58 -0500 |
commit | b15e791d0c51e778353777b3dd2993ee0a83388e (patch) | |
tree | 23a83555aaba5988a158ce5ca81a45ee99a13d65 /drivers/scsi | |
parent | 4ab2a7878fa56ae7581bf8a94049b355c730aef0 (diff) |
scsi: ncr5380: Improve target selection robustness
Handle timeout or bus phase change errors that could occur when sending
the IDENTIFY message.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Tested-by: Ondrej Zary <linux@rainbow-software.org>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/NCR5380.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index 518d10180a31..acc33440bca0 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c | |||
@@ -1165,8 +1165,16 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, | |||
1165 | data = tmp; | 1165 | data = tmp; |
1166 | phase = PHASE_MSGOUT; | 1166 | phase = PHASE_MSGOUT; |
1167 | NCR5380_transfer_pio(instance, &phase, &len, &data); | 1167 | NCR5380_transfer_pio(instance, &phase, &len, &data); |
1168 | if (len) { | ||
1169 | NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); | ||
1170 | cmd->result = DID_ERROR << 16; | ||
1171 | complete_cmd(instance, cmd); | ||
1172 | dsprintk(NDEBUG_SELECTION, instance, "IDENTIFY message transfer failed\n"); | ||
1173 | cmd = NULL; | ||
1174 | goto out; | ||
1175 | } | ||
1176 | |||
1168 | dsprintk(NDEBUG_SELECTION, instance, "nexus established.\n"); | 1177 | dsprintk(NDEBUG_SELECTION, instance, "nexus established.\n"); |
1169 | /* XXX need to handle errors here */ | ||
1170 | 1178 | ||
1171 | hostdata->connected = cmd; | 1179 | hostdata->connected = cmd; |
1172 | hostdata->busy[cmd->device->id] |= 1 << cmd->device->lun; | 1180 | hostdata->busy[cmd->device->id] |= 1 << cmd->device->lun; |