Commit a018d8ffde82d15fff27f09875bc3c1a704b1a33
Committed by
Christoph Hellwig
1 parent
1a5c69bf0c
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
qla2xxx: Check the QLA8044_CRB_DRV_ACTIVE_INDEX register when we are not the owner of the reset.
Signed-off-by: Hiral Patel <hiral.patel@qlogic.com> Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
Showing 3 changed files with 59 additions and 63 deletions Side-by-side Diff
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_nx2.c
... | ... | @@ -1633,7 +1633,7 @@ |
1633 | 1633 | qla8044_need_reset_handler(struct scsi_qla_host *vha) |
1634 | 1634 | { |
1635 | 1635 | uint32_t dev_state = 0, drv_state, drv_active; |
1636 | - unsigned long reset_timeout, dev_init_timeout; | |
1636 | + unsigned long reset_timeout; | |
1637 | 1637 | struct qla_hw_data *ha = vha->hw; |
1638 | 1638 | |
1639 | 1639 | ql_log(ql_log_fatal, vha, 0xb0c2, |
1640 | 1640 | |
1641 | 1641 | |
1642 | 1642 | |
1643 | 1643 | |
1644 | 1644 | |
1645 | 1645 | |
1646 | 1646 | |
1647 | 1647 | |
1648 | 1648 | |
1649 | 1649 | |
1650 | 1650 | |
... | ... | @@ -1647,84 +1647,78 @@ |
1647 | 1647 | qla8044_idc_lock(ha); |
1648 | 1648 | } |
1649 | 1649 | |
1650 | + dev_state = qla8044_rd_direct(vha, | |
1651 | + QLA8044_CRB_DEV_STATE_INDEX); | |
1650 | 1652 | drv_state = qla8044_rd_direct(vha, |
1651 | 1653 | QLA8044_CRB_DRV_STATE_INDEX); |
1652 | 1654 | drv_active = qla8044_rd_direct(vha, |
1653 | 1655 | QLA8044_CRB_DRV_ACTIVE_INDEX); |
1654 | 1656 | |
1655 | 1657 | ql_log(ql_log_info, vha, 0xb0c5, |
1656 | - "%s(%ld): drv_state = 0x%x, drv_active = 0x%x\n", | |
1657 | - __func__, vha->host_no, drv_state, drv_active); | |
1658 | + "%s(%ld): drv_state = 0x%x, drv_active = 0x%x dev_state = 0x%x\n", | |
1659 | + __func__, vha->host_no, drv_state, drv_active, dev_state); | |
1658 | 1660 | |
1659 | - if (!ha->flags.nic_core_reset_owner) { | |
1660 | - ql_dbg(ql_dbg_p3p, vha, 0xb0c3, | |
1661 | - "%s(%ld): reset acknowledged\n", | |
1662 | - __func__, vha->host_no); | |
1663 | - qla8044_set_rst_ready(vha); | |
1661 | + qla8044_set_rst_ready(vha); | |
1664 | 1662 | |
1665 | - /* Non-reset owners ACK Reset and wait for device INIT state | |
1666 | - * as part of Reset Recovery by Reset Owner | |
1667 | - */ | |
1668 | - dev_init_timeout = jiffies + (ha->fcoe_reset_timeout * HZ); | |
1663 | + /* wait for 10 seconds for reset ack from all functions */ | |
1664 | + reset_timeout = jiffies + (ha->fcoe_reset_timeout * HZ); | |
1669 | 1665 | |
1670 | - do { | |
1671 | - if (time_after_eq(jiffies, dev_init_timeout)) { | |
1672 | - ql_log(ql_log_info, vha, 0xb0c4, | |
1673 | - "%s: Non Reset owner: Reset Ack Timeout!\n", | |
1674 | - __func__); | |
1675 | - break; | |
1676 | - } | |
1666 | + do { | |
1667 | + if (time_after_eq(jiffies, reset_timeout)) { | |
1668 | + ql_log(ql_log_info, vha, 0xb0c4, | |
1669 | + "%s: Function %d: Reset Ack Timeout!, drv_state: 0x%08x, drv_active: 0x%08x\n", | |
1670 | + __func__, ha->portnum, drv_state, drv_active); | |
1671 | + break; | |
1672 | + } | |
1677 | 1673 | |
1678 | - qla8044_idc_unlock(ha); | |
1679 | - msleep(1000); | |
1680 | - qla8044_idc_lock(ha); | |
1674 | + qla8044_idc_unlock(ha); | |
1675 | + msleep(1000); | |
1676 | + qla8044_idc_lock(ha); | |
1681 | 1677 | |
1682 | - dev_state = qla8044_rd_direct(vha, | |
1683 | - QLA8044_CRB_DEV_STATE_INDEX); | |
1684 | - } while (((drv_state & drv_active) != drv_active) && | |
1685 | - (dev_state == QLA8XXX_DEV_NEED_RESET)); | |
1686 | - } else { | |
1687 | - qla8044_set_rst_ready(vha); | |
1678 | + dev_state = qla8044_rd_direct(vha, | |
1679 | + QLA8044_CRB_DEV_STATE_INDEX); | |
1680 | + drv_state = qla8044_rd_direct(vha, | |
1681 | + QLA8044_CRB_DRV_STATE_INDEX); | |
1682 | + drv_active = qla8044_rd_direct(vha, | |
1683 | + QLA8044_CRB_DRV_ACTIVE_INDEX); | |
1684 | + } while (((drv_state & drv_active) != drv_active) && | |
1685 | + (dev_state == QLA8XXX_DEV_NEED_RESET)); | |
1688 | 1686 | |
1689 | - /* wait for 10 seconds for reset ack from all functions */ | |
1690 | - reset_timeout = jiffies + (ha->fcoe_reset_timeout * HZ); | |
1691 | - | |
1692 | - while ((drv_state & drv_active) != drv_active) { | |
1693 | - if (time_after_eq(jiffies, reset_timeout)) { | |
1694 | - ql_log(ql_log_info, vha, 0xb0c6, | |
1695 | - "%s: RESET TIMEOUT!" | |
1696 | - "drv_state: 0x%08x, drv_active: 0x%08x\n", | |
1697 | - QLA2XXX_DRIVER_NAME, drv_state, drv_active); | |
1698 | - break; | |
1699 | - } | |
1700 | - | |
1701 | - qla8044_idc_unlock(ha); | |
1702 | - msleep(1000); | |
1703 | - qla8044_idc_lock(ha); | |
1704 | - | |
1705 | - drv_state = qla8044_rd_direct(vha, | |
1706 | - QLA8044_CRB_DRV_STATE_INDEX); | |
1707 | - drv_active = qla8044_rd_direct(vha, | |
1708 | - QLA8044_CRB_DRV_ACTIVE_INDEX); | |
1687 | + /* Remove IDC participation of functions not acknowledging */ | |
1688 | + if (drv_state != drv_active) { | |
1689 | + ql_log(ql_log_info, vha, 0xb0c7, | |
1690 | + "%s(%ld): Function %d turning off drv_active of non-acking function 0x%x\n", | |
1691 | + __func__, vha->host_no, ha->portnum, | |
1692 | + (drv_active ^ drv_state)); | |
1693 | + drv_active = drv_active & drv_state; | |
1694 | + qla8044_wr_direct(vha, QLA8044_CRB_DRV_ACTIVE_INDEX, | |
1695 | + drv_active); | |
1696 | + } else { | |
1697 | + /* | |
1698 | + * Reset owner should execute reset recovery, | |
1699 | + * if all functions acknowledged | |
1700 | + */ | |
1701 | + if ((ha->flags.nic_core_reset_owner) && | |
1702 | + (dev_state == QLA8XXX_DEV_NEED_RESET)) { | |
1703 | + ha->flags.nic_core_reset_owner = 0; | |
1704 | + qla8044_device_bootstrap(vha); | |
1705 | + return; | |
1709 | 1706 | } |
1707 | + } | |
1710 | 1708 | |
1711 | - if (drv_state != drv_active) { | |
1712 | - ql_log(ql_log_info, vha, 0xb0c7, | |
1713 | - "%s(%ld): Reset_owner turning off drv_active " | |
1714 | - "of non-acking function 0x%x\n", __func__, | |
1715 | - vha->host_no, (drv_active ^ drv_state)); | |
1716 | - drv_active = drv_active & drv_state; | |
1717 | - qla8044_wr_direct(vha, QLA8044_CRB_DRV_ACTIVE_INDEX, | |
1718 | - drv_active); | |
1719 | - } | |
1720 | - | |
1721 | - /* | |
1722 | - * Clear RESET OWNER, will be set at next reset | |
1723 | - * by next RST_OWNER | |
1724 | - */ | |
1709 | + /* Exit if non active function */ | |
1710 | + if (!(drv_active & (1 << ha->portnum))) { | |
1725 | 1711 | ha->flags.nic_core_reset_owner = 0; |
1712 | + return; | |
1713 | + } | |
1726 | 1714 | |
1727 | - /* Start Reset Recovery */ | |
1715 | + /* | |
1716 | + * Execute Reset Recovery if Reset Owner or Function 7 | |
1717 | + * is the only active function | |
1718 | + */ | |
1719 | + if (ha->flags.nic_core_reset_owner || | |
1720 | + ((drv_state & drv_active) == QLA8044_FUN7_ACTIVE_INDEX)) { | |
1721 | + ha->flags.nic_core_reset_owner = 0; | |
1728 | 1722 | qla8044_device_bootstrap(vha); |
1729 | 1723 | } |
1730 | 1724 | } |
drivers/scsi/qla2xxx/qla_nx2.h
... | ... | @@ -133,6 +133,7 @@ |
133 | 133 | #define QLA8044_LINK_SPEED(f) (0x36E0+(((f) >> 2) * 4)) |
134 | 134 | #define QLA8044_MAX_LINK_SPEED(f) (0x36F0+(((f) / 4) * 4)) |
135 | 135 | #define QLA8044_LINK_SPEED_FACTOR 10 |
136 | +#define QLA8044_FUN7_ACTIVE_INDEX 0x80 | |
136 | 137 | |
137 | 138 | /* FLASH API Defines */ |
138 | 139 | #define QLA8044_FLASH_MAX_WAIT_USEC 100 |