@@ -241,26 +241,52 @@ static int mlx5_create_lag(struct mlx5_lag *ldev,
241
241
return err ;
242
242
}
243
243
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 )
247
247
{
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
+
248
265
ldev -> flags |= flags ;
249
- mlx5_create_lag ( ldev , tracker ) ;
266
+ return 0 ;
250
267
}
251
268
252
- static void mlx5_deactivate_lag (struct mlx5_lag * ldev )
269
+ static int mlx5_deactivate_lag (struct mlx5_lag * ldev )
253
270
{
254
271
struct mlx5_core_dev * dev0 = ldev -> pf [0 ].dev ;
272
+ bool roce_lag = __mlx5_lag_is_roce (ldev );
255
273
int err ;
256
274
257
275
ldev -> flags &= ~MLX5_LAG_MODE_FLAGS ;
258
276
259
277
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 ;
264
290
}
265
291
266
292
static bool mlx5_lag_check_prereq (struct mlx5_lag * ldev )
@@ -273,13 +299,33 @@ static bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)
273
299
return false;
274
300
}
275
301
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
+
276
322
static void mlx5_do_bond (struct mlx5_lag * ldev )
277
323
{
278
324
struct mlx5_core_dev * dev0 = ldev -> pf [0 ].dev ;
279
325
struct mlx5_core_dev * dev1 = ldev -> pf [1 ].dev ;
280
326
struct lag_tracker tracker ;
281
327
bool do_bond , roce_lag ;
282
- int i ;
328
+ int err ;
283
329
284
330
if (!dev0 || !dev1 )
285
331
return ;
@@ -295,13 +341,17 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
295
341
!mlx5_sriov_is_enabled (dev1 );
296
342
297
343
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 );
301
352
302
- mlx5_activate_lag (ldev , & tracker ,
303
- roce_lag ? MLX5_LAG_FLAG_ROCE :
304
- MLX5_LAG_FLAG_SRIOV );
353
+ return ;
354
+ }
305
355
306
356
if (roce_lag ) {
307
357
mlx5_add_dev_by_protocol (dev0 , MLX5_INTERFACE_PROTOCOL_IB );
@@ -317,13 +367,12 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
317
367
mlx5_nic_vport_disable_roce (dev1 );
318
368
}
319
369
320
- mlx5_deactivate_lag (ldev );
370
+ err = mlx5_deactivate_lag (ldev );
371
+ if (err )
372
+ return ;
321
373
322
374
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 );
327
376
}
328
377
}
329
378
0 commit comments