@@ -858,7 +858,7 @@ static int mlx5e_create_cq(struct mlx5e_channel *c,
858
858
mcq -> comp = mlx5e_completion_event ;
859
859
mcq -> event = mlx5e_cq_error_event ;
860
860
mcq -> irqn = irqn ;
861
- mcq -> uar = & priv -> cq_uar ;
861
+ mcq -> uar = & mdev -> mlx5e_res . cq_uar ;
862
862
863
863
for (i = 0 ; i < mlx5_cqwq_get_size (& cq -> wq ); i ++ ) {
864
864
struct mlx5_cqe64 * cqe = mlx5_cqwq_get_wqe (& cq -> wq , i );
@@ -1136,7 +1136,7 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
1136
1136
c -> cpu = cpu ;
1137
1137
c -> pdev = & priv -> mdev -> pdev -> dev ;
1138
1138
c -> netdev = priv -> netdev ;
1139
- c -> mkey_be = cpu_to_be32 (priv -> mkey .key );
1139
+ c -> mkey_be = cpu_to_be32 (priv -> mdev -> mlx5e_res . mkey .key );
1140
1140
c -> num_tc = priv -> params .num_tc ;
1141
1141
1142
1142
if (priv -> params .rx_am_enabled )
@@ -1252,7 +1252,7 @@ static void mlx5e_build_rq_param(struct mlx5e_priv *priv,
1252
1252
MLX5_SET (wq , wq , end_padding_mode , MLX5_WQ_END_PAD_MODE_ALIGN );
1253
1253
MLX5_SET (wq , wq , log_wq_stride , ilog2 (sizeof (struct mlx5e_rx_wqe )));
1254
1254
MLX5_SET (wq , wq , log_wq_sz , priv -> params .log_rq_size );
1255
- MLX5_SET (wq , wq , pd , priv -> pdn );
1255
+ MLX5_SET (wq , wq , pd , priv -> mdev -> mlx5e_res . pdn );
1256
1256
MLX5_SET (rqc , rqc , counter_set_id , priv -> q_counter );
1257
1257
1258
1258
param -> wq .buf_numa_node = dev_to_node (& priv -> mdev -> pdev -> dev );
@@ -1277,7 +1277,7 @@ static void mlx5e_build_sq_param_common(struct mlx5e_priv *priv,
1277
1277
void * wq = MLX5_ADDR_OF (sqc , sqc , wq );
1278
1278
1279
1279
MLX5_SET (wq , wq , log_wq_stride , ilog2 (MLX5_SEND_WQE_BB ));
1280
- MLX5_SET (wq , wq , pd , priv -> pdn );
1280
+ MLX5_SET (wq , wq , pd , priv -> mdev -> mlx5e_res . pdn );
1281
1281
1282
1282
param -> wq .buf_numa_node = dev_to_node (& priv -> mdev -> pdev -> dev );
1283
1283
}
@@ -1299,7 +1299,7 @@ static void mlx5e_build_common_cq_param(struct mlx5e_priv *priv,
1299
1299
{
1300
1300
void * cqc = param -> cqc ;
1301
1301
1302
- MLX5_SET (cqc , cqc , uar_page , priv -> cq_uar .index );
1302
+ MLX5_SET (cqc , cqc , uar_page , priv -> mdev -> mlx5e_res . cq_uar .index );
1303
1303
}
1304
1304
1305
1305
static void mlx5e_build_rx_cq_param (struct mlx5e_priv * priv ,
@@ -1920,7 +1920,7 @@ static int mlx5e_create_drop_cq(struct mlx5e_priv *priv,
1920
1920
mcq -> comp = mlx5e_completion_event ;
1921
1921
mcq -> event = mlx5e_cq_error_event ;
1922
1922
mcq -> irqn = irqn ;
1923
- mcq -> uar = & priv -> cq_uar ;
1923
+ mcq -> uar = & mdev -> mlx5e_res . cq_uar ;
1924
1924
1925
1925
cq -> priv = priv ;
1926
1926
@@ -1986,7 +1986,7 @@ static int mlx5e_create_tis(struct mlx5e_priv *priv, int tc)
1986
1986
memset (in , 0 , sizeof (in ));
1987
1987
1988
1988
MLX5_SET (tisc , tisc , prio , tc << 1 );
1989
- MLX5_SET (tisc , tisc , transport_domain , priv -> tdn );
1989
+ MLX5_SET (tisc , tisc , transport_domain , mdev -> mlx5e_res . td . tdn );
1990
1990
1991
1991
return mlx5_core_create_tis (mdev , in , sizeof (in ), & priv -> tisn [tc ]);
1992
1992
}
@@ -2029,7 +2029,7 @@ static void mlx5e_build_indir_tir_ctx(struct mlx5e_priv *priv, u32 *tirc,
2029
2029
{
2030
2030
void * hfso = MLX5_ADDR_OF (tirc , tirc , rx_hash_field_selector_outer );
2031
2031
2032
- MLX5_SET (tirc , tirc , transport_domain , priv -> tdn );
2032
+ MLX5_SET (tirc , tirc , transport_domain , priv -> mdev -> mlx5e_res . td . tdn );
2033
2033
2034
2034
#define MLX5_HASH_IP (MLX5_HASH_FIELD_SEL_SRC_IP |\
2035
2035
MLX5_HASH_FIELD_SEL_DST_IP)
@@ -2136,7 +2136,7 @@ static void mlx5e_build_indir_tir_ctx(struct mlx5e_priv *priv, u32 *tirc,
2136
2136
static void mlx5e_build_direct_tir_ctx (struct mlx5e_priv * priv , u32 * tirc ,
2137
2137
u32 rqtn )
2138
2138
{
2139
- MLX5_SET (tirc , tirc , transport_domain , priv -> tdn );
2139
+ MLX5_SET (tirc , tirc , transport_domain , priv -> mdev -> mlx5e_res . td . tdn );
2140
2140
2141
2141
mlx5e_build_tir_ctx_lro (tirc , priv );
2142
2142
@@ -3082,31 +3082,6 @@ static void mlx5e_build_netdev(struct net_device *netdev)
3082
3082
mlx5e_set_netdev_dev_addr (netdev );
3083
3083
}
3084
3084
3085
- static int mlx5e_create_mkey (struct mlx5e_priv * priv , u32 pdn ,
3086
- struct mlx5_core_mkey * mkey )
3087
- {
3088
- struct mlx5_core_dev * mdev = priv -> mdev ;
3089
- struct mlx5_create_mkey_mbox_in * in ;
3090
- int err ;
3091
-
3092
- in = mlx5_vzalloc (sizeof (* in ));
3093
- if (!in )
3094
- return - ENOMEM ;
3095
-
3096
- in -> seg .flags = MLX5_PERM_LOCAL_WRITE |
3097
- MLX5_PERM_LOCAL_READ |
3098
- MLX5_ACCESS_MODE_PA ;
3099
- in -> seg .flags_pd = cpu_to_be32 (pdn | MLX5_MKEY_LEN64 );
3100
- in -> seg .qpn_mkey7_0 = cpu_to_be32 (0xffffff << 8 );
3101
-
3102
- err = mlx5_core_create_mkey (mdev , mkey , in , sizeof (* in ), NULL , NULL ,
3103
- NULL );
3104
-
3105
- kvfree (in );
3106
-
3107
- return err ;
3108
- }
3109
-
3110
3085
static void mlx5e_create_q_counter (struct mlx5e_priv * priv )
3111
3086
{
3112
3087
struct mlx5_core_dev * mdev = priv -> mdev ;
@@ -3149,7 +3124,7 @@ static int mlx5e_create_umr_mkey(struct mlx5e_priv *priv)
3149
3124
MLX5_ACCESS_MODE_MTT ;
3150
3125
3151
3126
mkc -> qpn_mkey7_0 = cpu_to_be32 (0xffffff << 8 );
3152
- mkc -> flags_pd = cpu_to_be32 (priv -> pdn );
3127
+ mkc -> flags_pd = cpu_to_be32 (mdev -> mlx5e_res . pdn );
3153
3128
mkc -> len = cpu_to_be64 (npages << PAGE_SHIFT );
3154
3129
mkc -> xlt_oct_size = cpu_to_be32 (mlx5e_get_mtt_octw (npages ));
3155
3130
mkc -> log2_page_size = PAGE_SHIFT ;
@@ -3169,9 +3144,6 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev)
3169
3144
int nch = mlx5e_get_max_num_channels (mdev );
3170
3145
int err ;
3171
3146
3172
- if (mlx5e_check_required_hca_cap (mdev ))
3173
- return NULL ;
3174
-
3175
3147
netdev = alloc_etherdev_mqs (sizeof (struct mlx5e_priv ),
3176
3148
nch * MLX5E_MAX_NUM_TC ,
3177
3149
nch );
@@ -3191,34 +3163,10 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev)
3191
3163
if (!priv -> wq )
3192
3164
goto err_free_netdev ;
3193
3165
3194
- err = mlx5_alloc_map_uar (mdev , & priv -> cq_uar , false);
3195
- if (err ) {
3196
- mlx5_core_err (mdev , "alloc_map uar failed, %d\n" , err );
3197
- goto err_destroy_wq ;
3198
- }
3199
-
3200
- err = mlx5_core_alloc_pd (mdev , & priv -> pdn );
3201
- if (err ) {
3202
- mlx5_core_err (mdev , "alloc pd failed, %d\n" , err );
3203
- goto err_unmap_free_uar ;
3204
- }
3205
-
3206
- err = mlx5_core_alloc_transport_domain (mdev , & priv -> tdn );
3207
- if (err ) {
3208
- mlx5_core_err (mdev , "alloc td failed, %d\n" , err );
3209
- goto err_dealloc_pd ;
3210
- }
3211
-
3212
- err = mlx5e_create_mkey (priv , priv -> pdn , & priv -> mkey );
3213
- if (err ) {
3214
- mlx5_core_err (mdev , "create mkey failed, %d\n" , err );
3215
- goto err_dealloc_transport_domain ;
3216
- }
3217
-
3218
3166
err = mlx5e_create_umr_mkey (priv );
3219
3167
if (err ) {
3220
3168
mlx5_core_err (mdev , "create umr mkey failed, %d\n" , err );
3221
- goto err_destroy_mkey ;
3169
+ goto err_destroy_wq ;
3222
3170
}
3223
3171
3224
3172
err = mlx5e_create_tises (priv );
@@ -3304,18 +3252,6 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev)
3304
3252
err_destroy_umr_mkey :
3305
3253
mlx5_core_destroy_mkey (mdev , & priv -> umr_mkey );
3306
3254
3307
- err_destroy_mkey :
3308
- mlx5_core_destroy_mkey (mdev , & priv -> mkey );
3309
-
3310
- err_dealloc_transport_domain :
3311
- mlx5_core_dealloc_transport_domain (mdev , priv -> tdn );
3312
-
3313
- err_dealloc_pd :
3314
- mlx5_core_dealloc_pd (mdev , priv -> pdn );
3315
-
3316
- err_unmap_free_uar :
3317
- mlx5_unmap_free_uar (mdev , & priv -> cq_uar );
3318
-
3319
3255
err_destroy_wq :
3320
3256
destroy_workqueue (priv -> wq );
3321
3257
@@ -3325,9 +3261,27 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev)
3325
3261
return NULL ;
3326
3262
}
3327
3263
3328
- static void mlx5e_destroy_netdev (struct mlx5_core_dev * mdev , void * vpriv )
3264
+ static void * mlx5e_add (struct mlx5_core_dev * mdev )
3265
+ {
3266
+ void * ret ;
3267
+
3268
+ if (mlx5e_check_required_hca_cap (mdev ))
3269
+ return NULL ;
3270
+
3271
+ if (mlx5e_create_mdev_resources (mdev ))
3272
+ return NULL ;
3273
+
3274
+ ret = mlx5e_create_netdev (mdev );
3275
+ if (!ret ) {
3276
+ mlx5e_destroy_mdev_resources (mdev );
3277
+ return NULL ;
3278
+ }
3279
+ return ret ;
3280
+ }
3281
+
3282
+ static void mlx5e_destroy_netdev (struct mlx5_core_dev * mdev ,
3283
+ struct mlx5e_priv * priv )
3329
3284
{
3330
- struct mlx5e_priv * priv = vpriv ;
3331
3285
struct net_device * netdev = priv -> netdev ;
3332
3286
3333
3287
set_bit (MLX5E_STATE_DESTROYING , & priv -> state );
@@ -3351,17 +3305,21 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv)
3351
3305
mlx5e_close_drop_rq (priv );
3352
3306
mlx5e_destroy_tises (priv );
3353
3307
mlx5_core_destroy_mkey (priv -> mdev , & priv -> umr_mkey );
3354
- mlx5_core_destroy_mkey (priv -> mdev , & priv -> mkey );
3355
- mlx5_core_dealloc_transport_domain (priv -> mdev , priv -> tdn );
3356
- mlx5_core_dealloc_pd (priv -> mdev , priv -> pdn );
3357
- mlx5_unmap_free_uar (priv -> mdev , & priv -> cq_uar );
3358
3308
cancel_delayed_work_sync (& priv -> update_stats_work );
3359
3309
destroy_workqueue (priv -> wq );
3360
3310
3361
3311
if (!test_bit (MLX5_INTERFACE_STATE_SHUTDOWN , & mdev -> intf_state ))
3362
3312
free_netdev (netdev );
3363
3313
}
3364
3314
3315
+ static void mlx5e_remove (struct mlx5_core_dev * mdev , void * vpriv )
3316
+ {
3317
+ struct mlx5e_priv * priv = vpriv ;
3318
+
3319
+ mlx5e_destroy_netdev (mdev , priv );
3320
+ mlx5e_destroy_mdev_resources (mdev );
3321
+ }
3322
+
3365
3323
static void * mlx5e_get_netdev (void * vpriv )
3366
3324
{
3367
3325
struct mlx5e_priv * priv = vpriv ;
@@ -3370,8 +3328,8 @@ static void *mlx5e_get_netdev(void *vpriv)
3370
3328
}
3371
3329
3372
3330
static struct mlx5_interface mlx5e_interface = {
3373
- .add = mlx5e_create_netdev ,
3374
- .remove = mlx5e_destroy_netdev ,
3331
+ .add = mlx5e_add ,
3332
+ .remove = mlx5e_remove ,
3375
3333
.event = mlx5e_async_event ,
3376
3334
.protocol = MLX5_INTERFACE_PROTOCOL_ETH ,
3377
3335
.get_dev = mlx5e_get_netdev ,
0 commit comments