ixgbe: IEEE 802.1Qaz, implement priority assignment table
[deliverable/linux.git] / drivers / net / ixgbe / ixgbe_dcb_nl.c
index bf566e8a455e485978c66d8478166b0c885e64af..fec4c724c37ad99775b26a9998495079672b2fb2 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel 10 Gigabit PCI Express Linux driver
-  Copyright(c) 1999 - 2010 Intel Corporation.
+  Copyright(c) 1999 - 2011 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
@@ -37,7 +37,6 @@
 #define BIT_PG_RX      0x04
 #define BIT_PG_TX      0x08
 #define BIT_APP_UPCHG  0x10
-#define BIT_RESETLINK   0x40
 #define BIT_LINKSPEED   0x80
 
 /* Responses for the DCB_C_SET_ALL command */
@@ -130,7 +129,6 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                        netdev->netdev_ops->ndo_stop(netdev);
                ixgbe_clear_interrupt_scheme(adapter);
 
-               adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
                switch (adapter->hw.mac.type) {
                case ixgbe_mac_82598EB:
                        adapter->last_lfc_mode = adapter->hw.fc.current_mode;
@@ -146,6 +144,9 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                }
 
                adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
+               if (!netdev_get_num_tc(netdev))
+                       ixgbe_setup_tc(netdev, MAX_TRAFFIC_CLASS);
+
                ixgbe_init_interrupt_scheme(adapter);
                if (netif_running(netdev))
                        netdev->netdev_ops->ndo_open(netdev);
@@ -160,7 +161,6 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                        adapter->temp_dcb_cfg.pfc_mode_enable = false;
                        adapter->dcb_cfg.pfc_mode_enable = false;
                        adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
-                       adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
                        switch (adapter->hw.mac.type) {
                        case ixgbe_mac_82599EB:
                        case ixgbe_mac_X540:
@@ -170,6 +170,8 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                                break;
                        }
 
+                       ixgbe_setup_tc(netdev, 0);
+
                        ixgbe_init_interrupt_scheme(adapter);
                        if (netif_running(netdev))
                                netdev->netdev_ops->ndo_open(netdev);
@@ -225,10 +227,8 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc,
            (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_percent !=
             adapter->dcb_cfg.tc_config[tc].path[0].bwg_percent) ||
            (adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap !=
-            adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap)) {
+            adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap))
                adapter->dcb_set_bitmap |= BIT_PG_TX;
-               adapter->dcb_set_bitmap |= BIT_RESETLINK;
-       }
 }
 
 static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id,
@@ -239,10 +239,8 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id,
        adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct;
 
        if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] !=
-           adapter->dcb_cfg.bw_percentage[0][bwg_id]) {
+           adapter->dcb_cfg.bw_percentage[0][bwg_id])
                adapter->dcb_set_bitmap |= BIT_PG_TX;
-               adapter->dcb_set_bitmap |= BIT_RESETLINK;
-       }
 }
 
 static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc,
@@ -269,10 +267,8 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc,
            (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_percent !=
             adapter->dcb_cfg.tc_config[tc].path[1].bwg_percent) ||
            (adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap !=
-            adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap)) {
+            adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap))
                adapter->dcb_set_bitmap |= BIT_PG_RX;
-               adapter->dcb_set_bitmap |= BIT_RESETLINK;
-       }
 }
 
 static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id,
@@ -283,10 +279,8 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id,
        adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct;
 
        if (adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] !=
-           adapter->dcb_cfg.bw_percentage[1][bwg_id]) {
+           adapter->dcb_cfg.bw_percentage[1][bwg_id])
                adapter->dcb_set_bitmap |= BIT_PG_RX;
-               adapter->dcb_set_bitmap |= BIT_RESETLINK;
-       }
 }
 
 static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc,
@@ -355,31 +349,28 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        int ret;
 
-       if (!adapter->dcb_set_bitmap)
+       if (!adapter->dcb_set_bitmap ||
+           !(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
                return DCB_NO_HW_CHG;
 
        ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg,
-                                adapter->ring_feature[RING_F_DCB].indices);
+                                MAX_TRAFFIC_CLASS);
 
        if (ret)
                return DCB_NO_HW_CHG;
 
        /*
-        * Only take down the adapter if the configuration change
-        * requires a reset.
+        * Only take down the adapter if an app change occured. FCoE
+        * may shuffle tx rings in this case and this can not be done
+        * without a reset currently.
         */
-       if (adapter->dcb_set_bitmap & BIT_RESETLINK) {
+       if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
                while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state))
                        msleep(1);
 
-               if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
-                       if (netif_running(netdev))
-                               netdev->netdev_ops->ndo_stop(netdev);
-                       ixgbe_clear_interrupt_scheme(adapter);
-               } else {
-                       if (netif_running(netdev))
-                               ixgbe_down(adapter);
-               }
+               if (netif_running(netdev))
+                       netdev->netdev_ops->ndo_stop(netdev);
+               ixgbe_clear_interrupt_scheme(adapter);
        }
 
        if (adapter->dcb_cfg.pfc_mode_enable) {
@@ -408,29 +399,53 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
                }
        }
 
-       if (adapter->dcb_set_bitmap & BIT_RESETLINK) {
-               if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
-                       ixgbe_init_interrupt_scheme(adapter);
-                       if (netif_running(netdev))
-                               netdev->netdev_ops->ndo_open(netdev);
-               } else {
-                       if (netif_running(netdev))
-                               ixgbe_up(adapter);
-               }
+       if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
+               ixgbe_init_interrupt_scheme(adapter);
+               if (netif_running(netdev))
+                       netdev->netdev_ops->ndo_open(netdev);
                ret = DCB_HW_CHG_RST;
-       } else if (adapter->dcb_set_bitmap & BIT_PFC) {
-               if (adapter->hw.mac.type == ixgbe_mac_82598EB)
-                       ixgbe_dcb_config_pfc_82598(&adapter->hw,
-                                                  &adapter->dcb_cfg);
-               else if (adapter->hw.mac.type == ixgbe_mac_82599EB)
-                       ixgbe_dcb_config_pfc_82599(&adapter->hw,
-                                                  &adapter->dcb_cfg);
+       }
+
+       if (adapter->dcb_set_bitmap & BIT_PFC) {
+               u8 pfc_en;
+               ixgbe_dcb_unpack_pfc(&adapter->dcb_cfg, &pfc_en);
+               ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc_en);
                ret = DCB_HW_CHG;
        }
+
+       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
+               if (adapter->netdev->features & NETIF_F_FCOE_MTU)
+                       max_frame = max(max_frame, IXGBE_FCOE_JUMBO_FRAME_SIZE);
+#endif
+
+               ixgbe_dcb_calculate_tc_credits(&adapter->hw, &adapter->dcb_cfg,
+                                              max_frame, DCB_TX_CONFIG);
+               ixgbe_dcb_calculate_tc_credits(&adapter->hw, &adapter->dcb_cfg,
+                                              max_frame, DCB_RX_CONFIG);
+
+               ixgbe_dcb_unpack_refill(&adapter->dcb_cfg,
+                                       DCB_TX_CONFIG, refill);
+               ixgbe_dcb_unpack_max(&adapter->dcb_cfg, max);
+               ixgbe_dcb_unpack_bwgid(&adapter->dcb_cfg,
+                                      DCB_TX_CONFIG, bwg_id);
+               ixgbe_dcb_unpack_prio(&adapter->dcb_cfg,
+                                     DCB_TX_CONFIG, prio_type);
+
+               ixgbe_dcb_hw_ets_config(&adapter->hw, refill, max,
+                                       bwg_id, prio_type, prio_tc);
+       }
+
        if (adapter->dcb_cfg.pfc_mode_enable)
                adapter->hw.fc.current_mode = ixgbe_fc_pfc;
 
-       if (adapter->dcb_set_bitmap & BIT_RESETLINK)
+       if (adapter->dcb_set_bitmap & BIT_APP_UPCHG)
                clear_bit(__IXGBE_RESETTING, &adapter->state);
        adapter->dcb_set_bitmap = 0x00;
        return ret;
@@ -439,40 +454,38 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
 static u8 ixgbe_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
-       u8 rval = 0;
 
-       if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
-               switch (capid) {
-               case DCB_CAP_ATTR_PG:
-                       *cap = true;
-                       break;
-               case DCB_CAP_ATTR_PFC:
-                       *cap = true;
-                       break;
-               case DCB_CAP_ATTR_UP2TC:
-                       *cap = false;
-                       break;
-               case DCB_CAP_ATTR_PG_TCS:
-                       *cap = 0x80;
-                       break;
-               case DCB_CAP_ATTR_PFC_TCS:
-                       *cap = 0x80;
-                       break;
-               case DCB_CAP_ATTR_GSP:
-                       *cap = true;
-                       break;
-               case DCB_CAP_ATTR_BCN:
-                       *cap = false;
-                       break;
-               default:
-                       rval = -EINVAL;
-                       break;
-               }
-       } else {
-               rval = -EINVAL;
+       switch (capid) {
+       case DCB_CAP_ATTR_PG:
+               *cap = true;
+               break;
+       case DCB_CAP_ATTR_PFC:
+               *cap = true;
+               break;
+       case DCB_CAP_ATTR_UP2TC:
+               *cap = false;
+               break;
+       case DCB_CAP_ATTR_PG_TCS:
+               *cap = 0x80;
+               break;
+       case DCB_CAP_ATTR_PFC_TCS:
+               *cap = 0x80;
+               break;
+       case DCB_CAP_ATTR_GSP:
+               *cap = true;
+               break;
+       case DCB_CAP_ATTR_BCN:
+               *cap = false;
+               break;
+       case DCB_CAP_ATTR_DCBX:
+               *cap = adapter->dcbx_cap;
+               break;
+       default:
+               *cap = false;
+               break;
        }
 
-       return rval;
+       return 0;
 }
 
 static u8 ixgbe_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num)
@@ -533,21 +546,16 @@ static void ixgbe_dcbnl_setpfcstate(struct net_device *netdev, u8 state)
  */
 static u8 ixgbe_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id)
 {
-       u8 rval = 0;
+       struct ixgbe_adapter *adapter = netdev_priv(netdev);
+       struct dcb_app app = {
+                               .selector = idtype,
+                               .protocol = id,
+                            };
 
-       switch (idtype) {
-       case DCB_APP_IDTYPE_ETHTYPE:
-#ifdef IXGBE_FCOE
-               if (id == ETH_P_FCOE)
-                       rval = ixgbe_fcoe_getapp(netdev_priv(netdev));
-#endif
-               break;
-       case DCB_APP_IDTYPE_PORTNUM:
-               break;
-       default:
-               break;
-       }
-       return rval;
+       if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
+               return 0;
+
+       return dcb_getapp(netdev, &app);
 }
 
 /**
@@ -562,24 +570,45 @@ static u8 ixgbe_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id)
 static u8 ixgbe_dcbnl_setapp(struct net_device *netdev,
                              u8 idtype, u16 id, u8 up)
 {
+       struct ixgbe_adapter *adapter = netdev_priv(netdev);
        u8 rval = 1;
+       struct dcb_app app = {
+                             .selector = idtype,
+                             .protocol = id,
+                             .priority = up
+                            };
+
+       if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
+               return rval;
+
+       rval = dcb_setapp(netdev, &app);
 
        switch (idtype) {
        case DCB_APP_IDTYPE_ETHTYPE:
 #ifdef IXGBE_FCOE
                if (id == ETH_P_FCOE) {
-                       u8 tc;
-                       struct ixgbe_adapter *adapter;
+                       u8 old_tc;
 
-                       adapter = netdev_priv(netdev);
-                       tc = adapter->fcoe.tc;
+                       /* Get current programmed tc */
+                       old_tc = adapter->fcoe.tc;
                        rval = ixgbe_fcoe_setapp(adapter, up);
-                       if ((!rval) && (tc != adapter->fcoe.tc) &&
-                           (adapter->flags & IXGBE_FLAG_DCB_ENABLED) &&
-                           (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) {
+
+                       if (rval ||
+                          !(adapter->flags & IXGBE_FLAG_DCB_ENABLED) ||
+                          !(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
+                               break;
+
+                       /* The FCoE application priority may be changed multiple
+                        * times in quick sucession with switches that build up
+                        * TLVs. To avoid creating uneeded device resets this
+                        * checks the actual HW configuration and clears
+                        * BIT_APP_UPCHG if a HW configuration change is not
+                        * need
+                        */
+                       if (old_tc == adapter->fcoe.tc)
+                               adapter->dcb_set_bitmap &= ~BIT_APP_UPCHG;
+                       else
                                adapter->dcb_set_bitmap |= BIT_APP_UPCHG;
-                               adapter->dcb_set_bitmap |= BIT_RESETLINK;
-                       }
                }
 #endif
                break;
@@ -591,7 +620,204 @@ static u8 ixgbe_dcbnl_setapp(struct net_device *netdev,
        return rval;
 }
 
+static int ixgbe_dcbnl_ieee_getets(struct net_device *dev,
+                                  struct ieee_ets *ets)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+       struct ieee_ets *my_ets = adapter->ixgbe_ieee_ets;
+
+       /* No IEEE PFC settings available */
+       if (!my_ets)
+               return -EINVAL;
+
+       ets->ets_cap = MAX_TRAFFIC_CLASS;
+       ets->cbs = my_ets->cbs;
+       memcpy(ets->tc_tx_bw, my_ets->tc_tx_bw, sizeof(ets->tc_tx_bw));
+       memcpy(ets->tc_rx_bw, my_ets->tc_rx_bw, sizeof(ets->tc_rx_bw));
+       memcpy(ets->tc_tsa, my_ets->tc_tsa, sizeof(ets->tc_tsa));
+       memcpy(ets->prio_tc, my_ets->prio_tc, sizeof(ets->prio_tc));
+       return 0;
+}
+
+static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
+                                  struct ieee_ets *ets)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+       __u16 refill[IEEE_8021QAZ_MAX_TCS], max[IEEE_8021QAZ_MAX_TCS];
+       __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};
+
+       if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
+               return -EINVAL;
+
+       if (!adapter->ixgbe_ieee_ets) {
+               adapter->ixgbe_ieee_ets = kmalloc(sizeof(struct ieee_ets),
+                                                 GFP_KERNEL);
+               if (!adapter->ixgbe_ieee_ets)
+                       return -ENOMEM;
+       }
+
+       memcpy(adapter->ixgbe_ieee_ets, ets, sizeof(*adapter->ixgbe_ieee_ets));
+
+       /* Map TSA onto CEE prio type */
+       for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
+               switch (ets->tc_tsa[i]) {
+               case IEEE_8021QAZ_TSA_STRICT:
+                       prio_type[i] = 2;
+                       break;
+               case IEEE_8021QAZ_TSA_ETS:
+                       prio_type[i] = 0;
+                       break;
+               default:
+                       /* Hardware only supports priority strict or
+                        * ETS transmission selection algorithms if
+                        * we receive some other value from dcbnl
+                        * throw an error
+                        */
+                       return -EINVAL;
+               }
+       }
+
+       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, ets->prio_tc);
+       return err;
+}
+
+static int ixgbe_dcbnl_ieee_getpfc(struct net_device *dev,
+                                  struct ieee_pfc *pfc)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+       struct ieee_pfc *my_pfc = adapter->ixgbe_ieee_pfc;
+       int i;
+
+       /* No IEEE PFC settings available */
+       if (!my_pfc)
+               return -EINVAL;
+
+       pfc->pfc_cap = MAX_TRAFFIC_CLASS;
+       pfc->pfc_en = my_pfc->pfc_en;
+       pfc->mbc = my_pfc->mbc;
+       pfc->delay = my_pfc->delay;
+
+       for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
+               pfc->requests[i] = adapter->stats.pxoffrxc[i];
+               pfc->indications[i] = adapter->stats.pxofftxc[i];
+       }
+
+       return 0;
+}
+
+static int ixgbe_dcbnl_ieee_setpfc(struct net_device *dev,
+                                  struct ieee_pfc *pfc)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+       int err;
+
+       if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
+               return -EINVAL;
+
+       if (!adapter->ixgbe_ieee_pfc) {
+               adapter->ixgbe_ieee_pfc = kmalloc(sizeof(struct ieee_pfc),
+                                                 GFP_KERNEL);
+               if (!adapter->ixgbe_ieee_pfc)
+                       return -ENOMEM;
+       }
+
+       memcpy(adapter->ixgbe_ieee_pfc, pfc, sizeof(*adapter->ixgbe_ieee_pfc));
+       err = ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc->pfc_en);
+       return err;
+}
+
+static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
+                                  struct dcb_app *app)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+
+       if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
+               return -EINVAL;
+#ifdef IXGBE_FCOE
+       if (app->selector == 1 && app->protocol == ETH_P_FCOE) {
+               if (adapter->fcoe.tc == app->priority)
+                       goto setapp;
+
+               /* In IEEE mode map up to tc 1:1 */
+               adapter->fcoe.tc = app->priority;
+               adapter->fcoe.up = app->priority;
+
+               /* Force hardware reset required to push FCoE
+                * setup on {tx|rx}_rings
+                */
+               adapter->dcb_set_bitmap |= BIT_APP_UPCHG;
+               ixgbe_dcbnl_set_all(dev);
+       }
+
+setapp:
+#endif
+       dcb_setapp(dev, app);
+       return 0;
+}
+
+static u8 ixgbe_dcbnl_getdcbx(struct net_device *dev)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+       return adapter->dcbx_cap;
+}
+
+static u8 ixgbe_dcbnl_setdcbx(struct net_device *dev, u8 mode)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(dev);
+       struct ieee_ets ets = {0};
+       struct ieee_pfc pfc = {0};
+
+       /* no support for LLD_MANAGED modes or CEE+IEEE */
+       if ((mode & DCB_CAP_DCBX_LLD_MANAGED) ||
+           ((mode & DCB_CAP_DCBX_VER_IEEE) && (mode & DCB_CAP_DCBX_VER_CEE)) ||
+           !(mode & DCB_CAP_DCBX_HOST))
+               return 1;
+
+       if (mode == adapter->dcbx_cap)
+               return 0;
+
+       adapter->dcbx_cap = mode;
+
+       /* ETS and PFC defaults */
+       ets.ets_cap = 8;
+       pfc.pfc_cap = 8;
+
+       if (mode & DCB_CAP_DCBX_VER_IEEE) {
+               ixgbe_dcbnl_ieee_setets(dev, &ets);
+               ixgbe_dcbnl_ieee_setpfc(dev, &pfc);
+       } else if (mode & DCB_CAP_DCBX_VER_CEE) {
+               adapter->dcb_set_bitmap |= (BIT_PFC & BIT_PG_TX & BIT_PG_RX);
+               ixgbe_dcbnl_set_all(dev);
+       } else {
+               /* Drop into single TC mode strict priority as this
+                * indicates CEE and IEEE versions are disabled
+                */
+               ixgbe_dcbnl_ieee_setets(dev, &ets);
+               ixgbe_dcbnl_ieee_setpfc(dev, &pfc);
+               ixgbe_dcbnl_set_state(dev, 0);
+       }
+
+       return 0;
+}
+
 const struct dcbnl_rtnl_ops dcbnl_ops = {
+       .ieee_getets    = ixgbe_dcbnl_ieee_getets,
+       .ieee_setets    = ixgbe_dcbnl_ieee_setets,
+       .ieee_getpfc    = ixgbe_dcbnl_ieee_getpfc,
+       .ieee_setpfc    = ixgbe_dcbnl_ieee_setpfc,
+       .ieee_setapp    = ixgbe_dcbnl_ieee_setapp,
        .getstate       = ixgbe_dcbnl_get_state,
        .setstate       = ixgbe_dcbnl_set_state,
        .getpermhwaddr  = ixgbe_dcbnl_get_perm_hw_addr,
@@ -613,5 +839,6 @@ const struct dcbnl_rtnl_ops dcbnl_ops = {
        .setpfcstate    = ixgbe_dcbnl_setpfcstate,
        .getapp         = ixgbe_dcbnl_getapp,
        .setapp         = ixgbe_dcbnl_setapp,
+       .getdcbx        = ixgbe_dcbnl_getdcbx,
+       .setdcbx        = ixgbe_dcbnl_setdcbx,
 };
-
This page took 0.031709 seconds and 5 git commands to generate.