ixgbe: IEEE 802.1Qaz, implement priority assignment table
authorJohn Fastabend <john.r.fastabend@intel.com>
Wed, 23 Feb 2011 05:58:19 +0000 (05:58 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 12 Mar 2011 12:12:54 +0000 (04:12 -0800)
This patch adds support to use the priority assignment
table in the ieee_ets structure to map priorities to
traffic classes. Previously ixgbe only supported a
1:1 mapping. Now we can enable and disable hardware
DCB support when multiple traffic classes are actually
being used. This allows the default case all priorities
mapped to traffic class 0 to work in normal hardware
mode and utilize the full packet buffer.

This patch does not address putting the hardware in
4TC mode so packet buffer space may be underutilized
in this case. A follow up patch can address this
optimization. But at least we have the hooks to do
this now.

Also CEE will behave as it always has and map priorities
1:1 with traffic classes.

Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
Tested-by: Ross Brattain <ross.b.brattain@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ixgbe/ixgbe_dcb.c
drivers/net/ixgbe/ixgbe_dcb.h
drivers/net/ixgbe/ixgbe_dcb_82599.c
drivers/net/ixgbe/ixgbe_dcb_82599.h
drivers/net/ixgbe/ixgbe_dcb_nl.c

index e2e7a292525dbed7c74512a45f03e6588dc35cde..e7b551af573ddd486e66f17a1814fc4081558c66 100644 (file)
@@ -246,6 +246,8 @@ s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw,
        u8 bwgid[MAX_TRAFFIC_CLASS];
        u16 refill[MAX_TRAFFIC_CLASS];
        u16 max[MAX_TRAFFIC_CLASS];
+       /* CEE does not define a priority to tc mapping so map 1:1 */
+       u8 prio_tc[MAX_TRAFFIC_CLASS] = {0, 1, 2, 3, 4, 5, 6, 7};
 
        /* Unpack CEE standard containers */
        ixgbe_dcb_unpack_pfc(dcb_config, &pfc_en);
@@ -264,7 +266,7 @@ s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw,
        case ixgbe_mac_X540:
                ret = ixgbe_dcb_hw_config_82599(hw, dcb_config->rx_pba_cfg,
                                                pfc_en, refill, max, bwgid,
-                                               ptype);
+                                               ptype, prio_tc);
                break;
        default:
                break;
@@ -292,7 +294,8 @@ s32 ixgbe_dcb_hw_pfc_config(struct ixgbe_hw *hw, u8 pfc_en)
 }
 
 s32 ixgbe_dcb_hw_ets_config(struct ixgbe_hw *hw,
-                           u16 *refill, u16 *max, u8 *bwg_id, u8 *prio_type)
+                           u16 *refill, u16 *max, u8 *bwg_id,
+                           u8 *prio_type, u8 *prio_tc)
 {
        switch (hw->mac.type) {
        case ixgbe_mac_82598EB:
@@ -306,11 +309,11 @@ s32 ixgbe_dcb_hw_ets_config(struct ixgbe_hw *hw,
        case ixgbe_mac_82599EB:
        case ixgbe_mac_X540:
                ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max,
-                                                 bwg_id, prio_type);
+                                                 bwg_id, prio_type, prio_tc);
                ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max,
                                                       bwg_id, prio_type);
-               ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max,
-                                                      bwg_id, prio_type);
+               ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max, bwg_id,
+                                                      prio_type, prio_tc);
                break;
        default:
                break;
index 515bc27477f666ee6058b07293dd24120f3059c5..944838fc7b59d517b07f3ff90308d4d2cf3fd1f8 100644 (file)
@@ -159,8 +159,8 @@ s32 ixgbe_dcb_calculate_tc_credits(struct ixgbe_hw *,
                                   struct ixgbe_dcb_config *, int, u8);
 
 /* DCB hw initialization */
-s32 ixgbe_dcb_hw_ets_config(struct ixgbe_hw *hw,
-                           u16 *refill, u16 *max, u8 *bwg_id, u8 *prio_type);
+s32 ixgbe_dcb_hw_ets_config(struct ixgbe_hw *hw, u16 *refill, u16 *max,
+                           u8 *bwg_id, u8 *prio_type, u8 *tc_prio);
 s32 ixgbe_dcb_hw_pfc_config(struct ixgbe_hw *hw, u8 pfc_en);
 s32 ixgbe_dcb_hw_config(struct ixgbe_hw *, struct ixgbe_dcb_config *);
 
index beaa1c1c1e671c948687fef61b448ee3caefc673..0a482bbf1bd206465bdf56bc384a200344aa869e 100644 (file)
@@ -85,7 +85,8 @@ s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
                                      u16 *refill,
                                      u16 *max,
                                      u8 *bwg_id,
-                                     u8 *prio_type)
+                                     u8 *prio_type,
+                                     u8 *prio_tc)
 {
        u32    reg           = 0;
        u32    credit_refill = 0;
@@ -102,7 +103,7 @@ s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
        /* Map all traffic classes to their UP, 1 to 1 */
        reg = 0;
        for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
-               reg |= (i << (i * IXGBE_RTRUP2TC_UP_SHIFT));
+               reg |= (prio_tc[i] << (i * IXGBE_RTRUP2TC_UP_SHIFT));
        IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg);
 
        /* Configure traffic class credits and priority */
@@ -194,7 +195,8 @@ s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
                                           u16 *refill,
                                           u16 *max,
                                           u8 *bwg_id,
-                                          u8 *prio_type)
+                                          u8 *prio_type,
+                                          u8 *prio_tc)
 {
        u32 reg;
        u8 i;
@@ -211,7 +213,7 @@ s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
        /* Map all traffic classes to their UP, 1 to 1 */
        reg = 0;
        for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
-               reg |= (i << (i * IXGBE_RTTUP2TC_UP_SHIFT));
+               reg |= (prio_tc[i] << (i * IXGBE_RTTUP2TC_UP_SHIFT));
        IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg);
 
        /* Configure traffic class credits and priority */
@@ -424,15 +426,16 @@ static s32 ixgbe_dcb_config_82599(struct ixgbe_hw *hw)
  */
 s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw,
                              u8 rx_pba, u8 pfc_en, u16 *refill,
-                             u16 *max, u8 *bwg_id, u8 *prio_type)
+                             u16 *max, u8 *bwg_id, u8 *prio_type, u8 *prio_tc)
 {
        ixgbe_dcb_config_packet_buffers_82599(hw, rx_pba);
        ixgbe_dcb_config_82599(hw);
-       ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id, prio_type);
+       ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id,
+                                         prio_type, prio_tc);
        ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max,
                                               bwg_id, prio_type);
        ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max,
-                                              bwg_id, prio_type);
+                                              bwg_id, prio_type, prio_tc);
        ixgbe_dcb_config_pfc_82599(hw, pfc_en);
        ixgbe_dcb_config_tc_stats_82599(hw);
 
index 0b39ab4ffc707c7cad1b5ec6cb27f2cd25209e57..148fd8b477a9ea0cf617c30715bab7a4f66aa667 100644 (file)
@@ -109,7 +109,8 @@ s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
                                        u16 *refill,
                                        u16 *max,
                                        u8 *bwg_id,
-                                       u8 *prio_type);
+                                       u8 *prio_type,
+                                       u8 *prio_tc);
 
 s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
                                                u16 *refill,
@@ -121,10 +122,12 @@ s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
                                                u16 *refill,
                                                u16 *max,
                                                u8 *bwg_id,
-                                               u8 *prio_type);
+                                               u8 *prio_type,
+                                               u8 *prio_tc);
 
 s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw,
                              u8 rx_pba, u8 pfc_en, u16 *refill,
-                             u16 *max, u8 *bwg_id, u8 *prio_type);
+                             u16 *max, u8 *bwg_id, u8 *prio_type,
+                             u8 *prio_tc);
 
 #endif /* _DCB_82599_CONFIG_H */
index 8abef8d588fd8bab9452b8d62adb41d86ed5ef1a..fec4c724c37ad99775b26a9998495079672b2fb2 100644 (file)
@@ -416,6 +416,8 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
        if (adapter->dcb_set_bitmap & (BIT_PG_TX|BIT_PG_RX)) {
                u16 refill[MAX_TRAFFIC_CLASS], max[MAX_TRAFFIC_CLASS];
                u8 bwg_id[MAX_TRAFFIC_CLASS], prio_type[MAX_TRAFFIC_CLASS];
+               /* Priority to TC mapping in CEE case default to 1:1 */
+               u8 prio_tc[MAX_TRAFFIC_CLASS] = {0, 1, 2, 3, 4, 5, 6, 7};
                int max_frame = adapter->netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
 
 #ifdef CONFIG_FCOE
@@ -437,7 +439,7 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
                                      DCB_TX_CONFIG, prio_type);
 
                ixgbe_dcb_hw_ets_config(&adapter->hw, refill, max,
-                                       bwg_id, prio_type);
+                                       bwg_id, prio_type, prio_tc);
        }
 
        if (adapter->dcb_cfg.pfc_mode_enable)
@@ -645,6 +647,7 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
        __u8 prio_type[IEEE_8021QAZ_MAX_TCS];
        int max_frame = dev->mtu + ETH_HLEN + ETH_FCS_LEN;
        int i, err;
+       __u64 *p = (__u64 *) ets->prio_tc;
        /* naively give each TC a bwg to map onto CEE hardware */
        __u8 bwg_id[IEEE_8021QAZ_MAX_TCS] = {0, 1, 2, 3, 4, 5, 6, 7};
 
@@ -679,9 +682,14 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
                }
        }
 
+       if (*p)
+               ixgbe_dcbnl_set_state(dev, 1);
+       else
+               ixgbe_dcbnl_set_state(dev, 0);
+
        ixgbe_ieee_credits(ets->tc_tx_bw, refill, max, max_frame);
        err = ixgbe_dcb_hw_ets_config(&adapter->hw, refill, max,
-                                     bwg_id, prio_type);
+                                     bwg_id, prio_type, ets->prio_tc);
        return err;
 }