[SCSI] qla2xxx: Fix for handling some error conditions in loopback.
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
e92e4a8f00
commit
bf5b8ad7bd
4 changed files with 28 additions and 18 deletions
|
@ -568,9 +568,17 @@ qla81xx_set_loopback_mode(scsi_qla_host_t *vha, uint16_t *config,
|
||||||
if (!wait_for_completion_timeout(&ha->dcbx_comp, (20 * HZ))) {
|
if (!wait_for_completion_timeout(&ha->dcbx_comp, (20 * HZ))) {
|
||||||
ql_dbg(ql_dbg_user, vha, 0x7022,
|
ql_dbg(ql_dbg_user, vha, 0x7022,
|
||||||
"State change notification not received.\n");
|
"State change notification not received.\n");
|
||||||
} else
|
rval = -EINVAL;
|
||||||
ql_dbg(ql_dbg_user, vha, 0x7023,
|
} else {
|
||||||
"State change received.\n");
|
if (ha->flags.idc_compl_status) {
|
||||||
|
ql_dbg(ql_dbg_user, vha, 0x70c3,
|
||||||
|
"Bad status in IDC Completion AEN\n");
|
||||||
|
rval = -EINVAL;
|
||||||
|
ha->flags.idc_compl_status = 0;
|
||||||
|
} else
|
||||||
|
ql_dbg(ql_dbg_user, vha, 0x7023,
|
||||||
|
"State change received.\n");
|
||||||
|
}
|
||||||
|
|
||||||
ha->notify_dcbx_comp = 0;
|
ha->notify_dcbx_comp = 0;
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
* | Async Events | 0x5071 | 0x502b-0x502f |
|
* | Async Events | 0x5071 | 0x502b-0x502f |
|
||||||
* | | | 0x5047,0x5052 |
|
* | | | 0x5047,0x5052 |
|
||||||
* | Timer Routines | 0x6011 | |
|
* | Timer Routines | 0x6011 | |
|
||||||
* | User Space Interactions | 0x70c2 | 0x7018,0x702e, |
|
* | User Space Interactions | 0x70c3 | 0x7018,0x702e, |
|
||||||
* | | | 0x7039,0x7045, |
|
* | | | 0x7039,0x7045, |
|
||||||
* | | | 0x7073-0x7075, |
|
* | | | 0x7073-0x7075, |
|
||||||
* | | | 0x708c, |
|
* | | | 0x708c, |
|
||||||
|
|
|
@ -2622,7 +2622,8 @@ struct qla_hw_data {
|
||||||
uint32_t nic_core_reset_owner:1;
|
uint32_t nic_core_reset_owner:1;
|
||||||
uint32_t isp82xx_no_md_cap:1;
|
uint32_t isp82xx_no_md_cap:1;
|
||||||
uint32_t host_shutting_down:1;
|
uint32_t host_shutting_down:1;
|
||||||
/* 30 bits */
|
uint32_t idc_compl_status:1;
|
||||||
|
/* 32 bits */
|
||||||
} flags;
|
} flags;
|
||||||
|
|
||||||
/* This spinlock is used to protect "io transactions", you must
|
/* This spinlock is used to protect "io transactions", you must
|
||||||
|
|
|
@ -294,18 +294,21 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
|
||||||
"%04x %04x %04x %04x %04x %04x %04x.\n",
|
"%04x %04x %04x %04x %04x %04x %04x.\n",
|
||||||
event[aen & 0xff], mb[0], mb[1], mb[2], mb[3],
|
event[aen & 0xff], mb[0], mb[1], mb[2], mb[3],
|
||||||
mb[4], mb[5], mb[6]);
|
mb[4], mb[5], mb[6]);
|
||||||
|
if ((aen == MBA_IDC_COMPLETE && mb[1] >> 15)) {
|
||||||
if (IS_QLA81XX(vha->hw)) {
|
vha->hw->flags.idc_compl_status = 1;
|
||||||
/* Acknowledgement needed? [Notify && non-zero timeout]. */
|
if (vha->hw->notify_dcbx_comp)
|
||||||
timeout = (descr >> 8) & 0xf;
|
complete(&vha->hw->dcbx_comp);
|
||||||
if (aen != MBA_IDC_NOTIFY || !timeout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ql_dbg(ql_dbg_async, vha, 0x5022,
|
|
||||||
"%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
|
|
||||||
vha->host_no, event[aen & 0xff], timeout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Acknowledgement needed? [Notify && non-zero timeout]. */
|
||||||
|
timeout = (descr >> 8) & 0xf;
|
||||||
|
if (aen != MBA_IDC_NOTIFY || !timeout)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ql_dbg(ql_dbg_async, vha, 0x5022,
|
||||||
|
"%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
|
||||||
|
vha->host_no, event[aen & 0xff], timeout);
|
||||||
|
|
||||||
rval = qla2x00_post_idc_ack_work(vha, mb);
|
rval = qla2x00_post_idc_ack_work(vha, mb);
|
||||||
if (rval != QLA_SUCCESS)
|
if (rval != QLA_SUCCESS)
|
||||||
ql_log(ql_log_warn, vha, 0x5023,
|
ql_log(ql_log_warn, vha, 0x5023,
|
||||||
|
@ -989,13 +992,11 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
|
||||||
if ((mb[2] & 0x7fff) == MBC_PORT_RESET ||
|
if ((mb[2] & 0x7fff) == MBC_PORT_RESET ||
|
||||||
(mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) {
|
(mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) {
|
||||||
set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
|
set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
|
||||||
/* Ack that we have quiesced I/O */
|
|
||||||
qla81xx_idc_event(vha, mb[0], mb[1]);
|
|
||||||
qla2xxx_wake_dpc(vha);
|
qla2xxx_wake_dpc(vha);
|
||||||
}
|
}
|
||||||
case MBA_IDC_COMPLETE:
|
case MBA_IDC_COMPLETE:
|
||||||
case MBA_IDC_TIME_EXT:
|
case MBA_IDC_TIME_EXT:
|
||||||
if (IS_QLA81XX(vha->hw))
|
if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw))
|
||||||
qla81xx_idc_event(vha, mb[0], mb[1]);
|
qla81xx_idc_event(vha, mb[0], mb[1]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue