@@ -1486,7 +1486,8 @@ static void mlx5e_fill_direct_rqt_rqn(struct mlx5e_priv *priv, void *rqtc,
1486
1486
MLX5_SET (rqtc , rqtc , rq_num [0 ], rqn );
1487
1487
}
1488
1488
1489
- static int mlx5e_create_rqt (struct mlx5e_priv * priv , int sz , int ix , u32 * rqtn )
1489
+ static int mlx5e_create_rqt (struct mlx5e_priv * priv , int sz ,
1490
+ int ix , struct mlx5e_rqt * rqt )
1490
1491
{
1491
1492
struct mlx5_core_dev * mdev = priv -> mdev ;
1492
1493
void * rqtc ;
@@ -1509,34 +1510,37 @@ static int mlx5e_create_rqt(struct mlx5e_priv *priv, int sz, int ix, u32 *rqtn)
1509
1510
else
1510
1511
mlx5e_fill_direct_rqt_rqn (priv , rqtc , ix );
1511
1512
1512
- err = mlx5_core_create_rqt (mdev , in , inlen , rqtn );
1513
+ err = mlx5_core_create_rqt (mdev , in , inlen , & rqt -> rqtn );
1514
+ if (!err )
1515
+ rqt -> enabled = true;
1513
1516
1514
1517
kvfree (in );
1515
1518
return err ;
1516
1519
}
1517
1520
1518
- static void mlx5e_destroy_rqt (struct mlx5e_priv * priv , u32 rqtn )
1521
+ static void mlx5e_destroy_rqt (struct mlx5e_priv * priv , struct mlx5e_rqt * rqt )
1519
1522
{
1520
- mlx5_core_destroy_rqt (priv -> mdev , rqtn );
1523
+ rqt -> enabled = false;
1524
+ mlx5_core_destroy_rqt (priv -> mdev , rqt -> rqtn );
1521
1525
}
1522
1526
1523
1527
static int mlx5e_create_rqts (struct mlx5e_priv * priv )
1524
1528
{
1525
1529
int nch = mlx5e_get_max_num_channels (priv -> mdev );
1526
- u32 * rqtn ;
1530
+ struct mlx5e_rqt * rqt ;
1527
1531
int err ;
1528
1532
int ix ;
1529
1533
1530
1534
/* Indirect RQT */
1531
- rqtn = & priv -> indir_rqtn ;
1532
- err = mlx5e_create_rqt (priv , MLX5E_INDIR_RQT_SIZE , 0 , rqtn );
1535
+ rqt = & priv -> indir_rqt ;
1536
+ err = mlx5e_create_rqt (priv , MLX5E_INDIR_RQT_SIZE , 0 , rqt );
1533
1537
if (err )
1534
1538
return err ;
1535
1539
1536
1540
/* Direct RQTs */
1537
1541
for (ix = 0 ; ix < nch ; ix ++ ) {
1538
- rqtn = & priv -> direct_tir [ix ].rqtn ;
1539
- err = mlx5e_create_rqt (priv , 1 /*size */ , ix , rqtn );
1542
+ rqt = & priv -> direct_tir [ix ].rqt ;
1543
+ err = mlx5e_create_rqt (priv , 1 /*size */ , ix , rqt );
1540
1544
if (err )
1541
1545
goto err_destroy_rqts ;
1542
1546
}
@@ -1545,9 +1549,9 @@ static int mlx5e_create_rqts(struct mlx5e_priv *priv)
1545
1549
1546
1550
err_destroy_rqts :
1547
1551
for (ix -- ; ix >= 0 ; ix -- )
1548
- mlx5e_destroy_rqt (priv , priv -> direct_tir [ix ].rqtn );
1552
+ mlx5e_destroy_rqt (priv , & priv -> direct_tir [ix ].rqt );
1549
1553
1550
- mlx5e_destroy_rqt (priv , priv -> indir_rqtn );
1554
+ mlx5e_destroy_rqt (priv , & priv -> indir_rqt );
1551
1555
1552
1556
return err ;
1553
1557
}
@@ -1558,9 +1562,9 @@ static void mlx5e_destroy_rqts(struct mlx5e_priv *priv)
1558
1562
int i ;
1559
1563
1560
1564
for (i = 0 ; i < nch ; i ++ )
1561
- mlx5e_destroy_rqt (priv , priv -> direct_tir [i ].rqtn );
1565
+ mlx5e_destroy_rqt (priv , & priv -> direct_tir [i ].rqt );
1562
1566
1563
- mlx5e_destroy_rqt (priv , priv -> indir_rqtn );
1567
+ mlx5e_destroy_rqt (priv , & priv -> indir_rqt );
1564
1568
}
1565
1569
1566
1570
int mlx5e_redirect_rqt (struct mlx5e_priv * priv , u32 rqtn , int sz , int ix )
@@ -1598,10 +1602,15 @@ static void mlx5e_redirect_rqts(struct mlx5e_priv *priv)
1598
1602
u32 rqtn ;
1599
1603
int ix ;
1600
1604
1601
- rqtn = priv -> indir_rqtn ;
1602
- mlx5e_redirect_rqt (priv , rqtn , MLX5E_INDIR_RQT_SIZE , 0 );
1605
+ if (priv -> indir_rqt .enabled ) {
1606
+ rqtn = priv -> indir_rqt .rqtn ;
1607
+ mlx5e_redirect_rqt (priv , rqtn , MLX5E_INDIR_RQT_SIZE , 0 );
1608
+ }
1609
+
1603
1610
for (ix = 0 ; ix < priv -> params .num_channels ; ix ++ ) {
1604
- rqtn = priv -> direct_tir [ix ].rqtn ;
1611
+ if (!priv -> direct_tir [ix ].rqt .enabled )
1612
+ continue ;
1613
+ rqtn = priv -> direct_tir [ix ].rqt .rqtn ;
1605
1614
mlx5e_redirect_rqt (priv , rqtn , 1 , ix );
1606
1615
}
1607
1616
}
@@ -2012,7 +2021,7 @@ static void mlx5e_build_indir_tir_ctx(struct mlx5e_priv *priv, u32 *tirc,
2012
2021
mlx5e_build_tir_ctx_lro (tirc , priv );
2013
2022
2014
2023
MLX5_SET (tirc , tirc , disp_type , MLX5_TIRC_DISP_TYPE_INDIRECT );
2015
- MLX5_SET (tirc , tirc , indirect_table , priv -> indir_rqtn );
2024
+ MLX5_SET (tirc , tirc , indirect_table , priv -> indir_rqt . rqtn );
2016
2025
mlx5e_build_tir_ctx_hash (tirc , priv );
2017
2026
2018
2027
switch (tt ) {
@@ -2144,7 +2153,7 @@ static int mlx5e_create_tirs(struct mlx5e_priv *priv)
2144
2153
tir = & priv -> direct_tir [ix ];
2145
2154
tirc = MLX5_ADDR_OF (create_tir_in , in , ctx );
2146
2155
mlx5e_build_direct_tir_ctx (priv , tirc ,
2147
- priv -> direct_tir [ix ].rqtn );
2156
+ priv -> direct_tir [ix ].rqt . rqtn );
2148
2157
err = mlx5e_create_tir (priv -> mdev , tir , in , inlen );
2149
2158
if (err )
2150
2159
goto err_destroy_ch_tirs ;
0 commit comments