mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 01:11:14 +00:00
20c64dabb6
The patch was wrongly removed by a kernel version bump to 4.9.106 in the believe that it was merged upstream thow it wasn't. This lead to unrecoverable link losses on devices which use those PHYs such as many ubnt single-port CPEs. Fixes:6f8eb1b50f
("kernel: bump 4.9 to 4.9.106 for 18.06") Signed-off-by: Daniel Golle <daniel@makrotopia.org> (cherry picked from commita497e47762
)
71 lines
2.3 KiB
Diff
71 lines
2.3 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Subject: net: phy: at803x: add support for AT8032
|
|
|
|
Like AT8030, this PHY needs the GPIO reset workaround
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/drivers/net/phy/at803x.c
|
|
+++ b/drivers/net/phy/at803x.c
|
|
@@ -62,6 +62,7 @@
|
|
|
|
#define ATH8030_PHY_ID 0x004dd076
|
|
#define ATH8031_PHY_ID 0x004dd074
|
|
+#define ATH8032_PHY_ID 0x004dd023
|
|
#define ATH8035_PHY_ID 0x004dd072
|
|
|
|
MODULE_DESCRIPTION("Atheros 803x PHY driver");
|
|
@@ -259,7 +260,8 @@ static int at803x_probe(struct phy_devic
|
|
if (!priv)
|
|
return -ENOMEM;
|
|
|
|
- if (phydev->drv->phy_id != ATH8030_PHY_ID)
|
|
+ if (phydev->drv->phy_id != ATH8030_PHY_ID &&
|
|
+ phydev->drv->phy_id != ATH8032_PHY_ID)
|
|
goto does_not_require_reset_workaround;
|
|
|
|
gpiod_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
|
|
@@ -335,7 +337,7 @@ static void at803x_link_change_notify(st
|
|
struct at803x_priv *priv = phydev->priv;
|
|
|
|
/*
|
|
- * Conduct a hardware reset for AT8030 every time a link loss is
|
|
+ * Conduct a hardware reset for AT8030/2 every time a link loss is
|
|
* signalled. This is necessary to circumvent a hardware bug that
|
|
* occurs when the cable is unplugged while TX packets are pending
|
|
* in the FIFO. In such cases, the FIFO enters an error mode it
|
|
@@ -447,6 +449,24 @@ static struct phy_driver at803x_driver[]
|
|
.aneg_done = at803x_aneg_done,
|
|
.ack_interrupt = &at803x_ack_interrupt,
|
|
.config_intr = &at803x_config_intr,
|
|
+}, {
|
|
+ /* ATHEROS 8032 */
|
|
+ .phy_id = ATH8032_PHY_ID,
|
|
+ .name = "Atheros 8032 ethernet",
|
|
+ .phy_id_mask = 0xffffffef,
|
|
+ .probe = at803x_probe,
|
|
+ .config_init = at803x_config_init,
|
|
+ .link_change_notify = at803x_link_change_notify,
|
|
+ .set_wol = at803x_set_wol,
|
|
+ .get_wol = at803x_get_wol,
|
|
+ .suspend = at803x_suspend,
|
|
+ .resume = at803x_resume,
|
|
+ .features = PHY_BASIC_FEATURES,
|
|
+ .flags = PHY_HAS_INTERRUPT,
|
|
+ .config_aneg = genphy_config_aneg,
|
|
+ .read_status = genphy_read_status,
|
|
+ .ack_interrupt = at803x_ack_interrupt,
|
|
+ .config_intr = at803x_config_intr,
|
|
} };
|
|
|
|
module_phy_driver(at803x_driver);
|
|
@@ -454,6 +474,7 @@ module_phy_driver(at803x_driver);
|
|
static struct mdio_device_id __maybe_unused atheros_tbl[] = {
|
|
{ ATH8030_PHY_ID, 0xffffffef },
|
|
{ ATH8031_PHY_ID, 0xffffffef },
|
|
+ { ATH8032_PHY_ID, 0xffffffef },
|
|
{ ATH8035_PHY_ID, 0xffffffef },
|
|
{ }
|
|
};
|