ixgbe: Properly disable DCB arbiters prior to applying changes
authorPeter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
Tue, 1 Sep 2009 13:49:56 +0000 (13:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Sep 2009 00:40:18 +0000 (17:40 -0700)
When disabling the Rx and Tx data arbiters prior to configuration changes,
the arbiters were not being shut down properly.  This can create a race
in the DCB hardware blocks, and potentially hang the arbiters.  Also, the
Tx descriptor arbiter shouldn't be disabled when applying configuration
changes; disabling this arbiter can cause a Tx hang.

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>
drivers/net/ixgbe/ixgbe_dcb_82599.c

index 589f62c..ec8a252 100644 (file)
@@ -145,8 +145,12 @@ s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
        u32    credit_max    = 0;
        u8     i             = 0;
 
-       /* Disable the arbiter before changing parameters */
-       IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, IXGBE_RTRPCS_ARBDIS);
+       /*
+        * Disable the arbiter before changing parameters
+        * (always enable recycle mode; WSP)
+        */
+       reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS;
+       IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
 
        /* Map all traffic classes to their UP, 1 to 1 */
        reg = 0;
@@ -194,9 +198,6 @@ s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
        u32    reg, max_credits;
        u8     i;
 
-       /* Disable the arbiter before changing parameters */
-       IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, IXGBE_RTTDCS_ARBDIS);
-
        /* Clear the per-Tx queue credits; we use per-TC instead */
        for (i = 0; i < 128; i++) {
                IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i);
@@ -244,8 +245,14 @@ s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
        u32 reg;
        u8 i;
 
-       /* Disable the arbiter before changing parameters */
-       IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, IXGBE_RTTPCS_ARBDIS);
+       /*
+        * Disable the arbiter before changing parameters
+        * (always enable recycle mode; SP; arb delay)
+        */
+       reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
+             (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) |
+             IXGBE_RTTPCS_ARBDIS;
+       IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
 
        /* Map all traffic classes to their UP, 1 to 1 */
        reg = 0;