Skip to content

Commit 30545e1

Browse files
Peiyang WangPaolo Abeni
authored andcommitted
net: hns3: use the user's cfg after reset
Consider the followed case that the user change speed and reset the net interface. Before the hw change speed successfully, the driver get old old speed from hw by timer task. After reset, the previous speed is config to hw. As a result, the new speed is configed successfully but lost after PF reset. The followed pictured shows more dirrectly. +------+ +----+ +----+ | USER | | PF | | HW | +---+--+ +-+--+ +-+--+ | ethtool -s 100G | | +------------------>| set speed 100G | | +--------------------->| | | set successfully | | |<---------------------+---+ | |query cfg (timer task)| | | +--------------------->| | handle speed | | return 200G | | changing event | ethtool --reset |<---------------------+ | (100G) +------------------>| cfg previous speed |<--+ | | after reset (200G) | | +--------------------->| | | +---+ | |query cfg (timer task)| | | +--------------------->| | handle speed | | return 100G | | changing event | |<---------------------+ | (200G) | | |<--+ | |query cfg (timer task)| | +--------------------->| | | return 200G | | |<---------------------+ | | | v v v This patch save new speed if hw change speed successfully, which will be used after reset successfully. Fixes: 2d03eac ("net: hns3: Only update mac configuation when necessary") Signed-off-by: Peiyang Wang <[email protected]> Signed-off-by: Jijie Shao <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 8445d9d commit 30545e1

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2653,8 +2653,17 @@ static int hclge_cfg_mac_speed_dup_h(struct hnae3_handle *handle, int speed,
26532653
{
26542654
struct hclge_vport *vport = hclge_get_vport(handle);
26552655
struct hclge_dev *hdev = vport->back;
2656+
int ret;
2657+
2658+
ret = hclge_cfg_mac_speed_dup(hdev, speed, duplex, lane_num);
26562659

2657-
return hclge_cfg_mac_speed_dup(hdev, speed, duplex, lane_num);
2660+
if (ret)
2661+
return ret;
2662+
2663+
hdev->hw.mac.req_speed = speed;
2664+
hdev->hw.mac.req_duplex = duplex;
2665+
2666+
return 0;
26582667
}
26592668

26602669
static int hclge_set_autoneg_en(struct hclge_dev *hdev, bool enable)
@@ -2956,17 +2965,20 @@ static int hclge_mac_init(struct hclge_dev *hdev)
29562965
if (!test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
29572966
hdev->hw.mac.duplex = HCLGE_MAC_FULL;
29582967

2959-
ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed,
2960-
hdev->hw.mac.duplex, hdev->hw.mac.lane_num);
2961-
if (ret)
2962-
return ret;
2963-
29642968
if (hdev->hw.mac.support_autoneg) {
29652969
ret = hclge_set_autoneg_en(hdev, hdev->hw.mac.autoneg);
29662970
if (ret)
29672971
return ret;
29682972
}
29692973

2974+
if (!hdev->hw.mac.autoneg) {
2975+
ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.req_speed,
2976+
hdev->hw.mac.req_duplex,
2977+
hdev->hw.mac.lane_num);
2978+
if (ret)
2979+
return ret;
2980+
}
2981+
29702982
mac->link = 0;
29712983

29722984
if (mac->user_fec_mode & BIT(HNAE3_FEC_USER_DEF)) {

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
191191
if (ret)
192192
netdev_err(netdev, "failed to adjust link.\n");
193193

194+
hdev->hw.mac.req_speed = (u32)speed;
195+
hdev->hw.mac.req_duplex = (u8)duplex;
196+
194197
ret = hclge_cfg_flowctrl(hdev);
195198
if (ret)
196199
netdev_err(netdev, "failed to configure flow control.\n");

0 commit comments

Comments
 (0)