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, }, {