@@ -3185,6 +3185,9 @@ static int hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)
3185
3185
for (i = 0 ; i < priv -> vector_num ; i ++ ) {
3186
3186
tqp_vector = & priv -> tqp_vector [i ];
3187
3187
3188
+ if (!tqp_vector -> rx_group .ring && !tqp_vector -> tx_group .ring )
3189
+ continue ;
3190
+
3188
3191
ret = hns3_get_vector_ring_chain (tqp_vector ,
3189
3192
& vector_ring_chain );
3190
3193
if (ret )
@@ -3205,7 +3208,6 @@ static int hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)
3205
3208
tqp_vector -> irq_init_flag = HNS3_VECTOR_NOT_INITED ;
3206
3209
}
3207
3210
3208
- priv -> ring_data [i ].ring -> irq_init_flag = HNS3_VECTOR_NOT_INITED ;
3209
3211
hns3_clear_ring_group (& tqp_vector -> rx_group );
3210
3212
hns3_clear_ring_group (& tqp_vector -> tx_group );
3211
3213
netif_napi_del (& priv -> tqp_vector [i ].napi );
@@ -3238,6 +3240,7 @@ static int hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
3238
3240
{
3239
3241
struct hns3_nic_ring_data * ring_data = priv -> ring_data ;
3240
3242
int queue_num = priv -> ae_handle -> kinfo .num_tqps ;
3243
+ int desc_num = priv -> ae_handle -> kinfo .num_desc ;
3241
3244
struct pci_dev * pdev = priv -> ae_handle -> pdev ;
3242
3245
struct hns3_enet_ring * ring ;
3243
3246
@@ -3263,7 +3266,7 @@ static int hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
3263
3266
ring -> dev = priv -> dev ;
3264
3267
ring -> desc_dma_addr = 0 ;
3265
3268
ring -> buf_size = q -> buf_size ;
3266
- ring -> desc_num = q -> desc_num ;
3269
+ ring -> desc_num = desc_num ;
3267
3270
ring -> next_to_use = 0 ;
3268
3271
ring -> next_to_clean = 0 ;
3269
3272
@@ -3725,7 +3728,6 @@ static int hns3_client_setup_tc(struct hnae3_handle *handle, u8 tc)
3725
3728
{
3726
3729
struct hnae3_knic_private_info * kinfo = & handle -> kinfo ;
3727
3730
struct net_device * ndev = kinfo -> netdev ;
3728
- bool if_running ;
3729
3731
int ret ;
3730
3732
3731
3733
if (tc > HNAE3_MAX_TC )
@@ -3734,24 +3736,13 @@ static int hns3_client_setup_tc(struct hnae3_handle *handle, u8 tc)
3734
3736
if (!ndev )
3735
3737
return - ENODEV ;
3736
3738
3737
- if_running = netif_running (ndev );
3738
-
3739
- if (if_running ) {
3740
- (void )hns3_nic_net_stop (ndev );
3741
- msleep (100 );
3742
- }
3743
-
3744
3739
ret = (kinfo -> dcb_ops && kinfo -> dcb_ops -> map_update ) ?
3745
3740
kinfo -> dcb_ops -> map_update (handle ) : - EOPNOTSUPP ;
3746
3741
if (ret )
3747
- goto err_out ;
3742
+ return ret ;
3748
3743
3749
3744
ret = hns3_nic_set_real_num_queue (ndev );
3750
3745
3751
- err_out :
3752
- if (if_running )
3753
- (void )hns3_nic_net_open (ndev );
3754
-
3755
3746
return ret ;
3756
3747
}
3757
3748
@@ -4013,41 +4004,18 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
4013
4004
{
4014
4005
struct net_device * netdev = handle -> kinfo .netdev ;
4015
4006
struct hns3_nic_priv * priv = netdev_priv (netdev );
4016
- bool vlan_filter_enable ;
4017
4007
int ret ;
4018
4008
4019
- ret = hns3_init_mac_addr (netdev , false);
4020
- if (ret )
4021
- return ret ;
4022
-
4023
- ret = hns3_recover_hw_addr (netdev );
4024
- if (ret )
4025
- return ret ;
4026
-
4027
- ret = hns3_update_promisc_mode (netdev , handle -> netdev_flags );
4028
- if (ret )
4029
- return ret ;
4030
-
4031
- vlan_filter_enable = netdev -> flags & IFF_PROMISC ? false : true;
4032
- hns3_enable_vlan_filter (netdev , vlan_filter_enable );
4033
-
4034
- /* Hardware table is only clear when pf resets */
4035
- if (!(handle -> flags & HNAE3_SUPPORT_VF )) {
4036
- ret = hns3_restore_vlan (netdev );
4037
- if (ret )
4038
- return ret ;
4039
- }
4009
+ /* Carrier off reporting is important to ethtool even BEFORE open */
4010
+ netif_carrier_off (netdev );
4040
4011
4041
- ret = hns3_restore_fd_rules ( netdev );
4012
+ ret = hns3_get_ring_config ( priv );
4042
4013
if (ret )
4043
4014
return ret ;
4044
4015
4045
- /* Carrier off reporting is important to ethtool even BEFORE open */
4046
- netif_carrier_off (netdev );
4047
-
4048
4016
ret = hns3_nic_alloc_vector_data (priv );
4049
4017
if (ret )
4050
- return ret ;
4018
+ goto err_put_ring ;
4051
4019
4052
4020
hns3_restore_coal (priv );
4053
4021
@@ -4068,10 +4036,44 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
4068
4036
priv -> ring_data = NULL ;
4069
4037
err_dealloc_vector :
4070
4038
hns3_nic_dealloc_vector_data (priv );
4039
+ err_put_ring :
4040
+ hns3_put_ring_config (priv );
4041
+ priv -> ring_data = NULL ;
4071
4042
4072
4043
return ret ;
4073
4044
}
4074
4045
4046
+ static int hns3_reset_notify_restore_enet (struct hnae3_handle * handle )
4047
+ {
4048
+ struct net_device * netdev = handle -> kinfo .netdev ;
4049
+ bool vlan_filter_enable ;
4050
+ int ret ;
4051
+
4052
+ ret = hns3_init_mac_addr (netdev , false);
4053
+ if (ret )
4054
+ return ret ;
4055
+
4056
+ ret = hns3_recover_hw_addr (netdev );
4057
+ if (ret )
4058
+ return ret ;
4059
+
4060
+ ret = hns3_update_promisc_mode (netdev , handle -> netdev_flags );
4061
+ if (ret )
4062
+ return ret ;
4063
+
4064
+ vlan_filter_enable = netdev -> flags & IFF_PROMISC ? false : true;
4065
+ hns3_enable_vlan_filter (netdev , vlan_filter_enable );
4066
+
4067
+ /* Hardware table is only clear when pf resets */
4068
+ if (!(handle -> flags & HNAE3_SUPPORT_VF )) {
4069
+ ret = hns3_restore_vlan (netdev );
4070
+ if (ret )
4071
+ return ret ;
4072
+ }
4073
+
4074
+ return hns3_restore_fd_rules (netdev );
4075
+ }
4076
+
4075
4077
static int hns3_reset_notify_uninit_enet (struct hnae3_handle * handle )
4076
4078
{
4077
4079
struct net_device * netdev = handle -> kinfo .netdev ;
@@ -4101,6 +4103,9 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
4101
4103
if (ret )
4102
4104
netdev_err (netdev , "uninit ring error\n" );
4103
4105
4106
+ hns3_put_ring_config (priv );
4107
+ priv -> ring_data = NULL ;
4108
+
4104
4109
clear_bit (HNS3_NIC_STATE_INITED , & priv -> state );
4105
4110
4106
4111
return ret ;
@@ -4124,64 +4129,21 @@ static int hns3_reset_notify(struct hnae3_handle *handle,
4124
4129
case HNAE3_UNINIT_CLIENT :
4125
4130
ret = hns3_reset_notify_uninit_enet (handle );
4126
4131
break ;
4132
+ case HNAE3_RESTORE_CLIENT :
4133
+ ret = hns3_reset_notify_restore_enet (handle );
4134
+ break ;
4127
4135
default :
4128
4136
break ;
4129
4137
}
4130
4138
4131
4139
return ret ;
4132
4140
}
4133
4141
4134
- static int hns3_modify_tqp_num (struct net_device * netdev , u16 new_tqp_num )
4135
- {
4136
- struct hns3_nic_priv * priv = netdev_priv (netdev );
4137
- struct hnae3_handle * h = hns3_get_handle (netdev );
4138
- int ret ;
4139
-
4140
- ret = h -> ae_algo -> ops -> set_channels (h , new_tqp_num );
4141
- if (ret )
4142
- return ret ;
4143
-
4144
- ret = hns3_get_ring_config (priv );
4145
- if (ret )
4146
- return ret ;
4147
-
4148
- ret = hns3_nic_alloc_vector_data (priv );
4149
- if (ret )
4150
- goto err_alloc_vector ;
4151
-
4152
- hns3_restore_coal (priv );
4153
-
4154
- ret = hns3_nic_init_vector_data (priv );
4155
- if (ret )
4156
- goto err_uninit_vector ;
4157
-
4158
- ret = hns3_init_all_ring (priv );
4159
- if (ret )
4160
- goto err_put_ring ;
4161
-
4162
- return 0 ;
4163
-
4164
- err_put_ring :
4165
- hns3_put_ring_config (priv );
4166
- err_uninit_vector :
4167
- hns3_nic_uninit_vector_data (priv );
4168
- err_alloc_vector :
4169
- hns3_nic_dealloc_vector_data (priv );
4170
- return ret ;
4171
- }
4172
-
4173
- static int hns3_adjust_tqps_num (u8 num_tc , u32 new_tqp_num )
4174
- {
4175
- return (new_tqp_num / num_tc ) * num_tc ;
4176
- }
4177
-
4178
4142
int hns3_set_channels (struct net_device * netdev ,
4179
4143
struct ethtool_channels * ch )
4180
4144
{
4181
- struct hns3_nic_priv * priv = netdev_priv (netdev );
4182
4145
struct hnae3_handle * h = hns3_get_handle (netdev );
4183
4146
struct hnae3_knic_private_info * kinfo = & h -> kinfo ;
4184
- bool if_running = netif_running (netdev );
4185
4147
u32 new_tqp_num = ch -> combined_count ;
4186
4148
u16 org_tqp_num ;
4187
4149
int ret ;
@@ -4190,39 +4152,28 @@ int hns3_set_channels(struct net_device *netdev,
4190
4152
return - EINVAL ;
4191
4153
4192
4154
if (new_tqp_num > hns3_get_max_available_channels (h ) ||
4193
- new_tqp_num < kinfo -> num_tc ) {
4155
+ new_tqp_num < 1 ) {
4194
4156
dev_err (& netdev -> dev ,
4195
- "Change tqps fail, the tqp range is from %d to %d" ,
4196
- kinfo -> num_tc ,
4157
+ "Change tqps fail, the tqp range is from 1 to %d" ,
4197
4158
hns3_get_max_available_channels (h ));
4198
4159
return - EINVAL ;
4199
4160
}
4200
4161
4201
- new_tqp_num = hns3_adjust_tqps_num (kinfo -> num_tc , new_tqp_num );
4202
- if (kinfo -> num_tqps == new_tqp_num )
4162
+ if (kinfo -> rss_size == new_tqp_num )
4203
4163
return 0 ;
4204
4164
4205
- if (if_running )
4206
- hns3_nic_net_stop (netdev );
4207
-
4208
- ret = hns3_nic_uninit_vector_data (priv );
4209
- if (ret ) {
4210
- dev_err (& netdev -> dev ,
4211
- "Unbind vector with tqp fail, nothing is changed" );
4212
- goto open_netdev ;
4213
- }
4214
-
4215
- hns3_store_coal (priv );
4216
-
4217
- hns3_nic_dealloc_vector_data (priv );
4165
+ ret = hns3_reset_notify (h , HNAE3_DOWN_CLIENT );
4166
+ if (ret )
4167
+ return ret ;
4218
4168
4219
- hns3_uninit_all_ring (priv );
4220
- hns3_put_ring_config (priv );
4169
+ ret = hns3_reset_notify (h , HNAE3_UNINIT_CLIENT );
4170
+ if (ret )
4171
+ return ret ;
4221
4172
4222
4173
org_tqp_num = h -> kinfo .num_tqps ;
4223
- ret = hns3_modify_tqp_num ( netdev , new_tqp_num );
4174
+ ret = h -> ae_algo -> ops -> set_channels ( h , new_tqp_num );
4224
4175
if (ret ) {
4225
- ret = hns3_modify_tqp_num ( netdev , org_tqp_num );
4176
+ ret = h -> ae_algo -> ops -> set_channels ( h , org_tqp_num );
4226
4177
if (ret ) {
4227
4178
/* If revert to old tqp failed, fatal error occurred */
4228
4179
dev_err (& netdev -> dev ,
@@ -4232,12 +4183,11 @@ int hns3_set_channels(struct net_device *netdev,
4232
4183
dev_info (& netdev -> dev ,
4233
4184
"Change tqp num fail, Revert to old tqp num" );
4234
4185
}
4186
+ ret = hns3_reset_notify (h , HNAE3_INIT_CLIENT );
4187
+ if (ret )
4188
+ return ret ;
4235
4189
4236
- open_netdev :
4237
- if (if_running )
4238
- hns3_nic_net_open (netdev );
4239
-
4240
- return ret ;
4190
+ return hns3_reset_notify (h , HNAE3_UP_CLIENT );
4241
4191
}
4242
4192
4243
4193
static const struct hnae3_client_ops client_ops = {
0 commit comments