|
@@ -338,6 +338,8 @@ static void ixgbe_dcbnl_devreset(struct net_device *dev)
|
|
|
static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
{
|
|
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
+ struct ixgbe_dcb_config *dcb_cfg = &adapter->dcb_cfg;
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
int ret = DCB_NO_HW_CHG;
|
|
|
int i;
|
|
|
|
|
@@ -350,32 +352,6 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
if (!adapter->dcb_set_bitmap)
|
|
|
return ret;
|
|
|
|
|
|
- if (adapter->dcb_cfg.pfc_mode_enable) {
|
|
|
- switch (adapter->hw.mac.type) {
|
|
|
- case ixgbe_mac_82599EB:
|
|
|
- case ixgbe_mac_X540:
|
|
|
- if (adapter->hw.fc.current_mode != ixgbe_fc_pfc)
|
|
|
- adapter->last_lfc_mode =
|
|
|
- adapter->hw.fc.current_mode;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- adapter->hw.fc.requested_mode = ixgbe_fc_pfc;
|
|
|
- } else {
|
|
|
- switch (adapter->hw.mac.type) {
|
|
|
- case ixgbe_mac_82598EB:
|
|
|
- adapter->hw.fc.requested_mode = ixgbe_fc_none;
|
|
|
- break;
|
|
|
- case ixgbe_mac_82599EB:
|
|
|
- case ixgbe_mac_X540:
|
|
|
- adapter->hw.fc.requested_mode = adapter->last_lfc_mode;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
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];
|
|
@@ -388,23 +364,19 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
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_calculate_tc_credits(hw, dcb_cfg, max_frame,
|
|
|
+ DCB_TX_CONFIG);
|
|
|
+ ixgbe_dcb_calculate_tc_credits(hw, 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_unpack_map(&adapter->dcb_cfg,
|
|
|
- DCB_TX_CONFIG, prio_tc);
|
|
|
+ ixgbe_dcb_unpack_refill(dcb_cfg, DCB_TX_CONFIG, refill);
|
|
|
+ ixgbe_dcb_unpack_max(dcb_cfg, max);
|
|
|
+ ixgbe_dcb_unpack_bwgid(dcb_cfg, DCB_TX_CONFIG, bwg_id);
|
|
|
+ ixgbe_dcb_unpack_prio(dcb_cfg, DCB_TX_CONFIG, prio_type);
|
|
|
+ ixgbe_dcb_unpack_map(dcb_cfg, DCB_TX_CONFIG, prio_tc);
|
|
|
|
|
|
- ixgbe_dcb_hw_ets_config(&adapter->hw, refill, max,
|
|
|
- bwg_id, prio_type, prio_tc);
|
|
|
+ ixgbe_dcb_hw_ets_config(hw, refill, max, bwg_id,
|
|
|
+ prio_type, prio_tc);
|
|
|
|
|
|
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
|
|
|
netdev_set_prio_tc_map(netdev, i, prio_tc[i]);
|
|
@@ -413,20 +385,19 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
}
|
|
|
|
|
|
if (adapter->dcb_set_bitmap & BIT_PFC) {
|
|
|
- u8 pfc_en;
|
|
|
- u8 prio_tc[MAX_USER_PRIORITY];
|
|
|
-
|
|
|
- ixgbe_dcb_unpack_map(&adapter->dcb_cfg,
|
|
|
- DCB_TX_CONFIG, prio_tc);
|
|
|
- ixgbe_dcb_unpack_pfc(&adapter->dcb_cfg, &pfc_en);
|
|
|
- ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc_en, prio_tc);
|
|
|
- if (ret != DCB_HW_CHG_RST)
|
|
|
- ret = DCB_HW_CHG;
|
|
|
+ if (dcb_cfg->pfc_mode_enable) {
|
|
|
+ u8 pfc_en;
|
|
|
+ u8 prio_tc[MAX_USER_PRIORITY];
|
|
|
+
|
|
|
+ ixgbe_dcb_unpack_map(dcb_cfg, DCB_TX_CONFIG, prio_tc);
|
|
|
+ ixgbe_dcb_unpack_pfc(dcb_cfg, &pfc_en);
|
|
|
+ ixgbe_dcb_hw_pfc_config(hw, pfc_en, prio_tc);
|
|
|
+ } else {
|
|
|
+ hw->mac.ops.fc_enable(hw);
|
|
|
+ }
|
|
|
+ ret = DCB_HW_CHG;
|
|
|
}
|
|
|
|
|
|
- if (adapter->dcb_cfg.pfc_mode_enable)
|
|
|
- adapter->hw.fc.current_mode = ixgbe_fc_pfc;
|
|
|
-
|
|
|
#ifdef IXGBE_FCOE
|
|
|
/* Reprogam FCoE hardware offloads when the traffic class
|
|
|
* FCoE is using changes. This happens if the APP info
|
|
@@ -647,7 +618,9 @@ static int ixgbe_dcbnl_ieee_setpfc(struct net_device *dev,
|
|
|
struct ieee_pfc *pfc)
|
|
|
{
|
|
|
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
u8 *prio_tc;
|
|
|
+ int err;
|
|
|
|
|
|
if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
|
|
|
return -EINVAL;
|
|
@@ -659,16 +632,16 @@ static int ixgbe_dcbnl_ieee_setpfc(struct net_device *dev,
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- if (pfc->pfc_en) {
|
|
|
- adapter->last_lfc_mode = adapter->hw.fc.current_mode;
|
|
|
- adapter->hw.fc.current_mode = ixgbe_fc_pfc;
|
|
|
- } else {
|
|
|
- adapter->hw.fc.current_mode = adapter->last_lfc_mode;
|
|
|
- }
|
|
|
-
|
|
|
prio_tc = adapter->ixgbe_ieee_ets->prio_tc;
|
|
|
memcpy(adapter->ixgbe_ieee_pfc, pfc, sizeof(*adapter->ixgbe_ieee_pfc));
|
|
|
- return ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc->pfc_en, prio_tc);
|
|
|
+
|
|
|
+ /* Enable link flow control parameters if PFC is disabled */
|
|
|
+ if (pfc->pfc_en)
|
|
|
+ err = ixgbe_dcb_hw_pfc_config(hw, pfc->pfc_en, prio_tc);
|
|
|
+ else
|
|
|
+ err = hw->mac.ops.fc_enable(hw);
|
|
|
+
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
|