aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch')
-rw-r--r--target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch141
1 files changed, 141 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch b/target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch
new file mode 100644
index 0000000000..681022078c
--- /dev/null
+++ b/target/linux/generic/backport-5.15/750-v6.5-02-net-ethernet-mtk_eth_soc-remove-incorrect-PLL-config.patch
@@ -0,0 +1,141 @@
+From 8cfa2576d79f9379d167a8994f0fca935c07a8bc Mon Sep 17 00:00:00 2001
+From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
+Date: Sat, 22 Jul 2023 21:32:49 +0100
+Subject: [PATCH 096/250] net: ethernet: mtk_eth_soc: remove incorrect PLL
+ configuration
+
+MT7623 GMAC0 attempts to configure the system clocking according to the
+required speed in the .mac_config callback for non-SGMII, non-baseX and
+non-TRGMII modes.
+
+state->speed setting has never been reliable in the .mac_config
+callback - there are cases where this is not the link speed,
+particularly via ethtool paths, so this has always been unreliable (as
+detailed in phylink's documentation.)
+
+There is the additional issue that mtk_gmac0_rgmii_adjust() will only
+be called if state->interface changes, which means it only configures
+the system clocking on the very first .mac_config call, which will be
+made when the network device is first brought up before any link is
+established.
+
+Essentially, this code is incredibly buggy, and probably never worked.
+
+Moreover, checking the in-kernel DT files, it seems no platform makes
+use of this code path.
+
+Therefore, let's remove it, and disable interface modes for port 0 that
+are not SGMII, 1000base-X, 2500base-X or TRGMII on the MT7623.
+
+Reviewed-by: Daniel Golle <daniel@makrotopia.org>
+Tested-by: Daniel Golle <daniel@makrotopia.org>
+Tested-by: Frank Wunderlich <frank-w@public-files.de>
+Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 54 ++++++---------------
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 +
+ 2 files changed, 17 insertions(+), 38 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -309,7 +309,7 @@ static int mt7621_gmac0_rgmii_adjust(str
+ }
+
+ static void mtk_gmac0_rgmii_adjust(struct mtk_eth *eth,
+- phy_interface_t interface, int speed)
++ phy_interface_t interface)
+ {
+ u32 val;
+ int ret;
+@@ -323,26 +323,7 @@ static void mtk_gmac0_rgmii_adjust(struc
+ return;
+ }
+
+- val = (speed == SPEED_1000) ?
+- INTF_MODE_RGMII_1000 : INTF_MODE_RGMII_10_100;
+- mtk_w32(eth, val, INTF_MODE);
+-
+- regmap_update_bits(eth->ethsys, ETHSYS_CLKCFG0,
+- ETHSYS_TRGMII_CLK_SEL362_5,
+- ETHSYS_TRGMII_CLK_SEL362_5);
+-
+- val = (speed == SPEED_1000) ? 250000000 : 500000000;
+- ret = clk_set_rate(eth->clks[MTK_CLK_TRGPLL], val);
+- if (ret)
+- dev_err(eth->dev, "Failed to set trgmii pll: %d\n", ret);
+-
+- val = (speed == SPEED_1000) ?
+- RCK_CTRL_RGMII_1000 : RCK_CTRL_RGMII_10_100;
+- mtk_w32(eth, val, TRGMII_RCK_CTRL);
+-
+- val = (speed == SPEED_1000) ?
+- TCK_CTRL_RGMII_1000 : TCK_CTRL_RGMII_10_100;
+- mtk_w32(eth, val, TRGMII_TCK_CTRL);
++ dev_err(eth->dev, "Missing PLL configuration, ethernet may not work\n");
+ }
+
+ static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config,
+@@ -428,17 +409,8 @@ static void mtk_mac_config(struct phylin
+ state->interface))
+ goto err_phy;
+ } else {
+- /* FIXME: this is incorrect. Not only does it
+- * use state->speed (which is not guaranteed
+- * to be correct) but it also makes use of it
+- * in a code path that will only be reachable
+- * when the PHY interface mode changes, not
+- * when the speed changes. Consequently, RGMII
+- * is probably broken.
+- */
+ mtk_gmac0_rgmii_adjust(mac->hw,
+- state->interface,
+- state->speed);
++ state->interface);
+
+ /* mt7623_pad_clk_setup */
+ for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
+@@ -4286,13 +4258,19 @@ static int mtk_add_mac(struct mtk_eth *e
+ mac->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
+ MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD;
+
+- __set_bit(PHY_INTERFACE_MODE_MII,
+- mac->phylink_config.supported_interfaces);
+- __set_bit(PHY_INTERFACE_MODE_GMII,
+- mac->phylink_config.supported_interfaces);
++ /* MT7623 gmac0 is now missing its speed-specific PLL configuration
++ * in its .mac_config method (since state->speed is not valid there.
++ * Disable support for MII, GMII and RGMII.
++ */
++ if (!mac->hw->soc->disable_pll_modes || mac->id != 0) {
++ __set_bit(PHY_INTERFACE_MODE_MII,
++ mac->phylink_config.supported_interfaces);
++ __set_bit(PHY_INTERFACE_MODE_GMII,
++ mac->phylink_config.supported_interfaces);
+
+- if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_RGMII))
+- phy_interface_set_rgmii(mac->phylink_config.supported_interfaces);
++ if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_RGMII))
++ phy_interface_set_rgmii(mac->phylink_config.supported_interfaces);
++ }
+
+ if (MTK_HAS_CAPS(mac->hw->soc->caps, MTK_TRGMII) && !mac->id)
+ __set_bit(PHY_INTERFACE_MODE_TRGMII,
+@@ -4752,6 +4730,7 @@ static const struct mtk_soc_data mt7623_
+ .offload_version = 1,
+ .hash_offset = 2,
+ .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE,
++ .disable_pll_modes = true,
+ .txrx = {
+ .txd_size = sizeof(struct mtk_tx_dma),
+ .rxd_size = sizeof(struct mtk_rx_dma),
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+@@ -1027,6 +1027,7 @@ struct mtk_soc_data {
+ u16 foe_entry_size;
+ netdev_features_t hw_features;
+ bool has_accounting;
++ bool disable_pll_modes;
+ struct {
+ u32 txd_size;
+ u32 rxd_size;