@@ -2834,14 +2834,11 @@ static int __bnxt_poll_cqs(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
2834
2834
struct bnxt_cp_ring_info * cpr = & bnapi -> cp_ring ;
2835
2835
int i , work_done = 0 ;
2836
2836
2837
- for (i = 0 ; i < 2 ; i ++ ) {
2838
- struct bnxt_cp_ring_info * cpr2 = cpr -> cp_ring_arr [i ];
2837
+ for (i = 0 ; i < cpr -> cp_ring_count ; i ++ ) {
2838
+ struct bnxt_cp_ring_info * cpr2 = & cpr -> cp_ring_arr [i ];
2839
2839
2840
- if (cpr2 ) {
2841
- work_done += __bnxt_poll_work (bp , cpr2 ,
2842
- budget - work_done );
2843
- cpr -> has_more_work |= cpr2 -> has_more_work ;
2844
- }
2840
+ work_done += __bnxt_poll_work (bp , cpr2 , budget - work_done );
2841
+ cpr -> has_more_work |= cpr2 -> has_more_work ;
2845
2842
}
2846
2843
return work_done ;
2847
2844
}
@@ -2852,11 +2849,11 @@ static void __bnxt_poll_cqs_done(struct bnxt *bp, struct bnxt_napi *bnapi,
2852
2849
struct bnxt_cp_ring_info * cpr = & bnapi -> cp_ring ;
2853
2850
int i ;
2854
2851
2855
- for (i = 0 ; i < 2 ; i ++ ) {
2856
- struct bnxt_cp_ring_info * cpr2 = cpr -> cp_ring_arr [i ];
2852
+ for (i = 0 ; i < cpr -> cp_ring_count ; i ++ ) {
2853
+ struct bnxt_cp_ring_info * cpr2 = & cpr -> cp_ring_arr [i ];
2857
2854
struct bnxt_db_info * db ;
2858
2855
2859
- if (cpr2 && cpr2 -> had_work_done ) {
2856
+ if (cpr2 -> had_work_done ) {
2860
2857
db = & cpr2 -> cp_db ;
2861
2858
bnxt_writeq (bp , db -> db_key64 | dbr_type |
2862
2859
RING_CMP (cpr2 -> cp_raw_cons ), db -> doorbell );
@@ -2915,7 +2912,7 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
2915
2912
if (budget && work_done >= budget && idx == BNXT_RX_HDL )
2916
2913
break ;
2917
2914
2918
- cpr2 = cpr -> cp_ring_arr [idx ];
2915
+ cpr2 = & cpr -> cp_ring_arr [idx ];
2919
2916
work_done += __bnxt_poll_work (bp , cpr2 ,
2920
2917
budget - work_done );
2921
2918
cpr -> has_more_work |= cpr2 -> has_more_work ;
@@ -2930,8 +2927,8 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
2930
2927
BNXT_DB_NQ_P5 (& cpr -> cp_db , raw_cons );
2931
2928
}
2932
2929
poll_done :
2933
- cpr_rx = cpr -> cp_ring_arr [BNXT_RX_HDL ];
2934
- if (cpr_rx && (bp -> flags & BNXT_FLAG_DIM )) {
2930
+ cpr_rx = & cpr -> cp_ring_arr [BNXT_RX_HDL ];
2931
+ if (cpr_rx -> bnapi && (bp -> flags & BNXT_FLAG_DIM )) {
2935
2932
struct dim_sample dim_sample = {};
2936
2933
2937
2934
dim_update_sample (cpr -> event_ctr ,
@@ -3541,36 +3538,33 @@ static void bnxt_free_cp_rings(struct bnxt *bp)
3541
3538
3542
3539
bnxt_free_ring (bp , & ring -> ring_mem );
3543
3540
3544
- for ( j = 0 ; j < 2 ; j ++ ) {
3545
- struct bnxt_cp_ring_info * cpr2 = cpr -> cp_ring_arr [ j ] ;
3541
+ if (! cpr -> cp_ring_arr )
3542
+ continue ;
3546
3543
3547
- if (cpr2 ) {
3548
- ring = & cpr2 -> cp_ring_struct ;
3549
- bnxt_free_ring (bp , & ring -> ring_mem );
3550
- bnxt_free_cp_arrays (cpr2 );
3551
- kfree (cpr2 );
3552
- cpr -> cp_ring_arr [j ] = NULL ;
3553
- }
3544
+ for (j = 0 ; j < cpr -> cp_ring_count ; j ++ ) {
3545
+ struct bnxt_cp_ring_info * cpr2 = & cpr -> cp_ring_arr [j ];
3546
+
3547
+ ring = & cpr2 -> cp_ring_struct ;
3548
+ bnxt_free_ring (bp , & ring -> ring_mem );
3549
+ bnxt_free_cp_arrays (cpr2 );
3554
3550
}
3551
+ kfree (cpr -> cp_ring_arr );
3552
+ cpr -> cp_ring_arr = NULL ;
3553
+ cpr -> cp_ring_count = 0 ;
3555
3554
}
3556
3555
}
3557
3556
3558
- static struct bnxt_cp_ring_info * bnxt_alloc_cp_sub_ring (struct bnxt * bp )
3557
+ static int bnxt_alloc_cp_sub_ring (struct bnxt * bp ,
3558
+ struct bnxt_cp_ring_info * cpr )
3559
3559
{
3560
3560
struct bnxt_ring_mem_info * rmem ;
3561
3561
struct bnxt_ring_struct * ring ;
3562
- struct bnxt_cp_ring_info * cpr ;
3563
3562
int rc ;
3564
3563
3565
- cpr = kzalloc (sizeof (* cpr ), GFP_KERNEL );
3566
- if (!cpr )
3567
- return NULL ;
3568
-
3569
3564
rc = bnxt_alloc_cp_arrays (cpr , bp -> cp_nr_pages );
3570
3565
if (rc ) {
3571
3566
bnxt_free_cp_arrays (cpr );
3572
- kfree (cpr );
3573
- return NULL ;
3567
+ return - ENOMEM ;
3574
3568
}
3575
3569
ring = & cpr -> cp_ring_struct ;
3576
3570
rmem = & ring -> ring_mem ;
@@ -3583,10 +3577,8 @@ static struct bnxt_cp_ring_info *bnxt_alloc_cp_sub_ring(struct bnxt *bp)
3583
3577
if (rc ) {
3584
3578
bnxt_free_ring (bp , rmem );
3585
3579
bnxt_free_cp_arrays (cpr );
3586
- kfree (cpr );
3587
- cpr = NULL ;
3588
3580
}
3589
- return cpr ;
3581
+ return rc ;
3590
3582
}
3591
3583
3592
3584
static int bnxt_alloc_cp_rings (struct bnxt * bp )
@@ -3598,7 +3590,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
3598
3590
ulp_base_vec = bnxt_get_ulp_msix_base (bp );
3599
3591
for (i = 0 ; i < bp -> cp_nr_rings ; i ++ ) {
3600
3592
struct bnxt_napi * bnapi = bp -> bnapi [i ];
3601
- struct bnxt_cp_ring_info * cpr ;
3593
+ struct bnxt_cp_ring_info * cpr , * cpr2 ;
3602
3594
struct bnxt_ring_struct * ring ;
3603
3595
3604
3596
if (!bnapi )
@@ -3620,23 +3612,27 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
3620
3612
if (!(bp -> flags & BNXT_FLAG_CHIP_P5 ))
3621
3613
continue ;
3622
3614
3623
- if (i < bp -> rx_nr_rings ) {
3624
- struct bnxt_cp_ring_info * cpr2 =
3625
- bnxt_alloc_cp_sub_ring (bp );
3615
+ cpr -> cp_ring_count = 2 ;
3616
+ cpr -> cp_ring_arr = kcalloc (cpr -> cp_ring_count , sizeof (* cpr ),
3617
+ GFP_KERNEL );
3618
+ if (!cpr -> cp_ring_arr ) {
3619
+ cpr -> cp_ring_count = 0 ;
3620
+ return - ENOMEM ;
3621
+ }
3626
3622
3627
- cpr -> cp_ring_arr [BNXT_RX_HDL ] = cpr2 ;
3628
- if (!cpr2 )
3629
- return - ENOMEM ;
3623
+ if (i < bp -> rx_nr_rings ) {
3624
+ cpr2 = & cpr -> cp_ring_arr [BNXT_RX_HDL ];
3625
+ rc = bnxt_alloc_cp_sub_ring (bp , cpr2 );
3626
+ if (rc )
3627
+ return rc ;
3630
3628
cpr2 -> bnapi = bnapi ;
3631
3629
}
3632
3630
if ((sh && i < bp -> tx_nr_rings ) ||
3633
3631
(!sh && i >= bp -> rx_nr_rings )) {
3634
- struct bnxt_cp_ring_info * cpr2 =
3635
- bnxt_alloc_cp_sub_ring (bp );
3636
-
3637
- cpr -> cp_ring_arr [BNXT_TX_HDL ] = cpr2 ;
3638
- if (!cpr2 )
3639
- return - ENOMEM ;
3632
+ cpr2 = & cpr -> cp_ring_arr [BNXT_TX_HDL ];
3633
+ rc = bnxt_alloc_cp_sub_ring (bp , cpr2 );
3634
+ if (rc )
3635
+ return rc ;
3640
3636
cpr2 -> bnapi = bnapi ;
3641
3637
}
3642
3638
}
@@ -3822,11 +3818,10 @@ static void bnxt_init_cp_rings(struct bnxt *bp)
3822
3818
ring -> fw_ring_id = INVALID_HW_RING_ID ;
3823
3819
cpr -> rx_ring_coal .coal_ticks = bp -> rx_coal .coal_ticks ;
3824
3820
cpr -> rx_ring_coal .coal_bufs = bp -> rx_coal .coal_bufs ;
3825
- for (j = 0 ; j < 2 ; j ++ ) {
3826
- struct bnxt_cp_ring_info * cpr2 = cpr -> cp_ring_arr [j ];
3827
-
3828
- if (!cpr2 )
3829
- continue ;
3821
+ if (!cpr -> cp_ring_arr )
3822
+ continue ;
3823
+ for (j = 0 ; j < cpr -> cp_ring_count ; j ++ ) {
3824
+ struct bnxt_cp_ring_info * cpr2 = & cpr -> cp_ring_arr [j ];
3830
3825
3831
3826
ring = & cpr2 -> cp_ring_struct ;
3832
3827
ring -> fw_ring_id = INVALID_HW_RING_ID ;
@@ -5251,7 +5246,7 @@ static u16 bnxt_cp_ring_for_rx(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
5251
5246
struct bnxt_napi * bnapi = rxr -> bnapi ;
5252
5247
struct bnxt_cp_ring_info * cpr ;
5253
5248
5254
- cpr = bnapi -> cp_ring .cp_ring_arr [BNXT_RX_HDL ];
5249
+ cpr = & bnapi -> cp_ring .cp_ring_arr [BNXT_RX_HDL ];
5255
5250
return cpr -> cp_ring_struct .fw_ring_id ;
5256
5251
} else {
5257
5252
return bnxt_cp_ring_from_grp (bp , & rxr -> rx_ring_struct );
@@ -5264,7 +5259,7 @@ static u16 bnxt_cp_ring_for_tx(struct bnxt *bp, struct bnxt_tx_ring_info *txr)
5264
5259
struct bnxt_napi * bnapi = txr -> bnapi ;
5265
5260
struct bnxt_cp_ring_info * cpr ;
5266
5261
5267
- cpr = bnapi -> cp_ring .cp_ring_arr [BNXT_TX_HDL ];
5262
+ cpr = & bnapi -> cp_ring .cp_ring_arr [BNXT_TX_HDL ];
5268
5263
return cpr -> cp_ring_struct .fw_ring_id ;
5269
5264
} else {
5270
5265
return bnxt_cp_ring_from_grp (bp , & txr -> tx_ring_struct );
@@ -6032,7 +6027,7 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
6032
6027
u32 type2 = HWRM_RING_ALLOC_CMPL ;
6033
6028
6034
6029
cpr = & bnapi -> cp_ring ;
6035
- cpr2 = cpr -> cp_ring_arr [BNXT_TX_HDL ];
6030
+ cpr2 = & cpr -> cp_ring_arr [BNXT_TX_HDL ];
6036
6031
ring = & cpr2 -> cp_ring_struct ;
6037
6032
ring -> handle = BNXT_TX_HDL ;
6038
6033
map_idx = bnapi -> index ;
@@ -6071,7 +6066,7 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
6071
6066
u32 type2 = HWRM_RING_ALLOC_CMPL ;
6072
6067
struct bnxt_cp_ring_info * cpr2 ;
6073
6068
6074
- cpr2 = cpr -> cp_ring_arr [BNXT_RX_HDL ];
6069
+ cpr2 = & cpr -> cp_ring_arr [BNXT_RX_HDL ];
6075
6070
ring = & cpr2 -> cp_ring_struct ;
6076
6071
ring -> handle = BNXT_RX_HDL ;
6077
6072
rc = hwrm_ring_alloc_send_msg (bp , ring , type2 , map_idx );
@@ -6218,18 +6213,16 @@ static void bnxt_hwrm_ring_free(struct bnxt *bp, bool close_path)
6218
6213
struct bnxt_ring_struct * ring ;
6219
6214
int j ;
6220
6215
6221
- for (j = 0 ; j < 2 ; j ++ ) {
6222
- struct bnxt_cp_ring_info * cpr2 = cpr -> cp_ring_arr [j ];
6223
-
6224
- if (cpr2 ) {
6225
- ring = & cpr2 -> cp_ring_struct ;
6226
- if (ring -> fw_ring_id == INVALID_HW_RING_ID )
6227
- continue ;
6228
- hwrm_ring_free_send_msg (bp , ring ,
6229
- RING_FREE_REQ_RING_TYPE_L2_CMPL ,
6230
- INVALID_HW_RING_ID );
6231
- ring -> fw_ring_id = INVALID_HW_RING_ID ;
6232
- }
6216
+ for (j = 0 ; j < cpr -> cp_ring_count && cpr -> cp_ring_arr ; j ++ ) {
6217
+ struct bnxt_cp_ring_info * cpr2 = & cpr -> cp_ring_arr [j ];
6218
+
6219
+ ring = & cpr2 -> cp_ring_struct ;
6220
+ if (ring -> fw_ring_id == INVALID_HW_RING_ID )
6221
+ continue ;
6222
+ hwrm_ring_free_send_msg (bp , ring ,
6223
+ RING_FREE_REQ_RING_TYPE_L2_CMPL ,
6224
+ INVALID_HW_RING_ID );
6225
+ ring -> fw_ring_id = INVALID_HW_RING_ID ;
6233
6226
}
6234
6227
ring = & cpr -> cp_ring_struct ;
6235
6228
if (ring -> fw_ring_id != INVALID_HW_RING_ID ) {
@@ -12005,12 +11998,11 @@ static void bnxt_chk_missed_irq(struct bnxt *bp)
12005
11998
continue ;
12006
11999
12007
12000
cpr = & bnapi -> cp_ring ;
12008
- for (j = 0 ; j < 2 ; j ++ ) {
12009
- struct bnxt_cp_ring_info * cpr2 = cpr -> cp_ring_arr [j ];
12001
+ for (j = 0 ; j < cpr -> cp_ring_count ; j ++ ) {
12002
+ struct bnxt_cp_ring_info * cpr2 = & cpr -> cp_ring_arr [j ];
12010
12003
u32 val [2 ];
12011
12004
12012
- if (!cpr2 || cpr2 -> has_more_work ||
12013
- !bnxt_has_work (bp , cpr2 ))
12005
+ if (cpr2 -> has_more_work || !bnxt_has_work (bp , cpr2 ))
12014
12006
continue ;
12015
12007
12016
12008
if (cpr2 -> cp_raw_cons != cpr2 -> last_cp_raw_cons ) {
0 commit comments