diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2010-02-18 13:07:25 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-02-19 11:45:02 -0500 |
commit | 55e5ed273d758c62d2f1fad47c73716039f7c01c (patch) | |
tree | 0cf2d50a49d41dfe34d8796b0752854d7ee6f9f0 /drivers/scsi | |
parent | db3ad7f8852cfdfa03f72b27472e5a8bc9c1e1cf (diff) |
[SCSI] qla2xxx: Correct EH bus-reset handling.
Target-level resets are unlikely to complete if done after the
bus (LIP/OLS/NOS) has been reset. Perform target-level resets,
if necessary, prior to hitting the bus.
Cc: stable@kernel.org
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 83615e71fa0d..d01daa3866f8 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -1095,6 +1095,20 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) | |||
1095 | struct fc_port *fcport; | 1095 | struct fc_port *fcport; |
1096 | struct qla_hw_data *ha = vha->hw; | 1096 | struct qla_hw_data *ha = vha->hw; |
1097 | 1097 | ||
1098 | if (ha->flags.enable_target_reset) { | ||
1099 | list_for_each_entry(fcport, &vha->vp_fcports, list) { | ||
1100 | if (fcport->port_type != FCT_TARGET) | ||
1101 | continue; | ||
1102 | |||
1103 | ret = ha->isp_ops->target_reset(fcport, 0, 0); | ||
1104 | if (ret != QLA_SUCCESS) { | ||
1105 | DEBUG2_3(printk("%s(%ld): bus_reset failed: " | ||
1106 | "target_reset=%d d_id=%x.\n", __func__, | ||
1107 | vha->host_no, ret, fcport->d_id.b24)); | ||
1108 | } | ||
1109 | } | ||
1110 | } | ||
1111 | |||
1098 | if (ha->flags.enable_lip_full_login && !IS_QLA81XX(ha)) { | 1112 | if (ha->flags.enable_lip_full_login && !IS_QLA81XX(ha)) { |
1099 | ret = qla2x00_full_login_lip(vha); | 1113 | ret = qla2x00_full_login_lip(vha); |
1100 | if (ret != QLA_SUCCESS) { | 1114 | if (ret != QLA_SUCCESS) { |
@@ -1117,19 +1131,6 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) | |||
1117 | qla2x00_wait_for_loop_ready(vha); | 1131 | qla2x00_wait_for_loop_ready(vha); |
1118 | } | 1132 | } |
1119 | 1133 | ||
1120 | if (ha->flags.enable_target_reset) { | ||
1121 | list_for_each_entry(fcport, &vha->vp_fcports, list) { | ||
1122 | if (fcport->port_type != FCT_TARGET) | ||
1123 | continue; | ||
1124 | |||
1125 | ret = ha->isp_ops->target_reset(fcport, 0, 0); | ||
1126 | if (ret != QLA_SUCCESS) { | ||
1127 | DEBUG2_3(printk("%s(%ld): bus_reset failed: " | ||
1128 | "target_reset=%d d_id=%x.\n", __func__, | ||
1129 | vha->host_no, ret, fcport->d_id.b24)); | ||
1130 | } | ||
1131 | } | ||
1132 | } | ||
1133 | /* Issue marker command only when we are going to start the I/O */ | 1134 | /* Issue marker command only when we are going to start the I/O */ |
1134 | vha->marker_needed = 1; | 1135 | vha->marker_needed = 1; |
1135 | 1136 | ||