aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx
diff options
context:
space:
mode:
authorAndrew Vasquez <andrew.vasquez@qlogic.com>2010-02-18 13:07:25 -0500
committerJames Bottomley <James.Bottomley@suse.de>2010-02-19 11:45:02 -0500
commit55e5ed273d758c62d2f1fad47c73716039f7c01c (patch)
tree0cf2d50a49d41dfe34d8796b0752854d7ee6f9f0 /drivers/scsi/qla2xxx
parentdb3ad7f8852cfdfa03f72b27472e5a8bc9c1e1cf (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/qla2xxx')
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 83615e71fa0..d01daa3866f 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