diff options
author | PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com> | 2009-03-25 18:10:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-26 04:13:51 -0400 |
commit | bb3daa4a5960cd9d39bad88679fcf587b456c05d (patch) | |
tree | 31cbdf87fed0af126ff0c3e0647dfa90aab8a7c7 /drivers/net/ixgbe/ixgbe_common.c | |
parent | ede5ad0e29b641c3d3a644272a9127bfd98dfcc8 (diff) |
ixgbe: Allow Priority Flow Control settings to survive a device reset
When changing DCB parameters, ixgbe needs to have the MAC reset. The way
the flow control code is setup today, PFC will be disabled on a reset.
This patch adds a new flow control type for PFC, and then has the netlink
layer take care of toggling which type of flow control to enable.
Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_common.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_common.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/net/ixgbe/ixgbe_common.c b/drivers/net/ixgbe/ixgbe_common.c index 245db0e712e7..8cfd3fd309a0 100644 --- a/drivers/net/ixgbe/ixgbe_common.c +++ b/drivers/net/ixgbe/ixgbe_common.c | |||
@@ -1654,9 +1654,10 @@ s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num) | |||
1654 | * 0: Flow control is completely disabled | 1654 | * 0: Flow control is completely disabled |
1655 | * 1: Rx flow control is enabled (we can receive pause frames, | 1655 | * 1: Rx flow control is enabled (we can receive pause frames, |
1656 | * but not send pause frames). | 1656 | * but not send pause frames). |
1657 | * 2: Tx flow control is enabled (we can send pause frames but | 1657 | * 2: Tx flow control is enabled (we can send pause frames but |
1658 | * we do not support receiving pause frames). | 1658 | * we do not support receiving pause frames). |
1659 | * 3: Both Rx and Tx flow control (symmetric) are enabled. | 1659 | * 3: Both Rx and Tx flow control (symmetric) are enabled. |
1660 | * 4: Priority Flow Control is enabled. | ||
1660 | * other: Invalid. | 1661 | * other: Invalid. |
1661 | */ | 1662 | */ |
1662 | switch (hw->fc.current_mode) { | 1663 | switch (hw->fc.current_mode) { |
@@ -1686,6 +1687,11 @@ s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num) | |||
1686 | mflcn_reg |= IXGBE_MFLCN_RFCE; | 1687 | mflcn_reg |= IXGBE_MFLCN_RFCE; |
1687 | fccfg_reg |= IXGBE_FCCFG_TFCE_802_3X; | 1688 | fccfg_reg |= IXGBE_FCCFG_TFCE_802_3X; |
1688 | break; | 1689 | break; |
1690 | #ifdef CONFIG_DCB | ||
1691 | case ixgbe_fc_pfc: | ||
1692 | goto out; | ||
1693 | break; | ||
1694 | #endif | ||
1689 | default: | 1695 | default: |
1690 | hw_dbg(hw, "Flow control param set incorrectly\n"); | 1696 | hw_dbg(hw, "Flow control param set incorrectly\n"); |
1691 | ret_val = -IXGBE_ERR_CONFIG; | 1697 | ret_val = -IXGBE_ERR_CONFIG; |
@@ -1746,6 +1752,7 @@ s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw) | |||
1746 | * 2: Tx flow control is enabled (we can send pause frames but | 1752 | * 2: Tx flow control is enabled (we can send pause frames but |
1747 | * we do not support receiving pause frames). | 1753 | * we do not support receiving pause frames). |
1748 | * 3: Both Rx and Tx flow control (symmetric) are enabled. | 1754 | * 3: Both Rx and Tx flow control (symmetric) are enabled. |
1755 | * 4: Priority Flow Control is enabled. | ||
1749 | * other: Invalid. | 1756 | * other: Invalid. |
1750 | */ | 1757 | */ |
1751 | switch (hw->fc.current_mode) { | 1758 | switch (hw->fc.current_mode) { |
@@ -1776,6 +1783,11 @@ s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw) | |||
1776 | /* Flow control (both Rx and Tx) is enabled by SW override. */ | 1783 | /* Flow control (both Rx and Tx) is enabled by SW override. */ |
1777 | reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); | 1784 | reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE); |
1778 | break; | 1785 | break; |
1786 | #ifdef CONFIG_DCB | ||
1787 | case ixgbe_fc_pfc: | ||
1788 | goto out; | ||
1789 | break; | ||
1790 | #endif | ||
1779 | default: | 1791 | default: |
1780 | hw_dbg(hw, "Flow control param set incorrectly\n"); | 1792 | hw_dbg(hw, "Flow control param set incorrectly\n"); |
1781 | ret_val = -IXGBE_ERR_CONFIG; | 1793 | ret_val = -IXGBE_ERR_CONFIG; |
@@ -1874,6 +1886,13 @@ s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw, s32 packetbuf_num) | |||
1874 | ixgbe_link_speed speed; | 1886 | ixgbe_link_speed speed; |
1875 | bool link_up; | 1887 | bool link_up; |
1876 | 1888 | ||
1889 | #ifdef CONFIG_DCB | ||
1890 | if (hw->fc.requested_mode == ixgbe_fc_pfc) { | ||
1891 | hw->fc.current_mode = hw->fc.requested_mode; | ||
1892 | goto out; | ||
1893 | } | ||
1894 | |||
1895 | #endif | ||
1877 | /* Validate the packetbuf configuration */ | 1896 | /* Validate the packetbuf configuration */ |
1878 | if (packetbuf_num < 0 || packetbuf_num > 7) { | 1897 | if (packetbuf_num < 0 || packetbuf_num > 7) { |
1879 | hw_dbg(hw, "Invalid packet buffer number [%d], expected range " | 1898 | hw_dbg(hw, "Invalid packet buffer number [%d], expected range " |