mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 17:01:14 +00:00
c93c5365c0
Pick patches with several fixes and improvements, preparation for upcoming WED (TX) [1] as well as basic XDP support [2] with MediaTek's Filogic SoCs to the mtk_eth_soc driver. Also pick follow-up patch fixing Ethernet on MT7621 [3]. Tested on Bananapi BPi-R3 (MT7986), Bananapi BPi-R64 (MT7622), Bananapi BPi-R2 (MT7623), MikroTik RouterBoard M11G (MT7621). [1]: https://patchwork.kernel.org/project/netdevbpf/list/?series=662108&state=* [2]: https://patchwork.kernel.org/project/netdevbpf/list/?series=675368&state=* (the first part of the series adding wed nodes to mt7986a.dtsi was applied to the copy of mt7986a.dtsi in our tree) [3]: https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=5e69163d3b9931098922b3fc2f8e786af8c1f37e Signed-off-by: Daniel Golle <daniel@makrotopia.org>
129 lines
4.1 KiB
Diff
129 lines
4.1 KiB
Diff
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
|
|
@@ -219,13 +219,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)
|
|
@@ -242,12 +264,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)
|
|
@@ -644,6 +687,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
|
|
@@ -330,9 +330,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))
|