|
@@ -156,57 +156,63 @@ static int mlx4_en_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num)
|
|
|
static u8 mlx4_en_dcbnl_set_all(struct net_device *netdev)
|
|
|
{
|
|
|
struct mlx4_en_priv *priv = netdev_priv(netdev);
|
|
|
+ struct mlx4_en_port_profile *prof = priv->prof;
|
|
|
struct mlx4_en_dev *mdev = priv->mdev;
|
|
|
+ u8 tx_pause, tx_ppp, rx_pause, rx_ppp;
|
|
|
|
|
|
if (!(priv->dcbx_cap & DCB_CAP_DCBX_VER_CEE))
|
|
|
return 1;
|
|
|
|
|
|
if (priv->cee_config.pfc_state) {
|
|
|
int tc;
|
|
|
+ rx_ppp = prof->rx_ppp;
|
|
|
+ tx_ppp = prof->tx_ppp;
|
|
|
|
|
|
- priv->prof->rx_pause = 0;
|
|
|
- priv->prof->tx_pause = 0;
|
|
|
for (tc = 0; tc < CEE_DCBX_MAX_PRIO; tc++) {
|
|
|
u8 tc_mask = 1 << tc;
|
|
|
|
|
|
switch (priv->cee_config.dcb_pfc[tc]) {
|
|
|
case pfc_disabled:
|
|
|
- priv->prof->tx_ppp &= ~tc_mask;
|
|
|
- priv->prof->rx_ppp &= ~tc_mask;
|
|
|
+ tx_ppp &= ~tc_mask;
|
|
|
+ rx_ppp &= ~tc_mask;
|
|
|
break;
|
|
|
case pfc_enabled_full:
|
|
|
- priv->prof->tx_ppp |= tc_mask;
|
|
|
- priv->prof->rx_ppp |= tc_mask;
|
|
|
+ tx_ppp |= tc_mask;
|
|
|
+ rx_ppp |= tc_mask;
|
|
|
break;
|
|
|
case pfc_enabled_tx:
|
|
|
- priv->prof->tx_ppp |= tc_mask;
|
|
|
- priv->prof->rx_ppp &= ~tc_mask;
|
|
|
+ tx_ppp |= tc_mask;
|
|
|
+ rx_ppp &= ~tc_mask;
|
|
|
break;
|
|
|
case pfc_enabled_rx:
|
|
|
- priv->prof->tx_ppp &= ~tc_mask;
|
|
|
- priv->prof->rx_ppp |= tc_mask;
|
|
|
+ tx_ppp &= ~tc_mask;
|
|
|
+ rx_ppp |= tc_mask;
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- en_dbg(DRV, priv, "Set pfc on\n");
|
|
|
+ rx_pause = !!(rx_ppp || tx_ppp) ? 0 : prof->rx_pause;
|
|
|
+ tx_pause = !!(rx_ppp || tx_ppp) ? 0 : prof->tx_pause;
|
|
|
} else {
|
|
|
- priv->prof->rx_pause = 1;
|
|
|
- priv->prof->tx_pause = 1;
|
|
|
- en_dbg(DRV, priv, "Set pfc off\n");
|
|
|
+ rx_ppp = 0;
|
|
|
+ tx_ppp = 0;
|
|
|
+ rx_pause = prof->rx_pause;
|
|
|
+ tx_pause = prof->tx_pause;
|
|
|
}
|
|
|
|
|
|
if (mlx4_SET_PORT_general(mdev->dev, priv->port,
|
|
|
priv->rx_skb_size + ETH_FCS_LEN,
|
|
|
- priv->prof->tx_pause,
|
|
|
- priv->prof->tx_ppp,
|
|
|
- priv->prof->rx_pause,
|
|
|
- priv->prof->rx_ppp)) {
|
|
|
+ tx_pause, tx_ppp, rx_pause, rx_ppp)) {
|
|
|
en_err(priv, "Failed setting pause params\n");
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+ prof->tx_ppp = tx_ppp;
|
|
|
+ prof->rx_ppp = rx_ppp;
|
|
|
+ prof->tx_pause = tx_pause;
|
|
|
+ prof->rx_pause = rx_pause;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -408,6 +414,7 @@ static int mlx4_en_dcbnl_ieee_setpfc(struct net_device *dev,
|
|
|
struct mlx4_en_priv *priv = netdev_priv(dev);
|
|
|
struct mlx4_en_port_profile *prof = priv->prof;
|
|
|
struct mlx4_en_dev *mdev = priv->mdev;
|
|
|
+ u32 tx_pause, tx_ppp, rx_pause, rx_ppp;
|
|
|
int err;
|
|
|
|
|
|
en_dbg(DRV, priv, "cap: 0x%x en: 0x%x mbc: 0x%x delay: %d\n",
|
|
@@ -416,23 +423,26 @@ static int mlx4_en_dcbnl_ieee_setpfc(struct net_device *dev,
|
|
|
pfc->mbc,
|
|
|
pfc->delay);
|
|
|
|
|
|
- prof->rx_pause = !pfc->pfc_en;
|
|
|
- prof->tx_pause = !pfc->pfc_en;
|
|
|
- prof->rx_ppp = pfc->pfc_en;
|
|
|
- prof->tx_ppp = pfc->pfc_en;
|
|
|
+ rx_pause = prof->rx_pause && !pfc->pfc_en;
|
|
|
+ tx_pause = prof->tx_pause && !pfc->pfc_en;
|
|
|
+ rx_ppp = pfc->pfc_en;
|
|
|
+ tx_ppp = pfc->pfc_en;
|
|
|
|
|
|
err = mlx4_SET_PORT_general(mdev->dev, priv->port,
|
|
|
priv->rx_skb_size + ETH_FCS_LEN,
|
|
|
- prof->tx_pause,
|
|
|
- prof->tx_ppp,
|
|
|
- prof->rx_pause,
|
|
|
- prof->rx_ppp);
|
|
|
- if (err)
|
|
|
+ tx_pause, tx_ppp, rx_pause, rx_ppp);
|
|
|
+ if (err) {
|
|
|
en_err(priv, "Failed setting pause params\n");
|
|
|
- else
|
|
|
- mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap,
|
|
|
- prof->rx_ppp, prof->rx_pause,
|
|
|
- prof->tx_ppp, prof->tx_pause);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap,
|
|
|
+ rx_ppp, rx_pause, tx_ppp, tx_pause);
|
|
|
+
|
|
|
+ prof->tx_ppp = tx_ppp;
|
|
|
+ prof->rx_ppp = rx_ppp;
|
|
|
+ prof->rx_pause = rx_pause;
|
|
|
+ prof->tx_pause = tx_pause;
|
|
|
|
|
|
return err;
|
|
|
}
|