* 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) {
                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;
         * 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) {
                /* 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;
        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 "
 
        reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
        reg &= ~IXGBE_RMCS_TFCE_802_3X;
        /* correct the reporting of our flow control status */
-       hw->fc.current_mode = ixgbe_fc_none;
        reg |= IXGBE_RMCS_TFCE_PRIORITY;
        IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
 
 
                adapter->tx_ring = NULL;
                adapter->rx_ring = NULL;
 
+               adapter->hw.fc.requested_mode = ixgbe_fc_pfc;
                adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
                adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
                ixgbe_init_interrupt_scheme(adapter);
        } else {
                /* Turn off DCB */
                if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
+                       adapter->hw.fc.requested_mode = ixgbe_fc_default;
                        if (netif_running(netdev))
                                netdev->netdev_ops->ndo_stop(netdev);
                        ixgbe_reset_interrupt_capability(adapter);