Commit 30545e17 authored by Peiyang Wang's avatar Peiyang Wang Committed by Paolo Abeni

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: 2d03eacc ("net: hns3: Only update mac configuation when necessary")
Signed-off-by: default avatarPeiyang Wang <wangpeiyang1@huawei.com>
Signed-off-by: default avatarJijie Shao <shaojijie@huawei.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 8445d9d3
...@@ -2653,8 +2653,17 @@ static int hclge_cfg_mac_speed_dup_h(struct hnae3_handle *handle, int speed, ...@@ -2653,8 +2653,17 @@ static int hclge_cfg_mac_speed_dup_h(struct hnae3_handle *handle, int speed,
{ {
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
int ret;
ret = hclge_cfg_mac_speed_dup(hdev, speed, duplex, lane_num);
if (ret)
return ret;
hdev->hw.mac.req_speed = speed;
hdev->hw.mac.req_duplex = duplex;
return hclge_cfg_mac_speed_dup(hdev, speed, duplex, lane_num); return 0;
} }
static int hclge_set_autoneg_en(struct hclge_dev *hdev, bool enable) static int hclge_set_autoneg_en(struct hclge_dev *hdev, bool enable)
...@@ -2956,13 +2965,16 @@ static int hclge_mac_init(struct hclge_dev *hdev) ...@@ -2956,13 +2965,16 @@ static int hclge_mac_init(struct hclge_dev *hdev)
if (!test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) if (!test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
hdev->hw.mac.duplex = HCLGE_MAC_FULL; hdev->hw.mac.duplex = HCLGE_MAC_FULL;
ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed, if (hdev->hw.mac.support_autoneg) {
hdev->hw.mac.duplex, hdev->hw.mac.lane_num); ret = hclge_set_autoneg_en(hdev, hdev->hw.mac.autoneg);
if (ret) if (ret)
return ret; return ret;
}
if (hdev->hw.mac.support_autoneg) { if (!hdev->hw.mac.autoneg) {
ret = hclge_set_autoneg_en(hdev, hdev->hw.mac.autoneg); ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.req_speed,
hdev->hw.mac.req_duplex,
hdev->hw.mac.lane_num);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -191,6 +191,9 @@ static void hclge_mac_adjust_link(struct net_device *netdev) ...@@ -191,6 +191,9 @@ static void hclge_mac_adjust_link(struct net_device *netdev)
if (ret) if (ret)
netdev_err(netdev, "failed to adjust link.\n"); netdev_err(netdev, "failed to adjust link.\n");
hdev->hw.mac.req_speed = (u32)speed;
hdev->hw.mac.req_duplex = (u8)duplex;
ret = hclge_cfg_flowctrl(hdev); ret = hclge_cfg_flowctrl(hdev);
if (ret) if (ret)
netdev_err(netdev, "failed to configure flow control.\n"); netdev_err(netdev, "failed to configure flow control.\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment