Commit b15c072a authored by Yonglong Liu's avatar Yonglong Liu Committed by Jakub Kicinski

net: hns3: fix speed unknown issue in bond 4

In bond 4, when the link goes down and up repeatedly, the bond may get an
unknown speed, and then this port can not work.

The driver notify netif_carrier_on() before update the link state, when the
bond receive carrier on, will query the speed of the port, if the query
operation happens before updating the link state, will get an unknown
speed. So need to notify netif_carrier_on() after update the link state.

Fixes: 46a3df9f ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support")
Fixes: e2cb1dec ("net: hns3: Add HNS3 VF HCL(Hardware Compatibility Layer) Support")
Signed-off-by: default avatarYonglong Liu <liuyonglong@huawei.com>
Signed-off-by: default avatarGuangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a96d9330
...@@ -2952,12 +2952,12 @@ static void hclge_update_link_status(struct hclge_dev *hdev) ...@@ -2952,12 +2952,12 @@ static void hclge_update_link_status(struct hclge_dev *hdev)
} }
if (state != hdev->hw.mac.link) { if (state != hdev->hw.mac.link) {
hdev->hw.mac.link = state;
client->ops->link_status_change(handle, state); client->ops->link_status_change(handle, state);
hclge_config_mac_tnl_int(hdev, state); hclge_config_mac_tnl_int(hdev, state);
if (rclient && rclient->ops->link_status_change) if (rclient && rclient->ops->link_status_change)
rclient->ops->link_status_change(rhandle, state); rclient->ops->link_status_change(rhandle, state);
hdev->hw.mac.link = state;
hclge_push_link_status(hdev); hclge_push_link_status(hdev);
} }
......
...@@ -506,10 +506,10 @@ void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state) ...@@ -506,10 +506,10 @@ void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state)
link_state = link_state =
test_bit(HCLGEVF_STATE_DOWN, &hdev->state) ? 0 : link_state; test_bit(HCLGEVF_STATE_DOWN, &hdev->state) ? 0 : link_state;
if (link_state != hdev->hw.mac.link) { if (link_state != hdev->hw.mac.link) {
hdev->hw.mac.link = link_state;
client->ops->link_status_change(handle, !!link_state); client->ops->link_status_change(handle, !!link_state);
if (rclient && rclient->ops->link_status_change) if (rclient && rclient->ops->link_status_change)
rclient->ops->link_status_change(rhandle, !!link_state); rclient->ops->link_status_change(rhandle, !!link_state);
hdev->hw.mac.link = link_state;
} }
clear_bit(HCLGEVF_STATE_LINK_UPDATING, &hdev->state); clear_bit(HCLGEVF_STATE_LINK_UPDATING, &hdev->state);
......
...@@ -323,8 +323,8 @@ void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev) ...@@ -323,8 +323,8 @@ void hclgevf_mbx_async_handler(struct hclgevf_dev *hdev)
flag = (u8)msg_q[5]; flag = (u8)msg_q[5];
/* update upper layer with new link link status */ /* update upper layer with new link link status */
hclgevf_update_link_status(hdev, link_status);
hclgevf_update_speed_duplex(hdev, speed, duplex); hclgevf_update_speed_duplex(hdev, speed, duplex);
hclgevf_update_link_status(hdev, link_status);
if (flag & HCLGE_MBX_PUSH_LINK_STATUS_EN) if (flag & HCLGE_MBX_PUSH_LINK_STATUS_EN)
set_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS, set_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS,
......
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