diff options
author | Manish Chopra <manish.chopra@qlogic.com> | 2013-08-16 19:07:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-20 03:32:02 -0400 |
commit | 77bead466cfb0bc352e424eacdd17700aca851b3 (patch) | |
tree | 2d57fb1da8fa991816a6532c8f88f20b93940241 /drivers/net/ethernet/qlogic | |
parent | 58945e1bd6e7ed8d3637c655ebdfdc34fa996456 (diff) |
qlcnic: Loopback Inter Driver Communication AEN handler
o Loopback initiator function drivers should process loopback time extend AEN.
These AENs are triggered by the loopback time extend mailbox command
issued by the target function drivers.
Signed-off-by: Manish Chopra <manish.chopra@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 45 |
2 files changed, 37 insertions, 9 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index 9ae5d2eb1a2d..86dd695143a5 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -467,6 +467,7 @@ struct qlcnic_hardware_context { | |||
467 | u32 mbox_aen[QLC_83XX_MBX_AEN_CNT]; | 467 | u32 mbox_aen[QLC_83XX_MBX_AEN_CNT]; |
468 | u32 mbox_reg[4]; | 468 | u32 mbox_reg[4]; |
469 | struct qlcnic_mailbox *mailbox; | 469 | struct qlcnic_mailbox *mailbox; |
470 | u8 extend_lb_time; | ||
470 | }; | 471 | }; |
471 | 472 | ||
472 | struct qlcnic_adapter_stats { | 473 | struct qlcnic_adapter_stats { |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index e53caaaf1303..c5daf78539ab 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
@@ -860,9 +860,9 @@ static void qlcnic_83xx_handle_idc_comp_aen(struct qlcnic_adapter *adapter, | |||
860 | 860 | ||
861 | void __qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter) | 861 | void __qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter) |
862 | { | 862 | { |
863 | struct qlcnic_hardware_context *ahw = adapter->ahw; | ||
863 | u32 event[QLC_83XX_MBX_AEN_CNT]; | 864 | u32 event[QLC_83XX_MBX_AEN_CNT]; |
864 | int i; | 865 | int i; |
865 | struct qlcnic_hardware_context *ahw = adapter->ahw; | ||
866 | 866 | ||
867 | for (i = 0; i < QLC_83XX_MBX_AEN_CNT; i++) | 867 | for (i = 0; i < QLC_83XX_MBX_AEN_CNT; i++) |
868 | event[i] = readl(QLCNIC_MBX_FW(ahw, i)); | 868 | event[i] = readl(QLCNIC_MBX_FW(ahw, i)); |
@@ -882,6 +882,7 @@ void __qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter) | |||
882 | &adapter->idc_aen_work, 0); | 882 | &adapter->idc_aen_work, 0); |
883 | break; | 883 | break; |
884 | case QLCNIC_MBX_TIME_EXTEND_EVENT: | 884 | case QLCNIC_MBX_TIME_EXTEND_EVENT: |
885 | ahw->extend_lb_time = event[1] >> 8 & 0xf; | ||
885 | break; | 886 | break; |
886 | case QLCNIC_MBX_BC_EVENT: | 887 | case QLCNIC_MBX_BC_EVENT: |
887 | qlcnic_sriov_handle_bc_event(adapter, event[1]); | 888 | qlcnic_sriov_handle_bc_event(adapter, event[1]); |
@@ -1706,13 +1707,28 @@ fail_diag_alloc: | |||
1706 | return ret; | 1707 | return ret; |
1707 | } | 1708 | } |
1708 | 1709 | ||
1710 | static void qlcnic_extend_lb_idc_cmpltn_wait(struct qlcnic_adapter *adapter, | ||
1711 | u32 *max_wait_count) | ||
1712 | { | ||
1713 | struct qlcnic_hardware_context *ahw = adapter->ahw; | ||
1714 | int temp; | ||
1715 | |||
1716 | netdev_info(adapter->netdev, "Recieved loopback IDC time extend event for 0x%x seconds\n", | ||
1717 | ahw->extend_lb_time); | ||
1718 | temp = ahw->extend_lb_time * 1000; | ||
1719 | *max_wait_count += temp / QLC_83XX_LB_MSLEEP_COUNT; | ||
1720 | ahw->extend_lb_time = 0; | ||
1721 | } | ||
1722 | |||
1709 | int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode) | 1723 | int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode) |
1710 | { | 1724 | { |
1711 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 1725 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
1712 | struct net_device *netdev = adapter->netdev; | 1726 | struct net_device *netdev = adapter->netdev; |
1727 | u32 config, max_wait_count; | ||
1713 | int status = 0, loop = 0; | 1728 | int status = 0, loop = 0; |
1714 | u32 config; | ||
1715 | 1729 | ||
1730 | ahw->extend_lb_time = 0; | ||
1731 | max_wait_count = QLC_83XX_LB_WAIT_COUNT; | ||
1716 | status = qlcnic_83xx_get_port_config(adapter); | 1732 | status = qlcnic_83xx_get_port_config(adapter); |
1717 | if (status) | 1733 | if (status) |
1718 | return status; | 1734 | return status; |
@@ -1754,9 +1770,14 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode) | |||
1754 | clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); | 1770 | clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); |
1755 | return -EBUSY; | 1771 | return -EBUSY; |
1756 | } | 1772 | } |
1757 | if (loop++ > QLC_83XX_LB_WAIT_COUNT) { | 1773 | |
1758 | netdev_err(netdev, | 1774 | if (ahw->extend_lb_time) |
1759 | "Did not receive IDC completion AEN\n"); | 1775 | qlcnic_extend_lb_idc_cmpltn_wait(adapter, |
1776 | &max_wait_count); | ||
1777 | |||
1778 | if (loop++ > max_wait_count) { | ||
1779 | netdev_err(netdev, "%s: Did not receive loopback IDC completion AEN\n", | ||
1780 | __func__); | ||
1760 | clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); | 1781 | clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); |
1761 | qlcnic_83xx_clear_lb_mode(adapter, mode); | 1782 | qlcnic_83xx_clear_lb_mode(adapter, mode); |
1762 | return -ETIMEDOUT; | 1783 | return -ETIMEDOUT; |
@@ -1771,10 +1792,12 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode) | |||
1771 | int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode) | 1792 | int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode) |
1772 | { | 1793 | { |
1773 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 1794 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
1795 | u32 config = ahw->port_config, max_wait_count; | ||
1774 | struct net_device *netdev = adapter->netdev; | 1796 | struct net_device *netdev = adapter->netdev; |
1775 | int status = 0, loop = 0; | 1797 | int status = 0, loop = 0; |
1776 | u32 config = ahw->port_config; | ||
1777 | 1798 | ||
1799 | ahw->extend_lb_time = 0; | ||
1800 | max_wait_count = QLC_83XX_LB_WAIT_COUNT; | ||
1778 | set_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); | 1801 | set_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); |
1779 | if (mode == QLCNIC_ILB_MODE) | 1802 | if (mode == QLCNIC_ILB_MODE) |
1780 | ahw->port_config &= ~QLC_83XX_CFG_LOOPBACK_HSS; | 1803 | ahw->port_config &= ~QLC_83XX_CFG_LOOPBACK_HSS; |
@@ -1802,9 +1825,13 @@ int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode) | |||
1802 | return -EBUSY; | 1825 | return -EBUSY; |
1803 | } | 1826 | } |
1804 | 1827 | ||
1805 | if (loop++ > QLC_83XX_LB_WAIT_COUNT) { | 1828 | if (ahw->extend_lb_time) |
1806 | netdev_err(netdev, | 1829 | qlcnic_extend_lb_idc_cmpltn_wait(adapter, |
1807 | "Did not receive IDC completion AEN\n"); | 1830 | &max_wait_count); |
1831 | |||
1832 | if (loop++ > max_wait_count) { | ||
1833 | netdev_err(netdev, "%s: Did not receive loopback IDC completion AEN\n", | ||
1834 | __func__); | ||
1808 | clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); | 1835 | clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); |
1809 | return -ETIMEDOUT; | 1836 | return -ETIMEDOUT; |
1810 | } | 1837 | } |