]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/ixgbe/ixgbe_common.c
ixgbe: Allow Priority Flow Control settings to survive a device reset
[linux-2.6-omap-h63xx.git] / drivers / net / ixgbe / ixgbe_common.c
index 245db0e712e7e91af2c59fe6e03d032891826408..8cfd3fd309a03036dc1ad4ec357e8cbd7d74ce12 100644 (file)
@@ -1654,9 +1654,10 @@ s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num)
         * 0: Flow control is completely disabled
         * 1: Rx flow control is enabled (we can receive pause frames,
         *    but not send pause frames).
-        * 2:  Tx flow control is enabled (we can send pause frames but
-        *     we do not support receiving pause frames).
+        * 2: Tx flow control is enabled (we can send pause frames but
+        *    we do not support receiving pause frames).
         * 3: Both Rx and Tx flow control (symmetric) are enabled.
+        * 4: Priority Flow Control is enabled.
         * other: Invalid.
         */
        switch (hw->fc.current_mode) {
@@ -1686,6 +1687,11 @@ s32 ixgbe_fc_enable(struct ixgbe_hw *hw, s32 packetbuf_num)
                mflcn_reg |= IXGBE_MFLCN_RFCE;
                fccfg_reg |= IXGBE_FCCFG_TFCE_802_3X;
                break;
+#ifdef CONFIG_DCB
+       case ixgbe_fc_pfc:
+               goto out;
+               break;
+#endif
        default:
                hw_dbg(hw, "Flow control param set incorrectly\n");
                ret_val = -IXGBE_ERR_CONFIG;
@@ -1746,6 +1752,7 @@ s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw)
         * 2:  Tx flow control is enabled (we can send pause frames but
         *     we do not support receiving pause frames).
         * 3:  Both Rx and Tx flow control (symmetric) are enabled.
+        * 4:  Priority Flow Control is enabled.
         * other: Invalid.
         */
        switch (hw->fc.current_mode) {
@@ -1776,6 +1783,11 @@ s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw)
                /* Flow control (both Rx and Tx) is enabled by SW override. */
                reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE);
                break;
+#ifdef CONFIG_DCB
+       case ixgbe_fc_pfc:
+               goto out;
+               break;
+#endif
        default:
                hw_dbg(hw, "Flow control param set incorrectly\n");
                ret_val = -IXGBE_ERR_CONFIG;
@@ -1874,6 +1886,13 @@ s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw, s32 packetbuf_num)
        ixgbe_link_speed speed;
        bool link_up;
 
+#ifdef CONFIG_DCB
+       if (hw->fc.requested_mode == ixgbe_fc_pfc) {
+               hw->fc.current_mode = hw->fc.requested_mode;
+               goto out;
+       }
+
+#endif
        /* Validate the packetbuf configuration */
        if (packetbuf_num < 0 || packetbuf_num > 7) {
                hw_dbg(hw, "Invalid packet buffer number [%d], expected range "