From 684713d7e776fa2e37287e0a45ffc18dbb1bdd9d Mon Sep 17 00:00:00 2001 From: hmz007 Date: Mon, 9 Jun 2025 11:26:45 +0800 Subject: [PATCH] [kernel] fix rtl8211f PHY issues after suspend/resume Signed-off-by: hmz007 --- kernel-6.1/drivers/net/phy/realtek.c | 35 +++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/kernel-6.1/drivers/net/phy/realtek.c b/kernel-6.1/drivers/net/phy/realtek.c index 81ffe75ce26..19181b695e5 100644 --- a/kernel-6.1/drivers/net/phy/realtek.c +++ b/kernel-6.1/drivers/net/phy/realtek.c @@ -432,6 +432,39 @@ static int rtl8211f_config_init(struct phy_device *phydev) return 0; } +static int rtl8211f_resume(struct phy_device *phydev) +{ + int ret; + + if (!phydev->suspended) + return 0; + + ret = genphy_resume(phydev); + if (ret < 0) + return ret; + + msleep(20); + + /* + * When the RTL8211F is switched from power down to normal operation, + * a software reset and restart auto-negotiation is performed, even if + * bits Reset and Restart_AN are not set by the user. + */ + if (phydev->drv->config_init) { + ret = phydev->drv->config_init(phydev); + if (ret < 0) + return ret; + } + + if (phydev->drv->config_intr) { + ret = phydev->drv->config_intr(phydev); + if (ret < 0) + return ret; + } + + return 0; +} + static int rtl821x_resume(struct phy_device *phydev) { int ret; @@ -998,7 +1031,7 @@ static struct phy_driver realtek_drvs[] = { .config_intr = &rtl8211f_config_intr, .handle_interrupt = rtl8211f_handle_interrupt, .suspend = genphy_suspend, - .resume = rtl821x_resume, + .resume = rtl8211f_resume, .read_page = rtl821x_read_page, .write_page = rtl821x_write_page, }, {