@@ -2995,6 +2995,92 @@ int enetc_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
2995
2995
}
2996
2996
EXPORT_SYMBOL_GPL (enetc_ioctl );
2997
2997
2998
+ static int enetc_int_vector_init (struct enetc_ndev_priv * priv , int i ,
2999
+ int v_tx_rings )
3000
+ {
3001
+ struct enetc_int_vector * v ;
3002
+ struct enetc_bdr * bdr ;
3003
+ int j , err ;
3004
+
3005
+ v = kzalloc (struct_size (v , tx_ring , v_tx_rings ), GFP_KERNEL );
3006
+ if (!v )
3007
+ return - ENOMEM ;
3008
+
3009
+ priv -> int_vector [i ] = v ;
3010
+ bdr = & v -> rx_ring ;
3011
+ bdr -> index = i ;
3012
+ bdr -> ndev = priv -> ndev ;
3013
+ bdr -> dev = priv -> dev ;
3014
+ bdr -> bd_count = priv -> rx_bd_count ;
3015
+ bdr -> buffer_offset = ENETC_RXB_PAD ;
3016
+ priv -> rx_ring [i ] = bdr ;
3017
+
3018
+ err = xdp_rxq_info_reg (& bdr -> xdp .rxq , priv -> ndev , i , 0 );
3019
+ if (err )
3020
+ goto free_vector ;
3021
+
3022
+ err = xdp_rxq_info_reg_mem_model (& bdr -> xdp .rxq , MEM_TYPE_PAGE_SHARED ,
3023
+ NULL );
3024
+ if (err ) {
3025
+ xdp_rxq_info_unreg (& bdr -> xdp .rxq );
3026
+ goto free_vector ;
3027
+ }
3028
+
3029
+ /* init defaults for adaptive IC */
3030
+ if (priv -> ic_mode & ENETC_IC_RX_ADAPTIVE ) {
3031
+ v -> rx_ictt = 0x1 ;
3032
+ v -> rx_dim_en = true;
3033
+ }
3034
+
3035
+ INIT_WORK (& v -> rx_dim .work , enetc_rx_dim_work );
3036
+ netif_napi_add (priv -> ndev , & v -> napi , enetc_poll );
3037
+ v -> count_tx_rings = v_tx_rings ;
3038
+
3039
+ for (j = 0 ; j < v_tx_rings ; j ++ ) {
3040
+ int idx ;
3041
+
3042
+ /* default tx ring mapping policy */
3043
+ idx = priv -> bdr_int_num * j + i ;
3044
+ __set_bit (idx , & v -> tx_rings_map );
3045
+ bdr = & v -> tx_ring [j ];
3046
+ bdr -> index = idx ;
3047
+ bdr -> ndev = priv -> ndev ;
3048
+ bdr -> dev = priv -> dev ;
3049
+ bdr -> bd_count = priv -> tx_bd_count ;
3050
+ priv -> tx_ring [idx ] = bdr ;
3051
+ }
3052
+
3053
+ return 0 ;
3054
+
3055
+ free_vector :
3056
+ priv -> rx_ring [i ] = NULL ;
3057
+ priv -> int_vector [i ] = NULL ;
3058
+ kfree (v );
3059
+
3060
+ return err ;
3061
+ }
3062
+
3063
+ static void enetc_int_vector_destroy (struct enetc_ndev_priv * priv , int i )
3064
+ {
3065
+ struct enetc_int_vector * v = priv -> int_vector [i ];
3066
+ struct enetc_bdr * rx_ring = & v -> rx_ring ;
3067
+ int j , tx_ring_index ;
3068
+
3069
+ xdp_rxq_info_unreg_mem_model (& rx_ring -> xdp .rxq );
3070
+ xdp_rxq_info_unreg (& rx_ring -> xdp .rxq );
3071
+ netif_napi_del (& v -> napi );
3072
+ cancel_work_sync (& v -> rx_dim .work );
3073
+
3074
+ for (j = 0 ; j < v -> count_tx_rings ; j ++ ) {
3075
+ tx_ring_index = priv -> bdr_int_num * j + i ;
3076
+ priv -> tx_ring [tx_ring_index ] = NULL ;
3077
+ }
3078
+
3079
+ priv -> rx_ring [i ] = NULL ;
3080
+ priv -> int_vector [i ] = NULL ;
3081
+ kfree (v );
3082
+ }
3083
+
2998
3084
int enetc_alloc_msix (struct enetc_ndev_priv * priv )
2999
3085
{
3000
3086
struct pci_dev * pdev = priv -> si -> pdev ;
@@ -3017,62 +3103,9 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
3017
3103
v_tx_rings = priv -> num_tx_rings / priv -> bdr_int_num ;
3018
3104
3019
3105
for (i = 0 ; i < priv -> bdr_int_num ; i ++ ) {
3020
- struct enetc_int_vector * v ;
3021
- struct enetc_bdr * bdr ;
3022
- int j ;
3023
-
3024
- v = kzalloc (struct_size (v , tx_ring , v_tx_rings ), GFP_KERNEL );
3025
- if (!v ) {
3026
- err = - ENOMEM ;
3027
- goto fail ;
3028
- }
3029
-
3030
- priv -> int_vector [i ] = v ;
3031
-
3032
- bdr = & v -> rx_ring ;
3033
- bdr -> index = i ;
3034
- bdr -> ndev = priv -> ndev ;
3035
- bdr -> dev = priv -> dev ;
3036
- bdr -> bd_count = priv -> rx_bd_count ;
3037
- bdr -> buffer_offset = ENETC_RXB_PAD ;
3038
- priv -> rx_ring [i ] = bdr ;
3039
-
3040
- err = xdp_rxq_info_reg (& bdr -> xdp .rxq , priv -> ndev , i , 0 );
3041
- if (err ) {
3042
- kfree (v );
3043
- goto fail ;
3044
- }
3045
-
3046
- err = xdp_rxq_info_reg_mem_model (& bdr -> xdp .rxq ,
3047
- MEM_TYPE_PAGE_SHARED , NULL );
3048
- if (err ) {
3049
- xdp_rxq_info_unreg (& bdr -> xdp .rxq );
3050
- kfree (v );
3106
+ err = enetc_int_vector_init (priv , i , v_tx_rings );
3107
+ if (err )
3051
3108
goto fail ;
3052
- }
3053
-
3054
- /* init defaults for adaptive IC */
3055
- if (priv -> ic_mode & ENETC_IC_RX_ADAPTIVE ) {
3056
- v -> rx_ictt = 0x1 ;
3057
- v -> rx_dim_en = true;
3058
- }
3059
- INIT_WORK (& v -> rx_dim .work , enetc_rx_dim_work );
3060
- netif_napi_add (priv -> ndev , & v -> napi , enetc_poll );
3061
- v -> count_tx_rings = v_tx_rings ;
3062
-
3063
- for (j = 0 ; j < v_tx_rings ; j ++ ) {
3064
- int idx ;
3065
-
3066
- /* default tx ring mapping policy */
3067
- idx = priv -> bdr_int_num * j + i ;
3068
- __set_bit (idx , & v -> tx_rings_map );
3069
- bdr = & v -> tx_ring [j ];
3070
- bdr -> index = idx ;
3071
- bdr -> ndev = priv -> ndev ;
3072
- bdr -> dev = priv -> dev ;
3073
- bdr -> bd_count = priv -> tx_bd_count ;
3074
- priv -> tx_ring [idx ] = bdr ;
3075
- }
3076
3109
}
3077
3110
3078
3111
num_stack_tx_queues = enetc_num_stack_tx_queues (priv );
@@ -3092,16 +3125,8 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
3092
3125
return 0 ;
3093
3126
3094
3127
fail :
3095
- while (i -- ) {
3096
- struct enetc_int_vector * v = priv -> int_vector [i ];
3097
- struct enetc_bdr * rx_ring = & v -> rx_ring ;
3098
-
3099
- xdp_rxq_info_unreg_mem_model (& rx_ring -> xdp .rxq );
3100
- xdp_rxq_info_unreg (& rx_ring -> xdp .rxq );
3101
- netif_napi_del (& v -> napi );
3102
- cancel_work_sync (& v -> rx_dim .work );
3103
- kfree (v );
3104
- }
3128
+ while (i -- )
3129
+ enetc_int_vector_destroy (priv , i );
3105
3130
3106
3131
pci_free_irq_vectors (pdev );
3107
3132
@@ -3113,26 +3138,8 @@ void enetc_free_msix(struct enetc_ndev_priv *priv)
3113
3138
{
3114
3139
int i ;
3115
3140
3116
- for (i = 0 ; i < priv -> bdr_int_num ; i ++ ) {
3117
- struct enetc_int_vector * v = priv -> int_vector [i ];
3118
- struct enetc_bdr * rx_ring = & v -> rx_ring ;
3119
-
3120
- xdp_rxq_info_unreg_mem_model (& rx_ring -> xdp .rxq );
3121
- xdp_rxq_info_unreg (& rx_ring -> xdp .rxq );
3122
- netif_napi_del (& v -> napi );
3123
- cancel_work_sync (& v -> rx_dim .work );
3124
- }
3125
-
3126
- for (i = 0 ; i < priv -> num_rx_rings ; i ++ )
3127
- priv -> rx_ring [i ] = NULL ;
3128
-
3129
- for (i = 0 ; i < priv -> num_tx_rings ; i ++ )
3130
- priv -> tx_ring [i ] = NULL ;
3131
-
3132
- for (i = 0 ; i < priv -> bdr_int_num ; i ++ ) {
3133
- kfree (priv -> int_vector [i ]);
3134
- priv -> int_vector [i ] = NULL ;
3135
- }
3141
+ for (i = 0 ; i < priv -> bdr_int_num ; i ++ )
3142
+ enetc_int_vector_destroy (priv , i );
3136
3143
3137
3144
/* disable all MSIX for this device */
3138
3145
pci_free_irq_vectors (priv -> si -> pdev );
0 commit comments