@@ -2437,9 +2437,9 @@ static void mlx5e_query_mtu(struct mlx5e_priv *priv, u16 *mtu)
2437
2437
* mtu = MLX5E_HW2SW_MTU (hw_mtu );
2438
2438
}
2439
2439
2440
- static int mlx5e_set_dev_port_mtu (struct net_device * netdev )
2440
+ static int mlx5e_set_dev_port_mtu (struct mlx5e_priv * priv )
2441
2441
{
2442
- struct mlx5e_priv * priv = netdev_priv ( netdev ) ;
2442
+ struct net_device * netdev = priv -> netdev ;
2443
2443
u16 mtu ;
2444
2444
int err ;
2445
2445
@@ -2534,7 +2534,8 @@ static void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv)
2534
2534
}
2535
2535
2536
2536
void mlx5e_switch_priv_channels (struct mlx5e_priv * priv ,
2537
- struct mlx5e_channels * new_chs )
2537
+ struct mlx5e_channels * new_chs ,
2538
+ mlx5e_fp_hw_modify hw_modify )
2538
2539
{
2539
2540
struct net_device * netdev = priv -> netdev ;
2540
2541
int new_num_txqs ;
@@ -2551,6 +2552,10 @@ void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
2551
2552
2552
2553
priv -> channels = * new_chs ;
2553
2554
2555
+ /* New channels are ready to roll, modify HW settings if needed */
2556
+ if (hw_modify )
2557
+ hw_modify (priv );
2558
+
2554
2559
mlx5e_refresh_tirs (priv , false);
2555
2560
mlx5e_activate_priv_channels (priv );
2556
2561
@@ -2930,7 +2935,7 @@ static int mlx5e_setup_tc(struct net_device *netdev, u8 tc)
2930
2935
if (err )
2931
2936
goto out ;
2932
2937
2933
- mlx5e_switch_priv_channels (priv , & new_channels );
2938
+ mlx5e_switch_priv_channels (priv , & new_channels , NULL );
2934
2939
out :
2935
2940
mutex_unlock (& priv -> state_lock );
2936
2941
return err ;
@@ -3049,26 +3054,31 @@ typedef int (*mlx5e_feature_handler)(struct net_device *netdev, bool enable);
3049
3054
static int set_feature_lro (struct net_device * netdev , bool enable )
3050
3055
{
3051
3056
struct mlx5e_priv * priv = netdev_priv (netdev );
3052
- bool was_opened = test_bit (MLX5E_STATE_OPENED , & priv -> state );
3053
- int err ;
3057
+ struct mlx5e_channels new_channels = {};
3058
+ int err = 0 ;
3059
+ bool reset ;
3054
3060
3055
3061
mutex_lock (& priv -> state_lock );
3056
3062
3057
- if ( was_opened && (priv -> channels .params .rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST ))
3058
- mlx5e_close_locked ( priv -> netdev );
3063
+ reset = (priv -> channels .params .rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST );
3064
+ reset = reset && test_bit ( MLX5E_STATE_OPENED , & priv -> state );
3059
3065
3060
- priv -> channels .params .lro_en = enable ;
3061
- err = mlx5e_modify_tirs_lro (priv );
3062
- if (err ) {
3063
- netdev_err (netdev , "lro modify failed, %d\n" , err );
3064
- priv -> channels .params .lro_en = !enable ;
3066
+ new_channels .params = priv -> channels .params ;
3067
+ new_channels .params .lro_en = enable ;
3068
+
3069
+ if (!reset ) {
3070
+ priv -> channels .params = new_channels .params ;
3071
+ err = mlx5e_modify_tirs_lro (priv );
3072
+ goto out ;
3065
3073
}
3066
3074
3067
- if (was_opened && (priv -> channels .params .rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST ))
3068
- mlx5e_open_locked (priv -> netdev );
3075
+ err = mlx5e_open_channels (priv , & new_channels );
3076
+ if (err )
3077
+ goto out ;
3069
3078
3079
+ mlx5e_switch_priv_channels (priv , & new_channels , mlx5e_modify_tirs_lro );
3080
+ out :
3070
3081
mutex_unlock (& priv -> state_lock );
3071
-
3072
3082
return err ;
3073
3083
}
3074
3084
@@ -3191,7 +3201,8 @@ static int mlx5e_set_features(struct net_device *netdev,
3191
3201
static int mlx5e_change_mtu (struct net_device * netdev , int new_mtu )
3192
3202
{
3193
3203
struct mlx5e_priv * priv = netdev_priv (netdev );
3194
- bool was_opened ;
3204
+ struct mlx5e_channels new_channels = {};
3205
+ int curr_mtu ;
3195
3206
int err = 0 ;
3196
3207
bool reset ;
3197
3208
@@ -3201,18 +3212,27 @@ static int mlx5e_change_mtu(struct net_device *netdev, int new_mtu)
3201
3212
(priv -> channels .params .rq_wq_type !=
3202
3213
MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ );
3203
3214
3204
- was_opened = test_bit (MLX5E_STATE_OPENED , & priv -> state );
3205
- if (was_opened && reset )
3206
- mlx5e_close_locked (netdev );
3215
+ reset = reset && test_bit (MLX5E_STATE_OPENED , & priv -> state );
3207
3216
3217
+ curr_mtu = netdev -> mtu ;
3208
3218
netdev -> mtu = new_mtu ;
3209
- mlx5e_set_dev_port_mtu (netdev );
3210
3219
3211
- if (was_opened && reset )
3212
- err = mlx5e_open_locked (netdev );
3220
+ if (!reset ) {
3221
+ mlx5e_set_dev_port_mtu (priv );
3222
+ goto out ;
3223
+ }
3213
3224
3214
- mutex_unlock (& priv -> state_lock );
3225
+ new_channels .params = priv -> channels .params ;
3226
+ err = mlx5e_open_channels (priv , & new_channels );
3227
+ if (err ) {
3228
+ netdev -> mtu = curr_mtu ;
3229
+ goto out ;
3230
+ }
3231
+
3232
+ mlx5e_switch_priv_channels (priv , & new_channels , mlx5e_set_dev_port_mtu );
3215
3233
3234
+ out :
3235
+ mutex_unlock (& priv -> state_lock );
3216
3236
return err ;
3217
3237
}
3218
3238
@@ -4169,7 +4189,7 @@ int mlx5e_attach_netdev(struct mlx5_core_dev *mdev, struct net_device *netdev)
4169
4189
mlx5_query_port_max_mtu (priv -> mdev , & max_mtu , 1 );
4170
4190
netdev -> max_mtu = MLX5E_HW2SW_MTU (max_mtu );
4171
4191
4172
- mlx5e_set_dev_port_mtu (netdev );
4192
+ mlx5e_set_dev_port_mtu (priv );
4173
4193
4174
4194
if (profile -> enable )
4175
4195
profile -> enable (priv );
0 commit comments