|
@@ -158,10 +158,6 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc,
|
|
|
{
|
|
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
|
|
|
- /* Abort a bad configuration */
|
|
|
- if (ffs(up_map) > adapter->dcb_cfg.num_tcs.pg_tcs)
|
|
|
- return;
|
|
|
-
|
|
|
if (prio != DCB_ATTR_VALUE_UNDEFINED)
|
|
|
adapter->temp_dcb_cfg.tc_config[tc].path[0].prio_type = prio;
|
|
|
if (bwg_id != DCB_ATTR_VALUE_UNDEFINED)
|
|
@@ -185,7 +181,7 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc,
|
|
|
|
|
|
if (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_set_bitmap |= BIT_PFC;
|
|
|
+ adapter->dcb_set_bitmap |= BIT_PFC | BIT_APP_UPCHG;
|
|
|
}
|
|
|
|
|
|
static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id,
|
|
@@ -206,10 +202,6 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc,
|
|
|
{
|
|
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
|
|
|
- /* Abort bad configurations */
|
|
|
- if (ffs(up_map) > adapter->dcb_cfg.num_tcs.pg_tcs)
|
|
|
- return;
|
|
|
-
|
|
|
if (prio != DCB_ATTR_VALUE_UNDEFINED)
|
|
|
adapter->temp_dcb_cfg.tc_config[tc].path[1].prio_type = prio;
|
|
|
if (bwg_id != DCB_ATTR_VALUE_UNDEFINED)
|
|
@@ -309,6 +301,27 @@ static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority,
|
|
|
*setting = adapter->dcb_cfg.tc_config[priority].dcb_pfc;
|
|
|
}
|
|
|
|
|
|
+#ifdef IXGBE_FCOE
|
|
|
+static void ixgbe_dcbnl_devreset(struct net_device *dev)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
|
+
|
|
|
+ while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state))
|
|
|
+ usleep_range(1000, 2000);
|
|
|
+
|
|
|
+ if (netif_running(dev))
|
|
|
+ dev->netdev_ops->ndo_stop(dev);
|
|
|
+
|
|
|
+ ixgbe_clear_interrupt_scheme(adapter);
|
|
|
+ ixgbe_init_interrupt_scheme(adapter);
|
|
|
+
|
|
|
+ if (netif_running(dev))
|
|
|
+ dev->netdev_ops->ndo_open(dev);
|
|
|
+
|
|
|
+ clear_bit(__IXGBE_RESETTING, &adapter->state);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
{
|
|
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
@@ -338,27 +351,6 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
if (ret)
|
|
|
return DCB_NO_HW_CHG;
|
|
|
|
|
|
-#ifdef IXGBE_FCOE
|
|
|
- if (up && !(up & (1 << adapter->fcoe.up)))
|
|
|
- adapter->dcb_set_bitmap |= BIT_APP_UPCHG;
|
|
|
-
|
|
|
- /*
|
|
|
- * Only take down the adapter if an app change occurred. FCoE
|
|
|
- * may shuffle tx rings in this case and this can not be done
|
|
|
- * without a reset currently.
|
|
|
- */
|
|
|
- if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
|
|
|
- while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state))
|
|
|
- usleep_range(1000, 2000);
|
|
|
-
|
|
|
- adapter->fcoe.up = ffs(up) - 1;
|
|
|
-
|
|
|
- if (netif_running(netdev))
|
|
|
- netdev->netdev_ops->ndo_stop(netdev);
|
|
|
- ixgbe_clear_interrupt_scheme(adapter);
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
if (adapter->dcb_cfg.pfc_mode_enable) {
|
|
|
switch (adapter->hw.mac.type) {
|
|
|
case ixgbe_mac_82599EB:
|
|
@@ -385,15 +377,6 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef IXGBE_FCOE
|
|
|
- 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;
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
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];
|
|
@@ -442,8 +425,19 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
|
if (adapter->dcb_cfg.pfc_mode_enable)
|
|
|
adapter->hw.fc.current_mode = ixgbe_fc_pfc;
|
|
|
|
|
|
- if (adapter->dcb_set_bitmap & BIT_APP_UPCHG)
|
|
|
- clear_bit(__IXGBE_RESETTING, &adapter->state);
|
|
|
+#ifdef IXGBE_FCOE
|
|
|
+ /* Reprogam FCoE hardware offloads when the traffic class
|
|
|
+ * FCoE is using changes. This happens if the APP info
|
|
|
+ * changes or the up2tc mapping is updated.
|
|
|
+ */
|
|
|
+ if ((up && !(up & (1 << adapter->fcoe.up))) ||
|
|
|
+ (adapter->dcb_set_bitmap & BIT_APP_UPCHG)) {
|
|
|
+ adapter->fcoe.up = ffs(up) - 1;
|
|
|
+ ixgbe_dcbnl_devreset(netdev);
|
|
|
+ ret = DCB_HW_CHG_RST;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
adapter->dcb_set_bitmap = 0x00;
|
|
|
return ret;
|
|
|
}
|
|
@@ -661,22 +655,6 @@ static int ixgbe_dcbnl_ieee_setpfc(struct net_device *dev,
|
|
|
return ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc->pfc_en, prio_tc);
|
|
|
}
|
|
|
|
|
|
-#ifdef IXGBE_FCOE
|
|
|
-static void ixgbe_dcbnl_devreset(struct net_device *dev)
|
|
|
-{
|
|
|
- struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
|
-
|
|
|
- if (netif_running(dev))
|
|
|
- dev->netdev_ops->ndo_stop(dev);
|
|
|
-
|
|
|
- ixgbe_clear_interrupt_scheme(adapter);
|
|
|
- ixgbe_init_interrupt_scheme(adapter);
|
|
|
-
|
|
|
- if (netif_running(dev))
|
|
|
- dev->netdev_ops->ndo_open(dev);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
|
|
|
struct dcb_app *app)
|
|
|
{
|
|
@@ -761,7 +739,9 @@ static u8 ixgbe_dcbnl_setdcbx(struct net_device *dev, u8 mode)
|
|
|
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);
|
|
|
+ u8 mask = BIT_PFC | BIT_PG_TX | BIT_PG_RX | BIT_APP_UPCHG;
|
|
|
+
|
|
|
+ adapter->dcb_set_bitmap |= mask;
|
|
|
ixgbe_dcbnl_set_all(dev);
|
|
|
} else {
|
|
|
/* Drop into single TC mode strict priority as this
|