@@ -1106,6 +1106,36 @@ static int hns3_check_ringparam(struct net_device *ndev,
11061106 return 0 ;
11071107}
11081108
1109+ static bool
1110+ hns3_is_ringparam_changed (struct net_device * ndev ,
1111+ struct ethtool_ringparam * param ,
1112+ struct kernel_ethtool_ringparam * kernel_param ,
1113+ struct hns3_ring_param * old_ringparam ,
1114+ struct hns3_ring_param * new_ringparam )
1115+ {
1116+ struct hns3_nic_priv * priv = netdev_priv (ndev );
1117+ struct hnae3_handle * h = priv -> ae_handle ;
1118+ u16 queue_num = h -> kinfo .num_tqps ;
1119+
1120+ new_ringparam -> tx_desc_num = ALIGN (param -> tx_pending ,
1121+ HNS3_RING_BD_MULTIPLE );
1122+ new_ringparam -> rx_desc_num = ALIGN (param -> rx_pending ,
1123+ HNS3_RING_BD_MULTIPLE );
1124+ old_ringparam -> tx_desc_num = priv -> ring [0 ].desc_num ;
1125+ old_ringparam -> rx_desc_num = priv -> ring [queue_num ].desc_num ;
1126+ old_ringparam -> rx_buf_len = priv -> ring [queue_num ].buf_size ;
1127+ new_ringparam -> rx_buf_len = kernel_param -> rx_buf_len ;
1128+
1129+ if (old_ringparam -> tx_desc_num == new_ringparam -> tx_desc_num &&
1130+ old_ringparam -> rx_desc_num == new_ringparam -> rx_desc_num &&
1131+ old_ringparam -> rx_buf_len == new_ringparam -> rx_buf_len ) {
1132+ netdev_info (ndev , "ringparam not changed\n" );
1133+ return false;
1134+ }
1135+
1136+ return true;
1137+ }
1138+
11091139static int hns3_change_rx_buf_len (struct net_device * ndev , u32 rx_buf_len )
11101140{
11111141 struct hns3_nic_priv * priv = netdev_priv (ndev );
@@ -1151,14 +1181,11 @@ static int hns3_set_ringparam(struct net_device *ndev,
11511181 struct kernel_ethtool_ringparam * kernel_param ,
11521182 struct netlink_ext_ack * extack )
11531183{
1184+ struct hns3_ring_param old_ringparam , new_ringparam ;
11541185 struct hns3_nic_priv * priv = netdev_priv (ndev );
11551186 struct hnae3_handle * h = priv -> ae_handle ;
11561187 struct hns3_enet_ring * tmp_rings ;
11571188 bool if_running = netif_running (ndev );
1158- u32 old_tx_desc_num , new_tx_desc_num ;
1159- u32 old_rx_desc_num , new_rx_desc_num ;
1160- u16 queue_num = h -> kinfo .num_tqps ;
1161- u32 old_rx_buf_len ;
11621189 int ret , i ;
11631190
11641191 ret = hns3_check_ringparam (ndev , param , kernel_param );
@@ -1169,15 +1196,8 @@ static int hns3_set_ringparam(struct net_device *ndev,
11691196 if (ret )
11701197 return ret ;
11711198
1172- /* Hardware requires that its descriptors must be multiple of eight */
1173- new_tx_desc_num = ALIGN (param -> tx_pending , HNS3_RING_BD_MULTIPLE );
1174- new_rx_desc_num = ALIGN (param -> rx_pending , HNS3_RING_BD_MULTIPLE );
1175- old_tx_desc_num = priv -> ring [0 ].desc_num ;
1176- old_rx_desc_num = priv -> ring [queue_num ].desc_num ;
1177- old_rx_buf_len = priv -> ring [queue_num ].buf_size ;
1178- if (old_tx_desc_num == new_tx_desc_num &&
1179- old_rx_desc_num == new_rx_desc_num &&
1180- kernel_param -> rx_buf_len == old_rx_buf_len )
1199+ if (!hns3_is_ringparam_changed (ndev , param , kernel_param ,
1200+ & old_ringparam , & new_ringparam ))
11811201 return 0 ;
11821202
11831203 tmp_rings = hns3_backup_ringparam (priv );
@@ -1188,24 +1208,25 @@ static int hns3_set_ringparam(struct net_device *ndev,
11881208 }
11891209
11901210 netdev_info (ndev ,
1191- "Changing Tx/Rx ring depth from %u/%u to %u/%u, Changing rx buffer len from %d to %d \n" ,
1192- old_tx_desc_num , old_rx_desc_num ,
1193- new_tx_desc_num , new_rx_desc_num ,
1194- old_rx_buf_len , kernel_param -> rx_buf_len );
1211+ "Changing Tx/Rx ring depth from %u/%u to %u/%u, Changing rx buffer len from %u to %u \n" ,
1212+ old_ringparam . tx_desc_num , old_ringparam . rx_desc_num ,
1213+ new_ringparam . tx_desc_num , new_ringparam . rx_desc_num ,
1214+ old_ringparam . rx_buf_len , new_ringparam . rx_buf_len );
11951215
11961216 if (if_running )
11971217 ndev -> netdev_ops -> ndo_stop (ndev );
11981218
1199- hns3_change_all_ring_bd_num (priv , new_tx_desc_num , new_rx_desc_num );
1200- hns3_change_rx_buf_len (ndev , kernel_param -> rx_buf_len );
1219+ hns3_change_all_ring_bd_num (priv , new_ringparam .tx_desc_num ,
1220+ new_ringparam .rx_desc_num );
1221+ hns3_change_rx_buf_len (ndev , new_ringparam .rx_buf_len );
12011222 ret = hns3_init_all_ring (priv );
12021223 if (ret ) {
12031224 netdev_err (ndev , "set ringparam fail, revert to old value(%d)\n" ,
12041225 ret );
12051226
1206- hns3_change_rx_buf_len (ndev , old_rx_buf_len );
1207- hns3_change_all_ring_bd_num (priv , old_tx_desc_num ,
1208- old_rx_desc_num );
1227+ hns3_change_rx_buf_len (ndev , old_ringparam . rx_buf_len );
1228+ hns3_change_all_ring_bd_num (priv , old_ringparam . tx_desc_num ,
1229+ old_ringparam . rx_desc_num );
12091230 for (i = 0 ; i < h -> kinfo .num_tqps * 2 ; i ++ )
12101231 memcpy (& priv -> ring [i ], & tmp_rings [i ],
12111232 sizeof (struct hns3_enet_ring ));
0 commit comments