Skip to content

Commit 9582466

Browse files
Aviv HellerSaeed Mahameed
authored andcommitted
net/mlx5: Handle LAG FW commands failure gracefully
When create_lag or destroy_lag FW commands fail, display an appropriate error message, and try to recover, if possible. Signed-off-by: Aviv Heller <[email protected]> Reviewed-by: Roi Dayan <[email protected]> Reviewed-by: Yevgeny Kliteynik <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 7c34ec1 commit 9582466

File tree

1 file changed

+70
-21
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+70
-21
lines changed

drivers/net/ethernet/mellanox/mlx5/core/lag.c

Lines changed: 70 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -241,26 +241,52 @@ static int mlx5_create_lag(struct mlx5_lag *ldev,
241241
return err;
242242
}
243243

244-
static void mlx5_activate_lag(struct mlx5_lag *ldev,
245-
struct lag_tracker *tracker,
246-
u8 flags)
244+
static int mlx5_activate_lag(struct mlx5_lag *ldev,
245+
struct lag_tracker *tracker,
246+
u8 flags)
247247
{
248+
bool roce_lag = !!(flags & MLX5_LAG_FLAG_ROCE);
249+
struct mlx5_core_dev *dev0 = ldev->pf[0].dev;
250+
int err;
251+
252+
err = mlx5_create_lag(ldev, tracker);
253+
if (err) {
254+
if (roce_lag) {
255+
mlx5_core_err(dev0,
256+
"Failed to activate RoCE LAG\n");
257+
} else {
258+
mlx5_core_err(dev0,
259+
"Failed to activate VF LAG\n"
260+
"Make sure all VFs are unbound prior to VF LAG activation or deactivation\n");
261+
}
262+
return err;
263+
}
264+
248265
ldev->flags |= flags;
249-
mlx5_create_lag(ldev, tracker);
266+
return 0;
250267
}
251268

252-
static void mlx5_deactivate_lag(struct mlx5_lag *ldev)
269+
static int mlx5_deactivate_lag(struct mlx5_lag *ldev)
253270
{
254271
struct mlx5_core_dev *dev0 = ldev->pf[0].dev;
272+
bool roce_lag = __mlx5_lag_is_roce(ldev);
255273
int err;
256274

257275
ldev->flags &= ~MLX5_LAG_MODE_FLAGS;
258276

259277
err = mlx5_cmd_destroy_lag(dev0);
260-
if (err)
261-
mlx5_core_err(dev0,
262-
"Failed to destroy LAG (%d)\n",
263-
err);
278+
if (err) {
279+
if (roce_lag) {
280+
mlx5_core_err(dev0,
281+
"Failed to deactivate RoCE LAG; driver restart required\n");
282+
} else {
283+
mlx5_core_err(dev0,
284+
"Failed to deactivate VF LAG; driver restart required\n"
285+
"Make sure all VFs are unbound prior to VF LAG activation or deactivation\n");
286+
}
287+
}
288+
289+
return err;
264290
}
265291

266292
static bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)
@@ -273,13 +299,33 @@ static bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)
273299
return false;
274300
}
275301

302+
static void mlx5_lag_add_ib_devices(struct mlx5_lag *ldev)
303+
{
304+
int i;
305+
306+
for (i = 0; i < MLX5_MAX_PORTS; i++)
307+
if (ldev->pf[i].dev)
308+
mlx5_add_dev_by_protocol(ldev->pf[i].dev,
309+
MLX5_INTERFACE_PROTOCOL_IB);
310+
}
311+
312+
static void mlx5_lag_remove_ib_devices(struct mlx5_lag *ldev)
313+
{
314+
int i;
315+
316+
for (i = 0; i < MLX5_MAX_PORTS; i++)
317+
if (ldev->pf[i].dev)
318+
mlx5_remove_dev_by_protocol(ldev->pf[i].dev,
319+
MLX5_INTERFACE_PROTOCOL_IB);
320+
}
321+
276322
static void mlx5_do_bond(struct mlx5_lag *ldev)
277323
{
278324
struct mlx5_core_dev *dev0 = ldev->pf[0].dev;
279325
struct mlx5_core_dev *dev1 = ldev->pf[1].dev;
280326
struct lag_tracker tracker;
281327
bool do_bond, roce_lag;
282-
int i;
328+
int err;
283329

284330
if (!dev0 || !dev1)
285331
return;
@@ -295,13 +341,17 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
295341
!mlx5_sriov_is_enabled(dev1);
296342

297343
if (roce_lag)
298-
for (i = 0; i < MLX5_MAX_PORTS; i++)
299-
mlx5_remove_dev_by_protocol(ldev->pf[i].dev,
300-
MLX5_INTERFACE_PROTOCOL_IB);
344+
mlx5_lag_remove_ib_devices(ldev);
345+
346+
err = mlx5_activate_lag(ldev, &tracker,
347+
roce_lag ? MLX5_LAG_FLAG_ROCE :
348+
MLX5_LAG_FLAG_SRIOV);
349+
if (err) {
350+
if (roce_lag)
351+
mlx5_lag_add_ib_devices(ldev);
301352

302-
mlx5_activate_lag(ldev, &tracker,
303-
roce_lag ? MLX5_LAG_FLAG_ROCE :
304-
MLX5_LAG_FLAG_SRIOV);
353+
return;
354+
}
305355

306356
if (roce_lag) {
307357
mlx5_add_dev_by_protocol(dev0, MLX5_INTERFACE_PROTOCOL_IB);
@@ -317,13 +367,12 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
317367
mlx5_nic_vport_disable_roce(dev1);
318368
}
319369

320-
mlx5_deactivate_lag(ldev);
370+
err = mlx5_deactivate_lag(ldev);
371+
if (err)
372+
return;
321373

322374
if (roce_lag)
323-
for (i = 0; i < MLX5_MAX_PORTS; i++)
324-
if (ldev->pf[i].dev)
325-
mlx5_add_dev_by_protocol(ldev->pf[i].dev,
326-
MLX5_INTERFACE_PROTOCOL_IB);
375+
mlx5_lag_add_ib_devices(ldev);
327376
}
328377
}
329378

0 commit comments

Comments
 (0)