Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d222a084 authored by David S. Miller's avatar David S. Miller
Browse files

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:
3c82b372 net: dsa: mt7530: fix module autoloading for OF platform drivers
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ab6f6dd1 461d5f1b
Loading
Loading
Loading
Loading
+41 −31
Original line number Diff line number Diff line
@@ -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
		return err;
	}

	mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap,
						prof->rx_ppp, prof->rx_pause,
						prof->tx_ppp, prof->tx_pause);
					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;
}
+19 −14
Original line number Diff line number Diff line
@@ -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
				    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,
						priv->prof->rx_ppp,
						priv->prof->rx_pause,
						priv->prof->tx_ppp,
						priv->prof->tx_pause);
					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;
}
+2 −2
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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;