Merge branch 'mlx4-misc-fixes-for-4.16'
Tariq Toukan says:
====================
mlx4 misc fixes for 4.16
This patchset contains misc bug fixes from the team
to the mlx4 Core and Eth drivers.
Patch 1 by Eran fixes a control mix of PFC and Global pauses, please queue it
to -stable for >= v4.8.
Patch 2 by Moshe fixes a resource leak in slave's delete flow, please queue it
to -stable for >= v4.5.
Series generated against net commit:
3c82b372a9
net: dsa: mt7530: fix module autoloading for OF platform drivers
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
d222a08432
@ -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;
|
||||
}
|
||||
|
@ -1046,27 +1046,32 @@ static int mlx4_en_set_pauseparam(struct net_device *dev,
|
||||
{
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
struct mlx4_en_dev *mdev = priv->mdev;
|
||||
u8 tx_pause, tx_ppp, rx_pause, rx_ppp;
|
||||
int err;
|
||||
|
||||
if (pause->autoneg)
|
||||
return -EINVAL;
|
||||
|
||||
priv->prof->tx_pause = pause->tx_pause != 0;
|
||||
priv->prof->rx_pause = pause->rx_pause != 0;
|
||||
tx_pause = !!(pause->tx_pause);
|
||||
rx_pause = !!(pause->rx_pause);
|
||||
rx_ppp = priv->prof->rx_ppp && !(tx_pause || rx_pause);
|
||||
tx_ppp = priv->prof->tx_ppp && !(tx_pause || rx_pause);
|
||||
|
||||
err = 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);
|
||||
if (err)
|
||||
en_err(priv, "Failed setting pause params\n");
|
||||
else
|
||||
mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap,
|
||||
priv->prof->rx_ppp,
|
||||
priv->prof->rx_pause,
|
||||
priv->prof->tx_ppp,
|
||||
priv->prof->tx_pause);
|
||||
tx_pause, tx_ppp, rx_pause, rx_ppp);
|
||||
if (err) {
|
||||
en_err(priv, "Failed setting pause params, err = %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap,
|
||||
rx_ppp, rx_pause, tx_ppp, tx_pause);
|
||||
|
||||
priv->prof->tx_pause = tx_pause;
|
||||
priv->prof->rx_pause = rx_pause;
|
||||
priv->prof->tx_ppp = tx_ppp;
|
||||
priv->prof->rx_ppp = rx_ppp;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -163,9 +163,9 @@ static void mlx4_en_get_profile(struct mlx4_en_dev *mdev)
|
||||
params->udp_rss = 0;
|
||||
}
|
||||
for (i = 1; i <= MLX4_MAX_PORTS; i++) {
|
||||
params->prof[i].rx_pause = 1;
|
||||
params->prof[i].rx_pause = !(pfcrx || pfctx);
|
||||
params->prof[i].rx_ppp = pfcrx;
|
||||
params->prof[i].tx_pause = 1;
|
||||
params->prof[i].tx_pause = !(pfcrx || pfctx);
|
||||
params->prof[i].tx_ppp = pfctx;
|
||||
params->prof[i].tx_ring_size = MLX4_EN_DEF_TX_RING_SIZE;
|
||||
params->prof[i].rx_ring_size = MLX4_EN_DEF_RX_RING_SIZE;
|
||||
|
@ -5088,6 +5088,7 @@ static void rem_slave_fs_rule(struct mlx4_dev *dev, int slave)
|
||||
&tracker->res_tree[RES_FS_RULE]);
|
||||
list_del(&fs_rule->com.list);
|
||||
spin_unlock_irq(mlx4_tlock(dev));
|
||||
kfree(fs_rule->mirr_mbox);
|
||||
kfree(fs_rule);
|
||||
state = 0;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user