Commit a018d8ffde82d15fff27f09875bc3c1a704b1a33

Authored by Hiral Patel
Committed by Christoph Hellwig
1 parent 1a5c69bf0c

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
... ... @@ -51,6 +51,7 @@
51 51 * | Virtual Port | 0xa007 | |
52 52 * | ISP82XX Specific | 0xb157 | 0xb002,0xb024 |
53 53 * | | | 0xb09e,0xb0ae |
  54 + * | | | 0xb0c3,0xb0c6 |
54 55 * | | | 0xb0e0-0xb0ef |
55 56 * | | | 0xb085,0xb0dc |
56 57 * | | | 0xb107,0xb108 |
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