@@ -615,8 +615,7 @@ static int mlx5e_create_rq(struct mlx5e_rq *rq,
615
615
static int mlx5e_modify_rq_state (struct mlx5e_rq * rq , int curr_state ,
616
616
int next_state )
617
617
{
618
- struct mlx5e_channel * c = rq -> channel ;
619
- struct mlx5_core_dev * mdev = c -> mdev ;
618
+ struct mlx5_core_dev * mdev = rq -> mdev ;
620
619
621
620
void * in ;
622
621
void * rqc ;
@@ -1768,14 +1767,16 @@ static void mlx5e_build_rq_param(struct mlx5e_priv *priv,
1768
1767
param -> wq .linear = 1 ;
1769
1768
}
1770
1769
1771
- static void mlx5e_build_drop_rq_param (struct mlx5_core_dev * mdev ,
1770
+ static void mlx5e_build_drop_rq_param (struct mlx5e_priv * priv ,
1772
1771
struct mlx5e_rq_param * param )
1773
1772
{
1773
+ struct mlx5_core_dev * mdev = priv -> mdev ;
1774
1774
void * rqc = param -> rqc ;
1775
1775
void * wq = MLX5_ADDR_OF (rqc , rqc , wq );
1776
1776
1777
1777
MLX5_SET (wq , wq , wq_type , MLX5_WQ_TYPE_LINKED_LIST );
1778
1778
MLX5_SET (wq , wq , log_wq_stride , ilog2 (sizeof (struct mlx5e_rx_wqe )));
1779
+ MLX5_SET (rqc , rqc , counter_set_id , priv -> drop_rq_q_counter );
1779
1780
1780
1781
param -> wq .buf_numa_node = dev_to_node (& mdev -> pdev -> dev );
1781
1782
}
@@ -2643,15 +2644,16 @@ static int mlx5e_alloc_drop_cq(struct mlx5_core_dev *mdev,
2643
2644
return mlx5e_alloc_cq_common (mdev , param , cq );
2644
2645
}
2645
2646
2646
- static int mlx5e_open_drop_rq (struct mlx5_core_dev * mdev ,
2647
+ static int mlx5e_open_drop_rq (struct mlx5e_priv * priv ,
2647
2648
struct mlx5e_rq * drop_rq )
2648
2649
{
2650
+ struct mlx5_core_dev * mdev = priv -> mdev ;
2649
2651
struct mlx5e_cq_param cq_param = {};
2650
2652
struct mlx5e_rq_param rq_param = {};
2651
2653
struct mlx5e_cq * cq = & drop_rq -> cq ;
2652
2654
int err ;
2653
2655
2654
- mlx5e_build_drop_rq_param (mdev , & rq_param );
2656
+ mlx5e_build_drop_rq_param (priv , & rq_param );
2655
2657
2656
2658
err = mlx5e_alloc_drop_cq (mdev , cq , & cq_param );
2657
2659
if (err )
@@ -2669,6 +2671,10 @@ static int mlx5e_open_drop_rq(struct mlx5_core_dev *mdev,
2669
2671
if (err )
2670
2672
goto err_free_rq ;
2671
2673
2674
+ err = mlx5e_modify_rq_state (drop_rq , MLX5_RQC_STATE_RST , MLX5_RQC_STATE_RDY );
2675
+ if (err )
2676
+ mlx5_core_warn (priv -> mdev , "modify_rq_state failed, rx_if_down_packets won't be counted %d\n" , err );
2677
+
2672
2678
return 0 ;
2673
2679
2674
2680
err_free_rq :
@@ -3236,24 +3242,20 @@ static int mlx5e_set_features(struct net_device *netdev,
3236
3242
netdev_features_t features )
3237
3243
{
3238
3244
netdev_features_t oper_features = netdev -> features ;
3239
- int err ;
3245
+ int err = 0 ;
3240
3246
3241
- err = mlx5e_handle_feature (netdev , & oper_features , features ,
3242
- NETIF_F_LRO , set_feature_lro );
3243
- err |= mlx5e_handle_feature (netdev , & oper_features , features ,
3244
- NETIF_F_HW_VLAN_CTAG_FILTER ,
3247
+ #define MLX5E_HANDLE_FEATURE (feature , handler ) \
3248
+ mlx5e_handle_feature(netdev, &oper_features, features, feature, handler)
3249
+
3250
+ err |= MLX5E_HANDLE_FEATURE (NETIF_F_LRO , set_feature_lro );
3251
+ err |= MLX5E_HANDLE_FEATURE (NETIF_F_HW_VLAN_CTAG_FILTER ,
3245
3252
set_feature_cvlan_filter );
3246
- err |= mlx5e_handle_feature (netdev , & oper_features , features ,
3247
- NETIF_F_HW_TC , set_feature_tc_num_filters );
3248
- err |= mlx5e_handle_feature (netdev , & oper_features , features ,
3249
- NETIF_F_RXALL , set_feature_rx_all );
3250
- err |= mlx5e_handle_feature (netdev , & oper_features , features ,
3251
- NETIF_F_RXFCS , set_feature_rx_fcs );
3252
- err |= mlx5e_handle_feature (netdev , & oper_features , features ,
3253
- NETIF_F_HW_VLAN_CTAG_RX , set_feature_rx_vlan );
3253
+ err |= MLX5E_HANDLE_FEATURE (NETIF_F_HW_TC , set_feature_tc_num_filters );
3254
+ err |= MLX5E_HANDLE_FEATURE (NETIF_F_RXALL , set_feature_rx_all );
3255
+ err |= MLX5E_HANDLE_FEATURE (NETIF_F_RXFCS , set_feature_rx_fcs );
3256
+ err |= MLX5E_HANDLE_FEATURE (NETIF_F_HW_VLAN_CTAG_RX , set_feature_rx_vlan );
3254
3257
#ifdef CONFIG_RFS_ACCEL
3255
- err |= mlx5e_handle_feature (netdev , & oper_features , features ,
3256
- NETIF_F_NTUPLE , set_feature_arfs );
3258
+ err |= MLX5E_HANDLE_FEATURE (NETIF_F_NTUPLE , set_feature_arfs );
3257
3259
#endif
3258
3260
3259
3261
if (err ) {
@@ -3961,7 +3963,7 @@ void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params, u8 cq_period_mode)
3961
3963
MLX5_CQ_PERIOD_MODE_START_FROM_CQE );
3962
3964
}
3963
3965
3964
- u32 mlx5e_choose_lro_timeout (struct mlx5_core_dev * mdev , u32 wanted_timeout )
3966
+ static u32 mlx5e_choose_lro_timeout (struct mlx5_core_dev * mdev , u32 wanted_timeout )
3965
3967
{
3966
3968
int i ;
3967
3969
@@ -4104,6 +4106,9 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
4104
4106
netdev -> vlan_features |= NETIF_F_RXCSUM ;
4105
4107
netdev -> vlan_features |= NETIF_F_RXHASH ;
4106
4108
4109
+ netdev -> hw_enc_features |= NETIF_F_HW_VLAN_CTAG_TX ;
4110
+ netdev -> hw_enc_features |= NETIF_F_HW_VLAN_CTAG_RX ;
4111
+
4107
4112
if (!!MLX5_CAP_ETH (mdev , lro_cap ))
4108
4113
netdev -> vlan_features |= NETIF_F_LRO ;
4109
4114
@@ -4183,7 +4188,7 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
4183
4188
mlx5e_ipsec_build_netdev (priv );
4184
4189
}
4185
4190
4186
- static void mlx5e_create_q_counter (struct mlx5e_priv * priv )
4191
+ static void mlx5e_create_q_counters (struct mlx5e_priv * priv )
4187
4192
{
4188
4193
struct mlx5_core_dev * mdev = priv -> mdev ;
4189
4194
int err ;
@@ -4193,14 +4198,21 @@ static void mlx5e_create_q_counter(struct mlx5e_priv *priv)
4193
4198
mlx5_core_warn (mdev , "alloc queue counter failed, %d\n" , err );
4194
4199
priv -> q_counter = 0 ;
4195
4200
}
4201
+
4202
+ err = mlx5_core_alloc_q_counter (mdev , & priv -> drop_rq_q_counter );
4203
+ if (err ) {
4204
+ mlx5_core_warn (mdev , "alloc drop RQ counter failed, %d\n" , err );
4205
+ priv -> drop_rq_q_counter = 0 ;
4206
+ }
4196
4207
}
4197
4208
4198
- static void mlx5e_destroy_q_counter (struct mlx5e_priv * priv )
4209
+ static void mlx5e_destroy_q_counters (struct mlx5e_priv * priv )
4199
4210
{
4200
- if (! priv -> q_counter )
4201
- return ;
4211
+ if (priv -> q_counter )
4212
+ mlx5_core_dealloc_q_counter ( priv -> mdev , priv -> q_counter ) ;
4202
4213
4203
- mlx5_core_dealloc_q_counter (priv -> mdev , priv -> q_counter );
4214
+ if (priv -> drop_rq_q_counter )
4215
+ mlx5_core_dealloc_q_counter (priv -> mdev , priv -> drop_rq_q_counter );
4204
4216
}
4205
4217
4206
4218
static void mlx5e_nic_init (struct mlx5_core_dev * mdev ,
@@ -4439,18 +4451,18 @@ int mlx5e_attach_netdev(struct mlx5e_priv *priv)
4439
4451
if (err )
4440
4452
goto out ;
4441
4453
4442
- err = mlx5e_open_drop_rq (mdev , & priv -> drop_rq );
4454
+ mlx5e_create_q_counters (priv );
4455
+
4456
+ err = mlx5e_open_drop_rq (priv , & priv -> drop_rq );
4443
4457
if (err ) {
4444
4458
mlx5_core_err (mdev , "open drop rq failed, %d\n" , err );
4445
- goto err_cleanup_tx ;
4459
+ goto err_destroy_q_counters ;
4446
4460
}
4447
4461
4448
4462
err = profile -> init_rx (priv );
4449
4463
if (err )
4450
4464
goto err_close_drop_rq ;
4451
4465
4452
- mlx5e_create_q_counter (priv );
4453
-
4454
4466
if (profile -> enable )
4455
4467
profile -> enable (priv );
4456
4468
@@ -4459,7 +4471,8 @@ int mlx5e_attach_netdev(struct mlx5e_priv *priv)
4459
4471
err_close_drop_rq :
4460
4472
mlx5e_close_drop_rq (& priv -> drop_rq );
4461
4473
4462
- err_cleanup_tx :
4474
+ err_destroy_q_counters :
4475
+ mlx5e_destroy_q_counters (priv );
4463
4476
profile -> cleanup_tx (priv );
4464
4477
4465
4478
out :
@@ -4476,9 +4489,9 @@ void mlx5e_detach_netdev(struct mlx5e_priv *priv)
4476
4489
profile -> disable (priv );
4477
4490
flush_workqueue (priv -> wq );
4478
4491
4479
- mlx5e_destroy_q_counter (priv );
4480
4492
profile -> cleanup_rx (priv );
4481
4493
mlx5e_close_drop_rq (& priv -> drop_rq );
4494
+ mlx5e_destroy_q_counters (priv );
4482
4495
profile -> cleanup_tx (priv );
4483
4496
cancel_delayed_work_sync (& priv -> update_stats_work );
4484
4497
}
0 commit comments