aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mediatek/patches-5.10/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mediatek/patches-5.10/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch')
-rw-r--r--target/linux/mediatek/patches-5.10/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch128
1 files changed, 128 insertions, 0 deletions
diff --git a/target/linux/mediatek/patches-5.10/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch b/target/linux/mediatek/patches-5.10/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch
new file mode 100644
index 0000000000..88c600f791
--- /dev/null
+++ b/target/linux/mediatek/patches-5.10/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch
@@ -0,0 +1,128 @@
+From e2e7f6e29c99a1c6afc0e0aa4b9ea80302d28720 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Tue, 4 Jan 2022 12:07:46 +0000
+Subject: [PATCH 3/3] net: ethernet: mtk_eth_soc: implement Clause 45 MDIO
+ access
+
+Implement read and write access to IEEE 802.3 Clause 45 Ethernet
+phy registers while making use of new mdiobus_c45_regad and
+mdiobus_c45_devad helpers.
+
+Tested on the Ubiquiti UniFi 6 LR access point featuring
+MediaTek MT7622BV WiSoC with Aquantia AQR112C.
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 70 +++++++++++++++++----
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 3 +
+ 2 files changed, 60 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -104,13 +104,35 @@ static int _mtk_mdio_write(struct mtk_et
+ if (ret < 0)
+ return ret;
+
+- mtk_w32(eth, PHY_IAC_ACCESS |
+- PHY_IAC_START_C22 |
+- PHY_IAC_CMD_WRITE |
+- PHY_IAC_REG(phy_reg) |
+- PHY_IAC_ADDR(phy_addr) |
+- PHY_IAC_DATA(write_data),
+- MTK_PHY_IAC);
++ if (phy_reg & MII_ADDR_C45) {
++ mtk_w32(eth, PHY_IAC_ACCESS |
++ PHY_IAC_START_C45 |
++ PHY_IAC_CMD_C45_ADDR |
++ PHY_IAC_REG(mdiobus_c45_devad(phy_reg)) |
++ PHY_IAC_ADDR(phy_addr) |
++ PHY_IAC_DATA(mdiobus_c45_regad(phy_reg)),
++ MTK_PHY_IAC);
++
++ ret = mtk_mdio_busy_wait(eth);
++ if (ret < 0)
++ return ret;
++
++ mtk_w32(eth, PHY_IAC_ACCESS |
++ PHY_IAC_START_C45 |
++ PHY_IAC_CMD_WRITE |
++ PHY_IAC_REG(mdiobus_c45_devad(phy_reg)) |
++ PHY_IAC_ADDR(phy_addr) |
++ PHY_IAC_DATA(write_data),
++ MTK_PHY_IAC);
++ } else {
++ mtk_w32(eth, PHY_IAC_ACCESS |
++ PHY_IAC_START_C22 |
++ PHY_IAC_CMD_WRITE |
++ PHY_IAC_REG(phy_reg) |
++ PHY_IAC_ADDR(phy_addr) |
++ PHY_IAC_DATA(write_data),
++ MTK_PHY_IAC);
++ }
+
+ ret = mtk_mdio_busy_wait(eth);
+ if (ret < 0)
+@@ -127,12 +149,33 @@ static int _mtk_mdio_read(struct mtk_eth
+ if (ret < 0)
+ return ret;
+
+- mtk_w32(eth, PHY_IAC_ACCESS |
+- PHY_IAC_START_C22 |
+- PHY_IAC_CMD_C22_READ |
+- PHY_IAC_REG(phy_reg) |
+- PHY_IAC_ADDR(phy_addr),
+- MTK_PHY_IAC);
++ if (phy_reg & MII_ADDR_C45) {
++ mtk_w32(eth, PHY_IAC_ACCESS |
++ PHY_IAC_START_C45 |
++ PHY_IAC_CMD_C45_ADDR |
++ PHY_IAC_REG(mdiobus_c45_devad(phy_reg)) |
++ PHY_IAC_ADDR(phy_addr) |
++ PHY_IAC_DATA(mdiobus_c45_regad(phy_reg)),
++ MTK_PHY_IAC);
++
++ ret = mtk_mdio_busy_wait(eth);
++ if (ret < 0)
++ return ret;
++
++ mtk_w32(eth, PHY_IAC_ACCESS |
++ PHY_IAC_START_C45 |
++ PHY_IAC_CMD_C45_READ |
++ PHY_IAC_REG(mdiobus_c45_devad(phy_reg)) |
++ PHY_IAC_ADDR(phy_addr),
++ MTK_PHY_IAC);
++ } else {
++ mtk_w32(eth, PHY_IAC_ACCESS |
++ PHY_IAC_START_C22 |
++ PHY_IAC_CMD_C22_READ |
++ PHY_IAC_REG(phy_reg) |
++ PHY_IAC_ADDR(phy_addr),
++ MTK_PHY_IAC);
++ }
+
+ ret = mtk_mdio_busy_wait(eth);
+ if (ret < 0)
+@@ -591,6 +634,7 @@ static int mtk_mdio_init(struct mtk_eth
+ eth->mii_bus->name = "mdio";
+ eth->mii_bus->read = mtk_mdio_read;
+ eth->mii_bus->write = mtk_mdio_write;
++ eth->mii_bus->probe_capabilities = MDIOBUS_C22_C45;
+ eth->mii_bus->priv = eth;
+ eth->mii_bus->parent = eth->dev;
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+@@ -345,9 +345,12 @@
+ #define PHY_IAC_ADDR_MASK GENMASK(24, 20)
+ #define PHY_IAC_ADDR(x) FIELD_PREP(PHY_IAC_ADDR_MASK, (x))
+ #define PHY_IAC_CMD_MASK GENMASK(19, 18)
++#define PHY_IAC_CMD_C45_ADDR FIELD_PREP(PHY_IAC_CMD_MASK, 0)
+ #define PHY_IAC_CMD_WRITE FIELD_PREP(PHY_IAC_CMD_MASK, 1)
+ #define PHY_IAC_CMD_C22_READ FIELD_PREP(PHY_IAC_CMD_MASK, 2)
++#define PHY_IAC_CMD_C45_READ FIELD_PREP(PHY_IAC_CMD_MASK, 3)
+ #define PHY_IAC_START_MASK GENMASK(17, 16)
++#define PHY_IAC_START_C45 FIELD_PREP(PHY_IAC_START_MASK, 0)
+ #define PHY_IAC_START_C22 FIELD_PREP(PHY_IAC_START_MASK, 1)
+ #define PHY_IAC_DATA_MASK GENMASK(15, 0)
+ #define PHY_IAC_DATA(x) FIELD_PREP(PHY_IAC_DATA_MASK, (x))