@@ -211,19 +211,25 @@ static void hns3_vector_gl_rl_init(struct hns3_enet_tqp_vector *tqp_vector,
211
211
tqp_vector -> tx_group .int_gl = HNS3_INT_GL_50K ;
212
212
tqp_vector -> rx_group .int_gl = HNS3_INT_GL_50K ;
213
213
214
- hns3_set_vector_coalesce_tx_gl (tqp_vector ,
215
- tqp_vector -> tx_group .int_gl );
216
- hns3_set_vector_coalesce_rx_gl (tqp_vector ,
217
- tqp_vector -> rx_group .int_gl );
218
-
219
214
/* Default: disable RL */
220
215
h -> kinfo .int_rl_setting = 0 ;
221
- hns3_set_vector_coalesce_rl (tqp_vector , h -> kinfo .int_rl_setting );
222
216
223
217
tqp_vector -> rx_group .flow_level = HNS3_FLOW_LOW ;
224
218
tqp_vector -> tx_group .flow_level = HNS3_FLOW_LOW ;
225
219
}
226
220
221
+ static void hns3_vector_gl_rl_init_hw (struct hns3_enet_tqp_vector * tqp_vector ,
222
+ struct hns3_nic_priv * priv )
223
+ {
224
+ struct hnae3_handle * h = priv -> ae_handle ;
225
+
226
+ hns3_set_vector_coalesce_tx_gl (tqp_vector ,
227
+ tqp_vector -> tx_group .int_gl );
228
+ hns3_set_vector_coalesce_rx_gl (tqp_vector ,
229
+ tqp_vector -> rx_group .int_gl );
230
+ hns3_set_vector_coalesce_rl (tqp_vector , h -> kinfo .int_rl_setting );
231
+ }
232
+
227
233
static int hns3_nic_set_real_num_queue (struct net_device * netdev )
228
234
{
229
235
struct hnae3_handle * h = hns3_get_handle (netdev );
@@ -2625,32 +2631,18 @@ static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
2625
2631
struct hnae3_ring_chain_node vector_ring_chain ;
2626
2632
struct hnae3_handle * h = priv -> ae_handle ;
2627
2633
struct hns3_enet_tqp_vector * tqp_vector ;
2628
- struct hnae3_vector_info * vector ;
2629
- struct pci_dev * pdev = h -> pdev ;
2630
- u16 tqp_num = h -> kinfo .num_tqps ;
2631
- u16 vector_num ;
2632
2634
int ret = 0 ;
2633
2635
u16 i ;
2634
2636
2635
- /* RSS size, cpu online and vector_num should be the same */
2636
- /* Should consider 2p/4p later */
2637
- vector_num = min_t (u16 , num_online_cpus (), tqp_num );
2638
- vector = devm_kcalloc (& pdev -> dev , vector_num , sizeof (* vector ),
2639
- GFP_KERNEL );
2640
- if (!vector )
2641
- return - ENOMEM ;
2642
-
2643
- vector_num = h -> ae_algo -> ops -> get_vector (h , vector_num , vector );
2644
-
2645
- priv -> vector_num = vector_num ;
2646
- priv -> tqp_vector = (struct hns3_enet_tqp_vector * )
2647
- devm_kcalloc (& pdev -> dev , vector_num , sizeof (* priv -> tqp_vector ),
2648
- GFP_KERNEL );
2649
- if (!priv -> tqp_vector )
2650
- return - ENOMEM ;
2637
+ for (i = 0 ; i < priv -> vector_num ; i ++ ) {
2638
+ tqp_vector = & priv -> tqp_vector [i ];
2639
+ hns3_vector_gl_rl_init_hw (tqp_vector , priv );
2640
+ tqp_vector -> num_tqps = 0 ;
2641
+ }
2651
2642
2652
- for (i = 0 ; i < tqp_num ; i ++ ) {
2653
- u16 vector_i = i % vector_num ;
2643
+ for (i = 0 ; i < h -> kinfo .num_tqps ; i ++ ) {
2644
+ u16 vector_i = i % priv -> vector_num ;
2645
+ u16 tqp_num = h -> kinfo .num_tqps ;
2654
2646
2655
2647
tqp_vector = & priv -> tqp_vector [vector_i ];
2656
2648
@@ -2660,52 +2652,94 @@ static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
2660
2652
hns3_add_ring_to_group (& tqp_vector -> rx_group ,
2661
2653
priv -> ring_data [i + tqp_num ].ring );
2662
2654
2663
- tqp_vector -> idx = vector_i ;
2664
- tqp_vector -> mask_addr = vector [vector_i ].io_addr ;
2665
- tqp_vector -> vector_irq = vector [vector_i ].vector ;
2666
- tqp_vector -> num_tqps ++ ;
2667
-
2668
2655
priv -> ring_data [i ].ring -> tqp_vector = tqp_vector ;
2669
2656
priv -> ring_data [i + tqp_num ].ring -> tqp_vector = tqp_vector ;
2657
+ tqp_vector -> num_tqps ++ ;
2670
2658
}
2671
2659
2672
- for (i = 0 ; i < vector_num ; i ++ ) {
2660
+ for (i = 0 ; i < priv -> vector_num ; i ++ ) {
2673
2661
tqp_vector = & priv -> tqp_vector [i ];
2674
2662
2675
2663
tqp_vector -> rx_group .total_bytes = 0 ;
2676
2664
tqp_vector -> rx_group .total_packets = 0 ;
2677
2665
tqp_vector -> tx_group .total_bytes = 0 ;
2678
2666
tqp_vector -> tx_group .total_packets = 0 ;
2679
- hns3_vector_gl_rl_init (tqp_vector , priv );
2680
2667
tqp_vector -> handle = h ;
2681
2668
2682
2669
ret = hns3_get_vector_ring_chain (tqp_vector ,
2683
2670
& vector_ring_chain );
2684
2671
if (ret )
2685
- goto out ;
2672
+ return ret ;
2686
2673
2687
2674
ret = h -> ae_algo -> ops -> map_ring_to_vector (h ,
2688
2675
tqp_vector -> vector_irq , & vector_ring_chain );
2689
- if (ret )
2690
- goto out ;
2691
2676
2692
2677
hns3_free_vector_ring_chain (tqp_vector , & vector_ring_chain );
2693
2678
2679
+ if (ret )
2680
+ return ret ;
2681
+
2694
2682
netif_napi_add (priv -> netdev , & tqp_vector -> napi ,
2695
2683
hns3_nic_common_poll , NAPI_POLL_WEIGHT );
2696
2684
}
2697
2685
2686
+ return 0 ;
2687
+ }
2688
+
2689
+ static int hns3_nic_alloc_vector_data (struct hns3_nic_priv * priv )
2690
+ {
2691
+ struct hnae3_handle * h = priv -> ae_handle ;
2692
+ struct hns3_enet_tqp_vector * tqp_vector ;
2693
+ struct hnae3_vector_info * vector ;
2694
+ struct pci_dev * pdev = h -> pdev ;
2695
+ u16 tqp_num = h -> kinfo .num_tqps ;
2696
+ u16 vector_num ;
2697
+ int ret = 0 ;
2698
+ u16 i ;
2699
+
2700
+ /* RSS size, cpu online and vector_num should be the same */
2701
+ /* Should consider 2p/4p later */
2702
+ vector_num = min_t (u16 , num_online_cpus (), tqp_num );
2703
+ vector = devm_kcalloc (& pdev -> dev , vector_num , sizeof (* vector ),
2704
+ GFP_KERNEL );
2705
+ if (!vector )
2706
+ return - ENOMEM ;
2707
+
2708
+ vector_num = h -> ae_algo -> ops -> get_vector (h , vector_num , vector );
2709
+
2710
+ priv -> vector_num = vector_num ;
2711
+ priv -> tqp_vector = (struct hns3_enet_tqp_vector * )
2712
+ devm_kcalloc (& pdev -> dev , vector_num , sizeof (* priv -> tqp_vector ),
2713
+ GFP_KERNEL );
2714
+ if (!priv -> tqp_vector ) {
2715
+ ret = - ENOMEM ;
2716
+ goto out ;
2717
+ }
2718
+
2719
+ for (i = 0 ; i < priv -> vector_num ; i ++ ) {
2720
+ tqp_vector = & priv -> tqp_vector [i ];
2721
+ tqp_vector -> idx = i ;
2722
+ tqp_vector -> mask_addr = vector [i ].io_addr ;
2723
+ tqp_vector -> vector_irq = vector [i ].vector ;
2724
+ hns3_vector_gl_rl_init (tqp_vector , priv );
2725
+ }
2726
+
2698
2727
out :
2699
2728
devm_kfree (& pdev -> dev , vector );
2700
2729
return ret ;
2701
2730
}
2702
2731
2732
+ static void hns3_clear_ring_group (struct hns3_enet_ring_group * group )
2733
+ {
2734
+ group -> ring = NULL ;
2735
+ group -> count = 0 ;
2736
+ }
2737
+
2703
2738
static int hns3_nic_uninit_vector_data (struct hns3_nic_priv * priv )
2704
2739
{
2705
2740
struct hnae3_ring_chain_node vector_ring_chain ;
2706
2741
struct hnae3_handle * h = priv -> ae_handle ;
2707
2742
struct hns3_enet_tqp_vector * tqp_vector ;
2708
- struct pci_dev * pdev = h -> pdev ;
2709
2743
int i , ret ;
2710
2744
2711
2745
for (i = 0 ; i < priv -> vector_num ; i ++ ) {
@@ -2736,12 +2770,30 @@ static int hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)
2736
2770
}
2737
2771
2738
2772
priv -> ring_data [i ].ring -> irq_init_flag = HNS3_VECTOR_NOT_INITED ;
2739
-
2773
+ hns3_clear_ring_group (& tqp_vector -> rx_group );
2774
+ hns3_clear_ring_group (& tqp_vector -> tx_group );
2740
2775
netif_napi_del (& priv -> tqp_vector [i ].napi );
2741
2776
}
2742
2777
2743
- devm_kfree (& pdev -> dev , priv -> tqp_vector );
2778
+ return 0 ;
2779
+ }
2780
+
2781
+ static int hns3_nic_dealloc_vector_data (struct hns3_nic_priv * priv )
2782
+ {
2783
+ struct hnae3_handle * h = priv -> ae_handle ;
2784
+ struct pci_dev * pdev = h -> pdev ;
2785
+ int i , ret ;
2786
+
2787
+ for (i = 0 ; i < priv -> vector_num ; i ++ ) {
2788
+ struct hns3_enet_tqp_vector * tqp_vector ;
2789
+
2790
+ tqp_vector = & priv -> tqp_vector [i ];
2791
+ ret = h -> ae_algo -> ops -> put_vector (h , tqp_vector -> vector_irq );
2792
+ if (ret )
2793
+ return ret ;
2794
+ }
2744
2795
2796
+ devm_kfree (& pdev -> dev , priv -> tqp_vector );
2745
2797
return 0 ;
2746
2798
}
2747
2799
@@ -3057,6 +3109,12 @@ static int hns3_client_init(struct hnae3_handle *handle)
3057
3109
goto out_get_ring_cfg ;
3058
3110
}
3059
3111
3112
+ ret = hns3_nic_alloc_vector_data (priv );
3113
+ if (ret ) {
3114
+ ret = - ENOMEM ;
3115
+ goto out_alloc_vector_data ;
3116
+ }
3117
+
3060
3118
ret = hns3_nic_init_vector_data (priv );
3061
3119
if (ret ) {
3062
3120
ret = - ENOMEM ;
@@ -3085,8 +3143,10 @@ static int hns3_client_init(struct hnae3_handle *handle)
3085
3143
out_reg_netdev_fail :
3086
3144
out_init_ring_data :
3087
3145
(void )hns3_nic_uninit_vector_data (priv );
3088
- priv -> ring_data = NULL ;
3089
3146
out_init_vector_data :
3147
+ hns3_nic_dealloc_vector_data (priv );
3148
+ out_alloc_vector_data :
3149
+ priv -> ring_data = NULL ;
3090
3150
out_get_ring_cfg :
3091
3151
priv -> ae_handle = NULL ;
3092
3152
free_netdev (netdev );
@@ -3106,6 +3166,10 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
3106
3166
if (ret )
3107
3167
netdev_err (netdev , "uninit vector error\n" );
3108
3168
3169
+ ret = hns3_nic_dealloc_vector_data (priv );
3170
+ if (ret )
3171
+ netdev_err (netdev , "dealloc vector error\n" );
3172
+
3109
3173
ret = hns3_uninit_all_ring (priv );
3110
3174
if (ret )
3111
3175
netdev_err (netdev , "uninit ring error\n" );
@@ -3363,6 +3427,10 @@ static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num)
3363
3427
if (ret )
3364
3428
return ret ;
3365
3429
3430
+ ret = hns3_nic_alloc_vector_data (priv );
3431
+ if (ret )
3432
+ goto err_alloc_vector ;
3433
+
3366
3434
ret = hns3_nic_init_vector_data (priv );
3367
3435
if (ret )
3368
3436
goto err_uninit_vector ;
@@ -3377,6 +3445,8 @@ static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num)
3377
3445
hns3_put_ring_config (priv );
3378
3446
err_uninit_vector :
3379
3447
hns3_nic_uninit_vector_data (priv );
3448
+ err_alloc_vector :
3449
+ hns3_nic_dealloc_vector_data (priv );
3380
3450
return ret ;
3381
3451
}
3382
3452
@@ -3424,6 +3494,8 @@ int hns3_set_channels(struct net_device *netdev,
3424
3494
goto open_netdev ;
3425
3495
}
3426
3496
3497
+ hns3_nic_dealloc_vector_data (priv );
3498
+
3427
3499
hns3_uninit_all_ring (priv );
3428
3500
hns3_put_ring_config (priv );
3429
3501
0 commit comments