@@ -5161,7 +5161,6 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
5161
5161
hw_resc -> resv_vnics = le16_to_cpu (resp -> alloc_vnics );
5162
5162
cp = le16_to_cpu (resp -> alloc_cmpl_rings );
5163
5163
stats = le16_to_cpu (resp -> alloc_stat_ctx );
5164
- cp = min_t (u16 , cp , stats );
5165
5164
hw_resc -> resv_irqs = cp ;
5166
5165
if (bp -> flags & BNXT_FLAG_CHIP_P5 ) {
5167
5166
int rx = hw_resc -> resv_rx_rings ;
@@ -5180,6 +5179,7 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
5180
5179
hw_resc -> resv_hw_ring_grps = rx ;
5181
5180
}
5182
5181
hw_resc -> resv_cp_rings = cp ;
5182
+ hw_resc -> resv_stat_ctxs = stats ;
5183
5183
}
5184
5184
mutex_unlock (& bp -> hwrm_cmd_lock );
5185
5185
return 0 ;
@@ -5209,7 +5209,7 @@ static bool bnxt_rfs_supported(struct bnxt *bp);
5209
5209
static void
5210
5210
__bnxt_hwrm_reserve_pf_rings (struct bnxt * bp , struct hwrm_func_cfg_input * req ,
5211
5211
int tx_rings , int rx_rings , int ring_grps ,
5212
- int cp_rings , int vnics )
5212
+ int cp_rings , int stats , int vnics )
5213
5213
{
5214
5214
u32 enables = 0 ;
5215
5215
@@ -5251,7 +5251,7 @@ __bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, struct hwrm_func_cfg_input *req,
5251
5251
req -> num_rsscos_ctxs =
5252
5252
cpu_to_le16 (ring_grps + 1 );
5253
5253
}
5254
- req -> num_stat_ctxs = req -> num_cmpl_rings ;
5254
+ req -> num_stat_ctxs = cpu_to_le16 ( stats ) ;
5255
5255
req -> num_vnics = cpu_to_le16 (vnics );
5256
5256
}
5257
5257
req -> enables = cpu_to_le32 (enables );
@@ -5261,7 +5261,7 @@ static void
5261
5261
__bnxt_hwrm_reserve_vf_rings (struct bnxt * bp ,
5262
5262
struct hwrm_func_vf_cfg_input * req , int tx_rings ,
5263
5263
int rx_rings , int ring_grps , int cp_rings ,
5264
- int vnics )
5264
+ int stats , int vnics )
5265
5265
{
5266
5266
u32 enables = 0 ;
5267
5267
@@ -5294,21 +5294,21 @@ __bnxt_hwrm_reserve_vf_rings(struct bnxt *bp,
5294
5294
req -> num_hw_ring_grps = cpu_to_le16 (ring_grps );
5295
5295
req -> num_rsscos_ctxs = cpu_to_le16 (BNXT_VF_MAX_RSS_CTX );
5296
5296
}
5297
- req -> num_stat_ctxs = req -> num_cmpl_rings ;
5297
+ req -> num_stat_ctxs = cpu_to_le16 ( stats ) ;
5298
5298
req -> num_vnics = cpu_to_le16 (vnics );
5299
5299
5300
5300
req -> enables = cpu_to_le32 (enables );
5301
5301
}
5302
5302
5303
5303
static int
5304
5304
bnxt_hwrm_reserve_pf_rings (struct bnxt * bp , int tx_rings , int rx_rings ,
5305
- int ring_grps , int cp_rings , int vnics )
5305
+ int ring_grps , int cp_rings , int stats , int vnics )
5306
5306
{
5307
5307
struct hwrm_func_cfg_input req = {0 };
5308
5308
int rc ;
5309
5309
5310
5310
__bnxt_hwrm_reserve_pf_rings (bp , & req , tx_rings , rx_rings , ring_grps ,
5311
- cp_rings , vnics );
5311
+ cp_rings , stats , vnics );
5312
5312
if (!req .enables )
5313
5313
return 0 ;
5314
5314
@@ -5325,7 +5325,7 @@ bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5325
5325
5326
5326
static int
5327
5327
bnxt_hwrm_reserve_vf_rings (struct bnxt * bp , int tx_rings , int rx_rings ,
5328
- int ring_grps , int cp_rings , int vnics )
5328
+ int ring_grps , int cp_rings , int stats , int vnics )
5329
5329
{
5330
5330
struct hwrm_func_vf_cfg_input req = {0 };
5331
5331
int rc ;
@@ -5336,7 +5336,7 @@ bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5336
5336
}
5337
5337
5338
5338
__bnxt_hwrm_reserve_vf_rings (bp , & req , tx_rings , rx_rings , ring_grps ,
5339
- cp_rings , vnics );
5339
+ cp_rings , stats , vnics );
5340
5340
rc = hwrm_send_message (bp , & req , sizeof (req ), HWRM_CMD_TIMEOUT );
5341
5341
if (rc )
5342
5342
return - ENOMEM ;
@@ -5346,12 +5346,14 @@ bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5346
5346
}
5347
5347
5348
5348
static int bnxt_hwrm_reserve_rings (struct bnxt * bp , int tx , int rx , int grp ,
5349
- int cp , int vnic )
5349
+ int cp , int stat , int vnic )
5350
5350
{
5351
5351
if (BNXT_PF (bp ))
5352
- return bnxt_hwrm_reserve_pf_rings (bp , tx , rx , grp , cp , vnic );
5352
+ return bnxt_hwrm_reserve_pf_rings (bp , tx , rx , grp , cp , stat ,
5353
+ vnic );
5353
5354
else
5354
- return bnxt_hwrm_reserve_vf_rings (bp , tx , rx , grp , cp , vnic );
5355
+ return bnxt_hwrm_reserve_vf_rings (bp , tx , rx , grp , cp , stat ,
5356
+ vnic );
5355
5357
}
5356
5358
5357
5359
static int bnxt_nq_rings_in_use (struct bnxt * bp )
@@ -5380,12 +5382,17 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp)
5380
5382
return cp ;
5381
5383
}
5382
5384
5385
+ static int bnxt_get_func_stat_ctxs (struct bnxt * bp )
5386
+ {
5387
+ return bp -> cp_nr_rings + bnxt_get_ulp_stat_ctxs (bp );
5388
+ }
5389
+
5383
5390
static bool bnxt_need_reserve_rings (struct bnxt * bp )
5384
5391
{
5385
5392
struct bnxt_hw_resc * hw_resc = & bp -> hw_resc ;
5386
5393
int cp = bnxt_cp_rings_in_use (bp );
5387
5394
int nq = bnxt_nq_rings_in_use (bp );
5388
- int rx = bp -> rx_nr_rings ;
5395
+ int rx = bp -> rx_nr_rings , stat ;
5389
5396
int vnic = 1 , grp = rx ;
5390
5397
5391
5398
if (bp -> hwrm_spec_code < 0x10601 )
@@ -5398,9 +5405,11 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp)
5398
5405
vnic = rx + 1 ;
5399
5406
if (bp -> flags & BNXT_FLAG_AGG_RINGS )
5400
5407
rx <<= 1 ;
5408
+ stat = bnxt_get_func_stat_ctxs (bp );
5401
5409
if (BNXT_NEW_RM (bp ) &&
5402
5410
(hw_resc -> resv_rx_rings != rx || hw_resc -> resv_cp_rings != cp ||
5403
5411
hw_resc -> resv_irqs < nq || hw_resc -> resv_vnics != vnic ||
5412
+ hw_resc -> resv_stat_ctxs != stat ||
5404
5413
(hw_resc -> resv_hw_ring_grps != grp &&
5405
5414
!(bp -> flags & BNXT_FLAG_CHIP_P5 ))))
5406
5415
return true;
@@ -5414,8 +5423,8 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
5414
5423
int tx = bp -> tx_nr_rings ;
5415
5424
int rx = bp -> rx_nr_rings ;
5416
5425
int grp , rx_rings , rc ;
5426
+ int vnic = 1 , stat ;
5417
5427
bool sh = false;
5418
- int vnic = 1 ;
5419
5428
5420
5429
if (!bnxt_need_reserve_rings (bp ))
5421
5430
return 0 ;
@@ -5427,8 +5436,9 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
5427
5436
if (bp -> flags & BNXT_FLAG_AGG_RINGS )
5428
5437
rx <<= 1 ;
5429
5438
grp = bp -> rx_nr_rings ;
5439
+ stat = bnxt_get_func_stat_ctxs (bp );
5430
5440
5431
- rc = bnxt_hwrm_reserve_rings (bp , tx , rx , grp , cp , vnic );
5441
+ rc = bnxt_hwrm_reserve_rings (bp , tx , rx , grp , cp , stat , vnic );
5432
5442
if (rc )
5433
5443
return rc ;
5434
5444
@@ -5438,6 +5448,7 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
5438
5448
cp = hw_resc -> resv_irqs ;
5439
5449
grp = hw_resc -> resv_hw_ring_grps ;
5440
5450
vnic = hw_resc -> resv_vnics ;
5451
+ stat = hw_resc -> resv_stat_ctxs ;
5441
5452
}
5442
5453
5443
5454
rx_rings = rx ;
@@ -5456,6 +5467,10 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
5456
5467
}
5457
5468
}
5458
5469
rx_rings = min_t (int , rx_rings , grp );
5470
+ cp = min_t (int , cp , bp -> cp_nr_rings );
5471
+ if (stat > bnxt_get_ulp_stat_ctxs (bp ))
5472
+ stat -= bnxt_get_ulp_stat_ctxs (bp );
5473
+ cp = min_t (int , cp , stat );
5459
5474
rc = bnxt_trim_rings (bp , & rx_rings , & tx , cp , sh );
5460
5475
if (bp -> flags & BNXT_FLAG_AGG_RINGS )
5461
5476
rx = rx_rings << 1 ;
@@ -5464,14 +5479,15 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
5464
5479
bp -> rx_nr_rings = rx_rings ;
5465
5480
bp -> cp_nr_rings = cp ;
5466
5481
5467
- if (!tx || !rx || !cp || !grp || !vnic )
5482
+ if (!tx || !rx || !cp || !grp || !vnic || ! stat )
5468
5483
return - ENOMEM ;
5469
5484
5470
5485
return rc ;
5471
5486
}
5472
5487
5473
5488
static int bnxt_hwrm_check_vf_rings (struct bnxt * bp , int tx_rings , int rx_rings ,
5474
- int ring_grps , int cp_rings , int vnics )
5489
+ int ring_grps , int cp_rings , int stats ,
5490
+ int vnics )
5475
5491
{
5476
5492
struct hwrm_func_vf_cfg_input req = {0 };
5477
5493
u32 flags ;
@@ -5481,7 +5497,7 @@ static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5481
5497
return 0 ;
5482
5498
5483
5499
__bnxt_hwrm_reserve_vf_rings (bp , & req , tx_rings , rx_rings , ring_grps ,
5484
- cp_rings , vnics );
5500
+ cp_rings , stats , vnics );
5485
5501
flags = FUNC_VF_CFG_REQ_FLAGS_TX_ASSETS_TEST |
5486
5502
FUNC_VF_CFG_REQ_FLAGS_RX_ASSETS_TEST |
5487
5503
FUNC_VF_CFG_REQ_FLAGS_CMPL_ASSETS_TEST |
@@ -5499,14 +5515,15 @@ static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5499
5515
}
5500
5516
5501
5517
static int bnxt_hwrm_check_pf_rings (struct bnxt * bp , int tx_rings , int rx_rings ,
5502
- int ring_grps , int cp_rings , int vnics )
5518
+ int ring_grps , int cp_rings , int stats ,
5519
+ int vnics )
5503
5520
{
5504
5521
struct hwrm_func_cfg_input req = {0 };
5505
5522
u32 flags ;
5506
5523
int rc ;
5507
5524
5508
5525
__bnxt_hwrm_reserve_pf_rings (bp , & req , tx_rings , rx_rings , ring_grps ,
5509
- cp_rings , vnics );
5526
+ cp_rings , stats , vnics );
5510
5527
flags = FUNC_CFG_REQ_FLAGS_TX_ASSETS_TEST ;
5511
5528
if (BNXT_NEW_RM (bp )) {
5512
5529
flags |= FUNC_CFG_REQ_FLAGS_RX_ASSETS_TEST |
@@ -5527,17 +5544,19 @@ static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5527
5544
}
5528
5545
5529
5546
static int bnxt_hwrm_check_rings (struct bnxt * bp , int tx_rings , int rx_rings ,
5530
- int ring_grps , int cp_rings , int vnics )
5547
+ int ring_grps , int cp_rings , int stats ,
5548
+ int vnics )
5531
5549
{
5532
5550
if (bp -> hwrm_spec_code < 0x10801 )
5533
5551
return 0 ;
5534
5552
5535
5553
if (BNXT_PF (bp ))
5536
5554
return bnxt_hwrm_check_pf_rings (bp , tx_rings , rx_rings ,
5537
- ring_grps , cp_rings , vnics );
5555
+ ring_grps , cp_rings , stats ,
5556
+ vnics );
5538
5557
5539
5558
return bnxt_hwrm_check_vf_rings (bp , tx_rings , rx_rings , ring_grps ,
5540
- cp_rings , vnics );
5559
+ cp_rings , stats , vnics );
5541
5560
}
5542
5561
5543
5562
static void bnxt_hwrm_coal_params_qcaps (struct bnxt * bp )
@@ -7839,6 +7858,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
7839
7858
7840
7859
rc = bnxt_hwrm_func_resc_qcaps (bp , true);
7841
7860
hw_resc -> resv_cp_rings = 0 ;
7861
+ hw_resc -> resv_stat_ctxs = 0 ;
7842
7862
hw_resc -> resv_irqs = 0 ;
7843
7863
hw_resc -> resv_tx_rings = 0 ;
7844
7864
hw_resc -> resv_rx_rings = 0 ;
@@ -8644,12 +8664,12 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
8644
8664
if (vnics == bp -> hw_resc .resv_vnics )
8645
8665
return true;
8646
8666
8647
- bnxt_hwrm_reserve_rings (bp , 0 , 0 , 0 , 0 , vnics );
8667
+ bnxt_hwrm_reserve_rings (bp , 0 , 0 , 0 , 0 , 0 , vnics );
8648
8668
if (vnics <= bp -> hw_resc .resv_vnics )
8649
8669
return true;
8650
8670
8651
8671
netdev_warn (bp -> dev , "Unable to reserve resources to support NTUPLE filters.\n" );
8652
- bnxt_hwrm_reserve_rings (bp , 0 , 0 , 0 , 0 , 1 );
8672
+ bnxt_hwrm_reserve_rings (bp , 0 , 0 , 0 , 0 , 0 , 1 );
8653
8673
return false;
8654
8674
#else
8655
8675
return false;
@@ -9060,7 +9080,7 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
9060
9080
int tx_xdp )
9061
9081
{
9062
9082
int max_rx , max_tx , tx_sets = 1 ;
9063
- int tx_rings_needed ;
9083
+ int tx_rings_needed , stats ;
9064
9084
int rx_rings = rx ;
9065
9085
int cp , vnics , rc ;
9066
9086
@@ -9085,10 +9105,13 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
9085
9105
if (bp -> flags & BNXT_FLAG_AGG_RINGS )
9086
9106
rx_rings <<= 1 ;
9087
9107
cp = sh ? max_t (int , tx_rings_needed , rx ) : tx_rings_needed + rx ;
9088
- if (BNXT_NEW_RM (bp ))
9108
+ stats = cp ;
9109
+ if (BNXT_NEW_RM (bp )) {
9089
9110
cp += bnxt_get_ulp_msix_num (bp );
9111
+ stats += bnxt_get_ulp_stat_ctxs (bp );
9112
+ }
9090
9113
return bnxt_hwrm_check_rings (bp , tx_rings_needed , rx_rings , rx , cp ,
9091
- vnics );
9114
+ stats , vnics );
9092
9115
}
9093
9116
9094
9117
static void bnxt_unmap_bars (struct bnxt * bp , struct pci_dev * pdev )
0 commit comments