mirror of
git://git.openwrt.org/openwrt/openwrt.git
synced 2025-12-07 05:04:00 -05:00
Backport of the latest upstream Realtek PHY patches. WoL uses devm_pm_set_wake_irq(), so the patch that adds this function has also been backported. Changelog: 4465ae435ddc net: phy: realtek: create rtl8211f_config_phy_eee() helper bb78b71faf60 net: phy: realtek: eliminate priv->phycr1 variable e1a31c41bef6 net: phy: realtek: allow CLKOUT to be disabled on RTL8211F(D)(I)-VD-CG 910ac7bfb1af net: phy: realtek: eliminate has_phycr2 variable 27033d069177 net: phy: realtek: eliminate priv->phycr2 variable 8e982441ba60 net: phy: realtek: create rtl8211f_config_rgmii_delay() b826bf795564 net: phy: realtek: fix RTL8211F wake-on-lan support Tested on Netgear WAX206 with RTL8221B-VB-CG. Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl> Link: https://github.com/openwrt/openwrt/pull/20987 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
59 lines
2.1 KiB
Diff
59 lines
2.1 KiB
Diff
From: Daniel Golle <daniel@makrotopia.org>
|
|
Date: Thu, 30 Jan 2025 05:33:12 +0000
|
|
Subject: [PATCH] net: phy: realtek: work around broken SerDes
|
|
|
|
For still unknown reasons the SerDes init sequence may sometimes
|
|
time out because a self-clearing bit never clears, indicating the
|
|
PHY has entered an unrecoverable error state.
|
|
|
|
Work-around the issue by triggering a hardware reset and retry the
|
|
setup sequence while warning the user that this has happened.
|
|
This is really more of a work-around than a fix, and should be
|
|
replaced by a better actual fix in future (hopefully).
|
|
|
|
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|
---
|
|
--- a/drivers/net/phy/realtek/realtek_main.c
|
|
+++ b/drivers/net/phy/realtek/realtek_main.c
|
|
@@ -1349,6 +1349,22 @@ static int rtl822xb_config_init(struct p
|
|
return rtl822x_set_serdes_option_mode(phydev, false);
|
|
}
|
|
|
|
+static int rtl822xb_config_init_war(struct phy_device *phydev)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ ret = rtl822xb_config_init(phydev);
|
|
+
|
|
+ if (ret == -ETIMEDOUT) {
|
|
+ phydev_warn(phydev, "SerDes setup timed out, retrying\n");
|
|
+ phy_device_reset(phydev, 1);
|
|
+ phy_device_reset(phydev, 0);
|
|
+ ret = rtl822xb_config_init(phydev);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static int rtl822xb_get_rate_matching(struct phy_device *phydev,
|
|
phy_interface_t iface)
|
|
{
|
|
@@ -2223,7 +2239,7 @@ static struct phy_driver realtek_drvs[]
|
|
.handle_interrupt = rtl8221b_handle_interrupt,
|
|
.soft_reset = rtl822x_c45_soft_reset,
|
|
.probe = rtl822x_probe,
|
|
- .config_init = rtl822xb_config_init,
|
|
+ .config_init = rtl822xb_config_init_war,
|
|
.get_rate_matching = rtl822xb_get_rate_matching,
|
|
.get_features = rtl822x_c45_get_features,
|
|
.config_aneg = rtl822x_c45_config_aneg,
|
|
@@ -2251,7 +2267,7 @@ static struct phy_driver realtek_drvs[]
|
|
.handle_interrupt = rtl8221b_handle_interrupt,
|
|
.soft_reset = rtl822x_c45_soft_reset,
|
|
.probe = rtl822x_probe,
|
|
- .config_init = rtl822xb_config_init,
|
|
+ .config_init = rtl822xb_config_init_war,
|
|
.get_rate_matching = rtl822xb_get_rate_matching,
|
|
.get_features = rtl822x_c45_get_features,
|
|
.config_aneg = rtl822x_c45_config_aneg,
|