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

Merge branch 'mlx5-fixes'



Saeed Mahameed says:

====================
mlx5 driver updates and fixes

Changes from V0:
	- Dropped: ("net/mlx5e: Reset link modes upon setting speed to zero")
	- Fixed compilation issue introduced to mlx5_ib driver.
	- Rebased to df637193 ('Revert "Prevent NUll pointer dereference with two PHYs on cpsw"')

This series has few bug fixes for mlx5 core and ethernet driver.

Eli fixed a wrong static local variable declaration in flow steering API.
Majd added the support of ConnectX-5 PF and VF and added the support
for kernel shutdown pci callback for more robust reboot procedures.
Maor fixed a soft lockup in flow steering.
Rana fixed a wrog speed define in mlx5 EN driver.
I also had the chance to introduce some bug fixes in mlx5 EN mtu
reporting and handling.

For -stable:
	net/mlx5_core: Fix soft lockup in steering error flow
	net/mlx5e: Device's mtu field is u16 and not int
	net/mlx5e: Fix minimum MTU
	net/mlx5e: Use vport MTU rather than physical port MTU
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 45c78e02 5fc7197d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -671,8 +671,8 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port,
	struct mlx5_ib_dev *dev = to_mdev(ibdev);
	struct mlx5_core_dev *mdev = dev->mdev;
	struct mlx5_hca_vport_context *rep;
	int max_mtu;
	int oper_mtu;
	u16 max_mtu;
	u16 oper_mtu;
	int err;
	u8 ib_link_width_oper;
	u8 vl_hw_cap;
+1 −1
Original line number Diff line number Diff line
@@ -609,7 +609,7 @@ enum mlx5e_link_mode {
	MLX5E_100GBASE_KR4	 = 22,
	MLX5E_100GBASE_LR4	 = 23,
	MLX5E_100BASE_TX	 = 24,
	MLX5E_100BASE_T		 = 25,
	MLX5E_1000BASE_T	 = 25,
	MLX5E_10GBASE_T		 = 26,
	MLX5E_25GBASE_CR	 = 27,
	MLX5E_25GBASE_KR	 = 28,
+4 −4
Original line number Diff line number Diff line
@@ -138,10 +138,10 @@ static const struct {
	[MLX5E_100BASE_TX]   = {
		.speed      = 100,
	},
	[MLX5E_100BASE_T]    = {
		.supported  = SUPPORTED_100baseT_Full,
		.advertised = ADVERTISED_100baseT_Full,
		.speed      = 100,
	[MLX5E_1000BASE_T]    = {
		.supported  = SUPPORTED_1000baseT_Full,
		.advertised = ADVERTISED_1000baseT_Full,
		.speed      = 1000,
	},
	[MLX5E_10GBASE_T]    = {
		.supported  = SUPPORTED_10000baseT_Full,
+57 −15
Original line number Diff line number Diff line
@@ -1404,24 +1404,50 @@ static int mlx5e_refresh_tirs_self_loopback_enable(struct mlx5e_priv *priv)
	return 0;
}

static int mlx5e_set_dev_port_mtu(struct net_device *netdev)
static int mlx5e_set_mtu(struct mlx5e_priv *priv, u16 mtu)
{
	struct mlx5e_priv *priv = netdev_priv(netdev);
	struct mlx5_core_dev *mdev = priv->mdev;
	int hw_mtu;
	u16 hw_mtu = MLX5E_SW2HW_MTU(mtu);
	int err;

	err = mlx5_set_port_mtu(mdev, MLX5E_SW2HW_MTU(netdev->mtu), 1);
	err = mlx5_set_port_mtu(mdev, hw_mtu, 1);
	if (err)
		return err;

	/* Update vport context MTU */
	mlx5_modify_nic_vport_mtu(mdev, hw_mtu);
	return 0;
}

static void mlx5e_query_mtu(struct mlx5e_priv *priv, u16 *mtu)
{
	struct mlx5_core_dev *mdev = priv->mdev;
	u16 hw_mtu = 0;
	int err;

	err = mlx5_query_nic_vport_mtu(mdev, &hw_mtu);
	if (err || !hw_mtu) /* fallback to port oper mtu */
		mlx5_query_port_oper_mtu(mdev, &hw_mtu, 1);

	if (MLX5E_HW2SW_MTU(hw_mtu) != netdev->mtu)
		netdev_warn(netdev, "%s: Port MTU %d is different than netdev mtu %d\n",
			    __func__, MLX5E_HW2SW_MTU(hw_mtu), netdev->mtu);
	*mtu = MLX5E_HW2SW_MTU(hw_mtu);
}

static int mlx5e_set_dev_port_mtu(struct net_device *netdev)
{
	struct mlx5e_priv *priv = netdev_priv(netdev);
	u16 mtu;
	int err;

	err = mlx5e_set_mtu(priv, netdev->mtu);
	if (err)
		return err;

	netdev->mtu = MLX5E_HW2SW_MTU(hw_mtu);
	mlx5e_query_mtu(priv, &mtu);
	if (mtu != netdev->mtu)
		netdev_warn(netdev, "%s: VPort MTU %d is different than netdev mtu %d\n",
			    __func__, mtu, netdev->mtu);

	netdev->mtu = mtu;
	return 0;
}

@@ -1999,22 +2025,27 @@ static int mlx5e_set_features(struct net_device *netdev,
	return err;
}

#define MXL5_HW_MIN_MTU 64
#define MXL5E_MIN_MTU (MXL5_HW_MIN_MTU + ETH_FCS_LEN)

static int mlx5e_change_mtu(struct net_device *netdev, int new_mtu)
{
	struct mlx5e_priv *priv = netdev_priv(netdev);
	struct mlx5_core_dev *mdev = priv->mdev;
	bool was_opened;
	int max_mtu;
	u16 max_mtu;
	u16 min_mtu;
	int err = 0;

	mlx5_query_port_max_mtu(mdev, &max_mtu, 1);

	max_mtu = MLX5E_HW2SW_MTU(max_mtu);
	min_mtu = MLX5E_HW2SW_MTU(MXL5E_MIN_MTU);

	if (new_mtu > max_mtu) {
	if (new_mtu > max_mtu || new_mtu < min_mtu) {
		netdev_err(netdev,
			   "%s: Bad MTU (%d) > (%d) Max\n",
			   __func__, new_mtu, max_mtu);
			   "%s: Bad MTU (%d), valid range is: [%d..%d]\n",
			   __func__, new_mtu, min_mtu, max_mtu);
		return -EINVAL;
	}

@@ -2602,7 +2633,16 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv)
	schedule_work(&priv->set_rx_mode_work);
	mlx5e_disable_async_events(priv);
	flush_scheduled_work();
	if (test_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &mdev->intf_state)) {
		netif_device_detach(netdev);
		mutex_lock(&priv->state_lock);
		if (test_bit(MLX5E_STATE_OPENED, &priv->state))
			mlx5e_close_locked(netdev);
		mutex_unlock(&priv->state_lock);
	} else {
		unregister_netdev(netdev);
	}

	mlx5e_tc_cleanup(priv);
	mlx5e_vxlan_cleanup(priv);
	mlx5e_destroy_flow_tables(priv);
@@ -2615,6 +2655,8 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv)
	mlx5_core_dealloc_transport_domain(priv->mdev, priv->tdn);
	mlx5_core_dealloc_pd(priv->mdev, priv->pdn);
	mlx5_unmap_free_uar(priv->mdev, &priv->cq_uar);

	if (!test_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &mdev->intf_state))
		free_netdev(netdev);
}

+18 −30
Original line number Diff line number Diff line
@@ -1065,33 +1065,6 @@ unlock_fg:
	return rule;
}

static struct mlx5_flow_rule *add_rule_to_auto_fg(struct mlx5_flow_table *ft,
						  u8 match_criteria_enable,
						  u32 *match_criteria,
						  u32 *match_value,
						  u8 action,
						  u32 flow_tag,
						  struct mlx5_flow_destination *dest)
{
	struct mlx5_flow_rule *rule;
	struct mlx5_flow_group *g;

	g = create_autogroup(ft, match_criteria_enable, match_criteria);
	if (IS_ERR(g))
		return (void *)g;

	rule = add_rule_fg(g, match_value,
			   action, flow_tag, dest);
	if (IS_ERR(rule)) {
		/* Remove assumes refcount > 0 and autogroup creates a group
		 * with a refcount = 0.
		 */
		tree_get_node(&g->node);
		tree_remove_node(&g->node);
	}
	return rule;
}

static struct mlx5_flow_rule *
_mlx5_add_flow_rule(struct mlx5_flow_table *ft,
		    u8 match_criteria_enable,
@@ -1119,8 +1092,23 @@ _mlx5_add_flow_rule(struct mlx5_flow_table *ft,
				goto unlock;
		}

	rule = add_rule_to_auto_fg(ft, match_criteria_enable, match_criteria,
				   match_value, action, flow_tag, dest);
	g = create_autogroup(ft, match_criteria_enable, match_criteria);
	if (IS_ERR(g)) {
		rule = (void *)g;
		goto unlock;
	}

	rule = add_rule_fg(g, match_value,
			   action, flow_tag, dest);
	if (IS_ERR(rule)) {
		/* Remove assumes refcount > 0 and autogroup creates a group
		 * with a refcount = 0.
		 */
		unlock_ref_node(&ft->node);
		tree_get_node(&g->node);
		tree_remove_node(&g->node);
		return rule;
	}
unlock:
	unlock_ref_node(&ft->node);
	return rule;
@@ -1288,7 +1276,7 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
{
	struct mlx5_flow_root_namespace *root_ns = dev->priv.root_ns;
	int prio;
	static struct fs_prio *fs_prio;
	struct fs_prio *fs_prio;
	struct mlx5_flow_namespace *ns;

	if (!root_ns)
Loading