aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTariq Toukan <tariqt@mellanox.com>2016-02-29 14:17:10 -0500
committerDavid S. Miller <davem@davemloft.net>2016-03-02 14:37:25 -0500
commitab0394fe2c258fdb5086c51a251b28f8ee7ab35c (patch)
treec80cd301855731ad6a38aa5b6b7ffe4c15468723
parent59a7c2fd336eaafb030aac9c91ac21d136a99f33 (diff)
net/mlx5e: Fix LRO modify
Ethtool LRO enable/disable is broken, as of today we only modify TCP TIRs in order to apply the requested configuration. Hardware requires that all TIRs pointing to the same RQ should share the same LRO configuration. For that all other TIRs' LRO fields must be modified as well. Fixes: 5c50368f3831 ('net/mlx5e: Light-weight netdev open/stop') Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_main.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index d4e1c3045200..137b05e1c68a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -1317,7 +1317,7 @@ static void mlx5e_build_tir_ctx_lro(void *tirc, struct mlx5e_priv *priv)
1317 lro_timer_supported_periods[2])); 1317 lro_timer_supported_periods[2]));
1318} 1318}
1319 1319
1320static int mlx5e_modify_tir_lro(struct mlx5e_priv *priv, int tt) 1320static int mlx5e_modify_tirs_lro(struct mlx5e_priv *priv)
1321{ 1321{
1322 struct mlx5_core_dev *mdev = priv->mdev; 1322 struct mlx5_core_dev *mdev = priv->mdev;
1323 1323
@@ -1325,6 +1325,7 @@ static int mlx5e_modify_tir_lro(struct mlx5e_priv *priv, int tt)
1325 void *tirc; 1325 void *tirc;
1326 int inlen; 1326 int inlen;
1327 int err; 1327 int err;
1328 int tt;
1328 1329
1329 inlen = MLX5_ST_SZ_BYTES(modify_tir_in); 1330 inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
1330 in = mlx5_vzalloc(inlen); 1331 in = mlx5_vzalloc(inlen);
@@ -1336,7 +1337,11 @@ static int mlx5e_modify_tir_lro(struct mlx5e_priv *priv, int tt)
1336 1337
1337 mlx5e_build_tir_ctx_lro(tirc, priv); 1338 mlx5e_build_tir_ctx_lro(tirc, priv);
1338 1339
1339 err = mlx5_core_modify_tir(mdev, priv->tirn[tt], in, inlen); 1340 for (tt = 0; tt < MLX5E_NUM_TT; tt++) {
1341 err = mlx5_core_modify_tir(mdev, priv->tirn[tt], in, inlen);
1342 if (err)
1343 break;
1344 }
1340 1345
1341 kvfree(in); 1346 kvfree(in);
1342 1347
@@ -1885,8 +1890,10 @@ static int mlx5e_set_features(struct net_device *netdev,
1885 mlx5e_close_locked(priv->netdev); 1890 mlx5e_close_locked(priv->netdev);
1886 1891
1887 priv->params.lro_en = !!(features & NETIF_F_LRO); 1892 priv->params.lro_en = !!(features & NETIF_F_LRO);
1888 mlx5e_modify_tir_lro(priv, MLX5E_TT_IPV4_TCP); 1893 err = mlx5e_modify_tirs_lro(priv);
1889 mlx5e_modify_tir_lro(priv, MLX5E_TT_IPV6_TCP); 1894 if (err)
1895 mlx5_core_warn(priv->mdev, "lro modify failed, %d\n",
1896 err);
1890 1897
1891 if (was_opened) 1898 if (was_opened)
1892 err = mlx5e_open_locked(priv->netdev); 1899 err = mlx5e_open_locked(priv->netdev);