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 | |
| 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>
| -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 | ||
