diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_os.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index b899282a856e..c58c9d97b041 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -348,11 +348,13 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | |||
348 | { | 348 | { |
349 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); | 349 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); |
350 | fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata; | 350 | fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata; |
351 | struct fc_rport *rport = starget_to_rport(scsi_target(cmd->device)); | ||
351 | srb_t *sp; | 352 | srb_t *sp; |
352 | int rval; | 353 | int rval; |
353 | 354 | ||
354 | if (!fcport) { | 355 | rval = fc_remote_port_chkready(rport); |
355 | cmd->result = DID_NO_CONNECT << 16; | 356 | if (rval) { |
357 | cmd->result = rval; | ||
356 | goto qc_fail_command; | 358 | goto qc_fail_command; |
357 | } | 359 | } |
358 | 360 | ||
@@ -401,11 +403,13 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | |||
401 | { | 403 | { |
402 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); | 404 | scsi_qla_host_t *ha = to_qla_host(cmd->device->host); |
403 | fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata; | 405 | fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata; |
406 | struct fc_rport *rport = starget_to_rport(scsi_target(cmd->device)); | ||
404 | srb_t *sp; | 407 | srb_t *sp; |
405 | int rval; | 408 | int rval; |
406 | 409 | ||
407 | if (!fcport) { | 410 | rval = fc_remote_port_chkready(rport); |
408 | cmd->result = DID_NO_CONNECT << 16; | 411 | if (rval) { |
412 | cmd->result = rval; | ||
409 | goto qc24_fail_command; | 413 | goto qc24_fail_command; |
410 | } | 414 | } |
411 | 415 | ||
@@ -1041,10 +1045,10 @@ qla2xxx_slave_alloc(struct scsi_device *sdev) | |||
1041 | { | 1045 | { |
1042 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); | 1046 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); |
1043 | 1047 | ||
1044 | if (!rport) | 1048 | if (!rport || fc_remote_port_chkready(rport)) |
1045 | return -ENXIO; | 1049 | return -ENXIO; |
1046 | 1050 | ||
1047 | sdev->hostdata = rport->dd_data; | 1051 | sdev->hostdata = *(fc_port_t **)rport->dd_data; |
1048 | 1052 | ||
1049 | return 0; | 1053 | return 0; |
1050 | } | 1054 | } |
@@ -1636,7 +1640,8 @@ void qla2x00_mark_device_lost(scsi_qla_host_t *ha, fc_port_t *fcport, | |||
1636 | int do_login) | 1640 | int do_login) |
1637 | { | 1641 | { |
1638 | if (atomic_read(&fcport->state) == FCS_ONLINE && fcport->rport) | 1642 | if (atomic_read(&fcport->state) == FCS_ONLINE && fcport->rport) |
1639 | fc_remote_port_block(fcport->rport); | 1643 | schedule_work(&fcport->rport_del_work); |
1644 | |||
1640 | /* | 1645 | /* |
1641 | * We may need to retry the login, so don't change the state of the | 1646 | * We may need to retry the login, so don't change the state of the |
1642 | * port but do the retries. | 1647 | * port but do the retries. |
@@ -1697,7 +1702,7 @@ qla2x00_mark_all_devices_lost(scsi_qla_host_t *ha) | |||
1697 | if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD) | 1702 | if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD) |
1698 | continue; | 1703 | continue; |
1699 | if (atomic_read(&fcport->state) == FCS_ONLINE && fcport->rport) | 1704 | if (atomic_read(&fcport->state) == FCS_ONLINE && fcport->rport) |
1700 | fc_remote_port_block(fcport->rport); | 1705 | schedule_work(&fcport->rport_del_work); |
1701 | atomic_set(&fcport->state, FCS_DEVICE_LOST); | 1706 | atomic_set(&fcport->state, FCS_DEVICE_LOST); |
1702 | } | 1707 | } |
1703 | } | 1708 | } |