aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe/ixgbe_common.c
diff options
context:
space:
mode:
authorPJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>2009-03-25 18:10:42 -0400
committerDavid S. Miller <davem@davemloft.net>2009-03-26 04:13:51 -0400
commitbb3daa4a5960cd9d39bad88679fcf587b456c05d (patch)
tree31cbdf87fed0af126ff0c3e0647dfa90aab8a7c7 /drivers/net/ixgbe/ixgbe_common.c
parentede5ad0e29b641c3d3a644272a9127bfd98dfcc8 (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.c23
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 "