@@ -3421,15 +3421,11 @@ static void bnxt_free_one_rx_agg_ring(struct bnxt *bp, struct bnxt_rx_ring_info
34213421 }
34223422}
34233423
3424- static void bnxt_free_one_rx_ring_skbs (struct bnxt * bp , int ring_nr )
3424+ static void bnxt_free_one_tpa_info_data (struct bnxt * bp ,
3425+ struct bnxt_rx_ring_info * rxr )
34253426{
3426- struct bnxt_rx_ring_info * rxr = & bp -> rx_ring [ring_nr ];
3427- struct bnxt_tpa_idx_map * map ;
34283427 int i ;
34293428
3430- if (!rxr -> rx_tpa )
3431- goto skip_rx_tpa_free ;
3432-
34333429 for (i = 0 ; i < bp -> max_tpa ; i ++ ) {
34343430 struct bnxt_tpa_info * tpa_info = & rxr -> rx_tpa [i ];
34353431 u8 * data = tpa_info -> data ;
@@ -3440,6 +3436,17 @@ static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr)
34403436 tpa_info -> data = NULL ;
34413437 page_pool_free_va (rxr -> head_pool , data , false);
34423438 }
3439+ }
3440+
3441+ static void bnxt_free_one_rx_ring_skbs (struct bnxt * bp ,
3442+ struct bnxt_rx_ring_info * rxr )
3443+ {
3444+ struct bnxt_tpa_idx_map * map ;
3445+
3446+ if (!rxr -> rx_tpa )
3447+ goto skip_rx_tpa_free ;
3448+
3449+ bnxt_free_one_tpa_info_data (bp , rxr );
34433450
34443451skip_rx_tpa_free :
34453452 if (!rxr -> rx_buf_ring )
@@ -3467,7 +3474,7 @@ static void bnxt_free_rx_skbs(struct bnxt *bp)
34673474 return ;
34683475
34693476 for (i = 0 ; i < bp -> rx_nr_rings ; i ++ )
3470- bnxt_free_one_rx_ring_skbs (bp , i );
3477+ bnxt_free_one_rx_ring_skbs (bp , & bp -> rx_ring [ i ] );
34713478}
34723479
34733480static void bnxt_free_skbs (struct bnxt * bp )
@@ -3608,29 +3615,64 @@ static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)
36083615 return 0 ;
36093616}
36103617
3618+ static void bnxt_free_one_tpa_info (struct bnxt * bp ,
3619+ struct bnxt_rx_ring_info * rxr )
3620+ {
3621+ int i ;
3622+
3623+ kfree (rxr -> rx_tpa_idx_map );
3624+ rxr -> rx_tpa_idx_map = NULL ;
3625+ if (rxr -> rx_tpa ) {
3626+ for (i = 0 ; i < bp -> max_tpa ; i ++ ) {
3627+ kfree (rxr -> rx_tpa [i ].agg_arr );
3628+ rxr -> rx_tpa [i ].agg_arr = NULL ;
3629+ }
3630+ }
3631+ kfree (rxr -> rx_tpa );
3632+ rxr -> rx_tpa = NULL ;
3633+ }
3634+
36113635static void bnxt_free_tpa_info (struct bnxt * bp )
36123636{
3613- int i , j ;
3637+ int i ;
36143638
36153639 for (i = 0 ; i < bp -> rx_nr_rings ; i ++ ) {
36163640 struct bnxt_rx_ring_info * rxr = & bp -> rx_ring [i ];
36173641
3618- kfree (rxr -> rx_tpa_idx_map );
3619- rxr -> rx_tpa_idx_map = NULL ;
3620- if (rxr -> rx_tpa ) {
3621- for (j = 0 ; j < bp -> max_tpa ; j ++ ) {
3622- kfree (rxr -> rx_tpa [j ].agg_arr );
3623- rxr -> rx_tpa [j ].agg_arr = NULL ;
3624- }
3625- }
3626- kfree (rxr -> rx_tpa );
3627- rxr -> rx_tpa = NULL ;
3642+ bnxt_free_one_tpa_info (bp , rxr );
36283643 }
36293644}
36303645
3646+ static int bnxt_alloc_one_tpa_info (struct bnxt * bp ,
3647+ struct bnxt_rx_ring_info * rxr )
3648+ {
3649+ struct rx_agg_cmp * agg ;
3650+ int i ;
3651+
3652+ rxr -> rx_tpa = kcalloc (bp -> max_tpa , sizeof (struct bnxt_tpa_info ),
3653+ GFP_KERNEL );
3654+ if (!rxr -> rx_tpa )
3655+ return - ENOMEM ;
3656+
3657+ if (!(bp -> flags & BNXT_FLAG_CHIP_P5_PLUS ))
3658+ return 0 ;
3659+ for (i = 0 ; i < bp -> max_tpa ; i ++ ) {
3660+ agg = kcalloc (MAX_SKB_FRAGS , sizeof (* agg ), GFP_KERNEL );
3661+ if (!agg )
3662+ return - ENOMEM ;
3663+ rxr -> rx_tpa [i ].agg_arr = agg ;
3664+ }
3665+ rxr -> rx_tpa_idx_map = kzalloc (sizeof (* rxr -> rx_tpa_idx_map ),
3666+ GFP_KERNEL );
3667+ if (!rxr -> rx_tpa_idx_map )
3668+ return - ENOMEM ;
3669+
3670+ return 0 ;
3671+ }
3672+
36313673static int bnxt_alloc_tpa_info (struct bnxt * bp )
36323674{
3633- int i , j ;
3675+ int i , rc ;
36343676
36353677 bp -> max_tpa = MAX_TPA ;
36363678 if (bp -> flags & BNXT_FLAG_CHIP_P5_PLUS ) {
@@ -3641,25 +3683,10 @@ static int bnxt_alloc_tpa_info(struct bnxt *bp)
36413683
36423684 for (i = 0 ; i < bp -> rx_nr_rings ; i ++ ) {
36433685 struct bnxt_rx_ring_info * rxr = & bp -> rx_ring [i ];
3644- struct rx_agg_cmp * agg ;
3645-
3646- rxr -> rx_tpa = kcalloc (bp -> max_tpa , sizeof (struct bnxt_tpa_info ),
3647- GFP_KERNEL );
3648- if (!rxr -> rx_tpa )
3649- return - ENOMEM ;
36503686
3651- if (!(bp -> flags & BNXT_FLAG_CHIP_P5_PLUS ))
3652- continue ;
3653- for (j = 0 ; j < bp -> max_tpa ; j ++ ) {
3654- agg = kcalloc (MAX_SKB_FRAGS , sizeof (* agg ), GFP_KERNEL );
3655- if (!agg )
3656- return - ENOMEM ;
3657- rxr -> rx_tpa [j ].agg_arr = agg ;
3658- }
3659- rxr -> rx_tpa_idx_map = kzalloc (sizeof (* rxr -> rx_tpa_idx_map ),
3660- GFP_KERNEL );
3661- if (!rxr -> rx_tpa_idx_map )
3662- return - ENOMEM ;
3687+ rc = bnxt_alloc_one_tpa_info (bp , rxr );
3688+ if (rc )
3689+ return rc ;
36633690 }
36643691 return 0 ;
36653692}
@@ -4268,10 +4295,31 @@ static void bnxt_alloc_one_rx_ring_page(struct bnxt *bp,
42684295 rxr -> rx_agg_prod = prod ;
42694296}
42704297
4298+ static int bnxt_alloc_one_tpa_info_data (struct bnxt * bp ,
4299+ struct bnxt_rx_ring_info * rxr )
4300+ {
4301+ dma_addr_t mapping ;
4302+ u8 * data ;
4303+ int i ;
4304+
4305+ for (i = 0 ; i < bp -> max_tpa ; i ++ ) {
4306+ data = __bnxt_alloc_rx_frag (bp , & mapping , rxr ,
4307+ GFP_KERNEL );
4308+ if (!data )
4309+ return - ENOMEM ;
4310+
4311+ rxr -> rx_tpa [i ].data = data ;
4312+ rxr -> rx_tpa [i ].data_ptr = data + bp -> rx_offset ;
4313+ rxr -> rx_tpa [i ].mapping = mapping ;
4314+ }
4315+
4316+ return 0 ;
4317+ }
4318+
42714319static int bnxt_alloc_one_rx_ring (struct bnxt * bp , int ring_nr )
42724320{
42734321 struct bnxt_rx_ring_info * rxr = & bp -> rx_ring [ring_nr ];
4274- int i ;
4322+ int rc ;
42754323
42764324 bnxt_alloc_one_rx_ring_skb (bp , rxr , ring_nr );
42774325
@@ -4281,19 +4329,9 @@ static int bnxt_alloc_one_rx_ring(struct bnxt *bp, int ring_nr)
42814329 bnxt_alloc_one_rx_ring_page (bp , rxr , ring_nr );
42824330
42834331 if (rxr -> rx_tpa ) {
4284- dma_addr_t mapping ;
4285- u8 * data ;
4286-
4287- for (i = 0 ; i < bp -> max_tpa ; i ++ ) {
4288- data = __bnxt_alloc_rx_frag (bp , & mapping , rxr ,
4289- GFP_KERNEL );
4290- if (!data )
4291- return - ENOMEM ;
4292-
4293- rxr -> rx_tpa [i ].data = data ;
4294- rxr -> rx_tpa [i ].data_ptr = data + bp -> rx_offset ;
4295- rxr -> rx_tpa [i ].mapping = mapping ;
4296- }
4332+ rc = bnxt_alloc_one_tpa_info_data (bp , rxr );
4333+ if (rc )
4334+ return rc ;
42974335 }
42984336 return 0 ;
42994337}
@@ -13663,7 +13701,7 @@ static void bnxt_rx_ring_reset(struct bnxt *bp)
1366313701 bnxt_reset_task (bp , true);
1366413702 break ;
1366513703 }
13666- bnxt_free_one_rx_ring_skbs (bp , i );
13704+ bnxt_free_one_rx_ring_skbs (bp , rxr );
1366713705 rxr -> rx_prod = 0 ;
1366813706 rxr -> rx_agg_prod = 0 ;
1366913707 rxr -> rx_sw_agg_prod = 0 ;
0 commit comments