@@ -437,28 +437,40 @@ static int mlx5_hairpin_create_sq(struct mlx5_core_dev *mdev,
437
437
static int mlx5_hairpin_create_queues (struct mlx5_hairpin * hp ,
438
438
struct mlx5_hairpin_params * params )
439
439
{
440
- int err ;
440
+ int i , j , err ;
441
441
442
- err = mlx5_hairpin_create_rq (hp -> func_mdev , params , & hp -> rqn );
443
- if (err )
444
- goto out_err_rq ;
442
+ for (i = 0 ; i < hp -> num_channels ; i ++ ) {
443
+ err = mlx5_hairpin_create_rq (hp -> func_mdev , params , & hp -> rqn [i ]);
444
+ if (err )
445
+ goto out_err_rq ;
446
+ }
445
447
446
- err = mlx5_hairpin_create_sq (hp -> peer_mdev , params , & hp -> sqn );
447
- if (err )
448
- goto out_err_sq ;
448
+ for (i = 0 ; i < hp -> num_channels ; i ++ ) {
449
+ err = mlx5_hairpin_create_sq (hp -> peer_mdev , params , & hp -> sqn [i ]);
450
+ if (err )
451
+ goto out_err_sq ;
452
+ }
449
453
450
454
return 0 ;
451
455
452
456
out_err_sq :
453
- mlx5_core_destroy_rq (hp -> func_mdev , hp -> rqn );
457
+ for (j = 0 ; j < i ; j ++ )
458
+ mlx5_core_destroy_sq (hp -> peer_mdev , hp -> sqn [j ]);
459
+ i = hp -> num_channels ;
454
460
out_err_rq :
461
+ for (j = 0 ; j < i ; j ++ )
462
+ mlx5_core_destroy_rq (hp -> func_mdev , hp -> rqn [j ]);
455
463
return err ;
456
464
}
457
465
458
466
static void mlx5_hairpin_destroy_queues (struct mlx5_hairpin * hp )
459
467
{
460
- mlx5_core_destroy_rq (hp -> func_mdev , hp -> rqn );
461
- mlx5_core_destroy_sq (hp -> peer_mdev , hp -> sqn );
468
+ int i ;
469
+
470
+ for (i = 0 ; i < hp -> num_channels ; i ++ ) {
471
+ mlx5_core_destroy_rq (hp -> func_mdev , hp -> rqn [i ]);
472
+ mlx5_core_destroy_sq (hp -> peer_mdev , hp -> sqn [i ]);
473
+ }
462
474
}
463
475
464
476
static int mlx5_hairpin_modify_rq (struct mlx5_core_dev * func_mdev , u32 rqn ,
@@ -505,41 +517,53 @@ static int mlx5_hairpin_modify_sq(struct mlx5_core_dev *peer_mdev, u32 sqn,
505
517
506
518
static int mlx5_hairpin_pair_queues (struct mlx5_hairpin * hp )
507
519
{
508
- int err ;
520
+ int i , j , err ;
509
521
510
- /* set peer SQ */
511
- err = mlx5_hairpin_modify_sq (hp -> peer_mdev , hp -> sqn ,
512
- MLX5_SQC_STATE_RST , MLX5_SQC_STATE_RDY ,
513
- MLX5_CAP_GEN (hp -> func_mdev , vhca_id ), hp -> rqn );
514
- if (err )
515
- goto err_modify_sq ;
516
-
517
- /* set func RQ */
518
- err = mlx5_hairpin_modify_rq (hp -> func_mdev , hp -> rqn ,
519
- MLX5_RQC_STATE_RST , MLX5_RQC_STATE_RDY ,
520
- MLX5_CAP_GEN (hp -> peer_mdev , vhca_id ), hp -> sqn );
522
+ /* set peer SQs */
523
+ for (i = 0 ; i < hp -> num_channels ; i ++ ) {
524
+ err = mlx5_hairpin_modify_sq (hp -> peer_mdev , hp -> sqn [i ],
525
+ MLX5_SQC_STATE_RST , MLX5_SQC_STATE_RDY ,
526
+ MLX5_CAP_GEN (hp -> func_mdev , vhca_id ), hp -> rqn [i ]);
527
+ if (err )
528
+ goto err_modify_sq ;
529
+ }
521
530
522
- if (err )
523
- goto err_modify_rq ;
531
+ /* set func RQs */
532
+ for (i = 0 ; i < hp -> num_channels ; i ++ ) {
533
+ err = mlx5_hairpin_modify_rq (hp -> func_mdev , hp -> rqn [i ],
534
+ MLX5_RQC_STATE_RST , MLX5_RQC_STATE_RDY ,
535
+ MLX5_CAP_GEN (hp -> peer_mdev , vhca_id ), hp -> sqn [i ]);
536
+ if (err )
537
+ goto err_modify_rq ;
538
+ }
524
539
525
540
return 0 ;
526
541
527
542
err_modify_rq :
528
- mlx5_hairpin_modify_sq (hp -> peer_mdev , hp -> sqn , MLX5_SQC_STATE_RDY ,
529
- MLX5_SQC_STATE_RST , 0 , 0 );
543
+ for (j = 0 ; j < i ; j ++ )
544
+ mlx5_hairpin_modify_rq (hp -> func_mdev , hp -> rqn [j ], MLX5_RQC_STATE_RDY ,
545
+ MLX5_RQC_STATE_RST , 0 , 0 );
546
+ i = hp -> num_channels ;
530
547
err_modify_sq :
548
+ for (j = 0 ; j < i ; j ++ )
549
+ mlx5_hairpin_modify_sq (hp -> peer_mdev , hp -> sqn [j ], MLX5_SQC_STATE_RDY ,
550
+ MLX5_SQC_STATE_RST , 0 , 0 );
531
551
return err ;
532
552
}
533
553
534
554
static void mlx5_hairpin_unpair_queues (struct mlx5_hairpin * hp )
535
555
{
536
- /* unset func RQ */
537
- mlx5_hairpin_modify_rq (hp -> func_mdev , hp -> rqn , MLX5_RQC_STATE_RDY ,
538
- MLX5_RQC_STATE_RST , 0 , 0 );
556
+ int i ;
557
+
558
+ /* unset func RQs */
559
+ for (i = 0 ; i < hp -> num_channels ; i ++ )
560
+ mlx5_hairpin_modify_rq (hp -> func_mdev , hp -> rqn [i ], MLX5_RQC_STATE_RDY ,
561
+ MLX5_RQC_STATE_RST , 0 , 0 );
539
562
540
- /* unset peer SQ */
541
- mlx5_hairpin_modify_sq (hp -> peer_mdev , hp -> sqn , MLX5_SQC_STATE_RDY ,
542
- MLX5_SQC_STATE_RST , 0 , 0 );
563
+ /* unset peer SQs */
564
+ for (i = 0 ; i < hp -> num_channels ; i ++ )
565
+ mlx5_hairpin_modify_sq (hp -> peer_mdev , hp -> sqn [i ], MLX5_SQC_STATE_RDY ,
566
+ MLX5_SQC_STATE_RST , 0 , 0 );
543
567
}
544
568
545
569
struct mlx5_hairpin *
@@ -550,13 +574,17 @@ mlx5_core_hairpin_create(struct mlx5_core_dev *func_mdev,
550
574
struct mlx5_hairpin * hp ;
551
575
int size , err ;
552
576
553
- size = sizeof (* hp );
577
+ size = sizeof (* hp ) + params -> num_channels * 2 * sizeof ( u32 ) ;
554
578
hp = kzalloc (size , GFP_KERNEL );
555
579
if (!hp )
556
580
return ERR_PTR (- ENOMEM );
557
581
558
582
hp -> func_mdev = func_mdev ;
559
583
hp -> peer_mdev = peer_mdev ;
584
+ hp -> num_channels = params -> num_channels ;
585
+
586
+ hp -> rqn = (void * )hp + sizeof (* hp );
587
+ hp -> sqn = hp -> rqn + params -> num_channels ;
560
588
561
589
/* alloc and pair func --> peer hairpin */
562
590
err = mlx5_hairpin_create_queues (hp , params );
0 commit comments