diff options
author | Saurav Kashyap <saurav.kashyap@qlogic.com> | 2013-10-30 03:38:13 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-12-19 10:38:57 -0500 |
commit | 8f476115b2fac206588c11aaa3fc20408d35bb15 (patch) | |
tree | 6dc629dc8ba50b893b45a6392180037808e046dc /drivers/scsi | |
parent | ca0e68db4ded4da0dc837536f0ca9a16f290c381 (diff) |
[SCSI] qla2xxx: Don't consider the drivers knocked out of IDC participation for future reset recovery process.
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_nx2.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/scsi/qla2xxx/qla_nx2.c b/drivers/scsi/qla2xxx/qla_nx2.c index 8164cc9e7286..6f509f867ec7 100644 --- a/drivers/scsi/qla2xxx/qla_nx2.c +++ b/drivers/scsi/qla2xxx/qla_nx2.c | |||
@@ -1555,6 +1555,15 @@ qla8044_need_reset_handler(struct scsi_qla_host *vha) | |||
1555 | qla8044_idc_lock(ha); | 1555 | qla8044_idc_lock(ha); |
1556 | } | 1556 | } |
1557 | 1557 | ||
1558 | drv_state = qla8044_rd_direct(vha, | ||
1559 | QLA8044_CRB_DRV_STATE_INDEX); | ||
1560 | drv_active = qla8044_rd_direct(vha, | ||
1561 | QLA8044_CRB_DRV_ACTIVE_INDEX); | ||
1562 | |||
1563 | ql_log(ql_log_info, vha, 0xb0c5, | ||
1564 | "%s(%ld): drv_state = 0x%x, drv_active = 0x%x\n", | ||
1565 | __func__, vha->host_no, drv_state, drv_active); | ||
1566 | |||
1558 | if (!ha->flags.nic_core_reset_owner) { | 1567 | if (!ha->flags.nic_core_reset_owner) { |
1559 | ql_dbg(ql_dbg_p3p, vha, 0xb0c3, | 1568 | ql_dbg(ql_dbg_p3p, vha, 0xb0c3, |
1560 | "%s(%ld): reset acknowledged\n", | 1569 | "%s(%ld): reset acknowledged\n", |
@@ -1580,23 +1589,15 @@ qla8044_need_reset_handler(struct scsi_qla_host *vha) | |||
1580 | 1589 | ||
1581 | dev_state = qla8044_rd_direct(vha, | 1590 | dev_state = qla8044_rd_direct(vha, |
1582 | QLA8044_CRB_DEV_STATE_INDEX); | 1591 | QLA8044_CRB_DEV_STATE_INDEX); |
1583 | } while (dev_state == QLA8XXX_DEV_NEED_RESET); | 1592 | } while (((drv_state & drv_active) != drv_active) && |
1593 | (dev_state == QLA8XXX_DEV_NEED_RESET)); | ||
1584 | } else { | 1594 | } else { |
1585 | qla8044_set_rst_ready(vha); | 1595 | qla8044_set_rst_ready(vha); |
1586 | 1596 | ||
1587 | /* wait for 10 seconds for reset ack from all functions */ | 1597 | /* wait for 10 seconds for reset ack from all functions */ |
1588 | reset_timeout = jiffies + (ha->fcoe_reset_timeout * HZ); | 1598 | reset_timeout = jiffies + (ha->fcoe_reset_timeout * HZ); |
1589 | 1599 | ||
1590 | drv_state = qla8044_rd_direct(vha, | 1600 | while ((drv_state & drv_active) != drv_active) { |
1591 | QLA8044_CRB_DRV_STATE_INDEX); | ||
1592 | drv_active = qla8044_rd_direct(vha, | ||
1593 | QLA8044_CRB_DRV_ACTIVE_INDEX); | ||
1594 | |||
1595 | ql_log(ql_log_info, vha, 0xb0c5, | ||
1596 | "%s(%ld): drv_state = 0x%x, drv_active = 0x%x\n", | ||
1597 | __func__, vha->host_no, drv_state, drv_active); | ||
1598 | |||
1599 | while (drv_state != drv_active) { | ||
1600 | if (time_after_eq(jiffies, reset_timeout)) { | 1601 | if (time_after_eq(jiffies, reset_timeout)) { |
1601 | ql_log(ql_log_info, vha, 0xb0c6, | 1602 | ql_log(ql_log_info, vha, 0xb0c6, |
1602 | "%s: RESET TIMEOUT!" | 1603 | "%s: RESET TIMEOUT!" |