]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: hns3: differentiate autoneg default values between copper and fiber
authorShuaisong Yang <yangshuaisong@h-partners.com>
Wed, 24 Jun 2026 14:13:19 +0000 (22:13 +0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 25 Jun 2026 16:15:44 +0000 (09:15 -0700)
Fix a link loss issue during driver initialization on optical ports
connected to forced-mode (non-autoneg) remote switches.

Previously, during driver probe or initialization, hclge_configure()
blindly hardcoded hdev->hw.mac.req_autoneg to AUTONEG_ENABLE for all
media types. While this is necessary for copper (BASE-T) ports to
establish a link, many high-speed optical (fiber) ports in data
centers are connected to switches running in forced mode (fixed speed,
autoneg disabled). Forcing autoneg on these optical ports during
initialization causes a permanent link failure since the remote end
refuses to respond to autoneg pulses.

Fix this by implementing media-type differentiated initialization in
hclge_init_ae_dev(). Copper ports continue to default to
AUTONEG_ENABLE, while optical ports strictly inherit the preset
autoneg status pre-configured by the firmware (hdev->hw.mac.autoneg),
preserving native compatibility with forced-mode network environments.

Fixes: 05eb60e9648c ("net: hns3: using user configure after hardware reset")
Signed-off-by: Shuaisong Yang <yangshuaisong@h-partners.com>
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Link: https://patch.msgid.link/20260624141319.271439-5-shaojijie@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index d176100d3e4c8f863338c5a68b271b967298c638..fc8587c8081371011b73cada7977406cab2c64ad 100644 (file)
@@ -9498,6 +9498,13 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
        if (ret)
                goto err_ptp_uninit;
 
+       if (hdev->hw.mac.media_type != HNAE3_MEDIA_TYPE_COPPER) {
+               hdev->hw.mac.req_autoneg = hdev->hw.mac.autoneg;
+               if (hdev->hw.mac.autoneg == AUTONEG_DISABLE &&
+                   hdev->hw.mac.speed != SPEED_UNKNOWN)
+                       hdev->hw.mac.req_speed = hdev->hw.mac.speed;
+       }
+
        ret = hclge_set_autoneg_speed_dup(hdev);
        if (ret) {
                dev_err(&pdev->dev,