generic: 6.1: sync mt7530 DSA driver with upstream
[openwrt/openwrt.git] / target / linux / generic / backport-6.1 / 790-41-v6.9-net-dsa-mt7530-get-rid-of-priv-info-cpu_port_config.patch
diff --git a/target/linux/generic/backport-6.1/790-41-v6.9-net-dsa-mt7530-get-rid-of-priv-info-cpu_port_config.patch b/target/linux/generic/backport-6.1/790-41-v6.9-net-dsa-mt7530-get-rid-of-priv-info-cpu_port_config.patch
new file mode 100644 (file)
index 0000000..60b369c
--- /dev/null
@@ -0,0 +1,305 @@
+From 8554f6a7914d28b179671540f527897d85c88809 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <arinc.unal@arinc9.com>
+Date: Fri, 1 Mar 2024 12:43:01 +0200
+Subject: [PATCH 41/48] net: dsa: mt7530: get rid of
+ priv->info->cpu_port_config()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+priv->info->cpu_port_config() is used for MT7531 and the switch on the
+MT7988 SoC. It sets up the ports described as a CPU port earlier than the
+phylink code path would do.
+
+This function is useless as:
+- Configuring the MACs can be done from the phylink_mac_config code path
+  instead.
+- All the link configuration it does on the CPU ports are later undone with
+  the port_enable, phylink_mac_config, and then phylink_mac_link_up code
+  path [1].
+
+priv->p5_interface and priv->p6_interface were being used to prevent
+configuring the MACs from the phylink_mac_config code path. Remove them now
+that they hold no purpose.
+
+Remove priv->info->cpu_port_config(). On mt753x_phylink_mac_config, switch
+to if statements to simplify the code.
+
+Remove the overwriting of the speed and duplex interfaces for certain
+interface modes. Phylink already provides the speed and duplex variables
+with proper values. Phylink already sets the max speed of TRGMII to
+SPEED_1000. Add SPEED_2500 for PHY_INTERFACE_MODE_2500BASEX to where the
+speed and EEE bits are set instead.
+
+On the switch on the MT7988 SoC, PHY_INTERFACE_MODE_INTERNAL is being used
+to describe the interface mode of the 10G MAC, which is of port 6. On
+mt7988_cpu_port_config() PMCR_FORCE_SPEED_1000 was set via the
+PMCR_CPU_PORT_SETTING() mask. Add SPEED_10000 case to where the speed bits
+are set to cover this. No need to add it to where the EEE bits are set as
+the "MT7988A Wi-Fi 7 Generation Router Platform: Datasheet (Open Version)
+v0.1" document shows that these bits don't exist on the MT7530_PMCR_P(6)
+register.
+
+Remove the definition of PMCR_CPU_PORT_SETTING() now that it holds no
+purpose.
+
+Change mt753x_cpu_port_enable() to void now that there're no error cases
+left.
+
+Link: https://lore.kernel.org/netdev/ZHy2jQLesdYFMQtO@shell.armlinux.org.uk/ [1]
+Suggested-by: Russell King (Oracle) <linux@armlinux.org.uk>
+Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+---
+ drivers/net/dsa/mt7530.c | 114 +++------------------------------------
+ drivers/net/dsa/mt7530.h |  11 ----
+ 2 files changed, 7 insertions(+), 118 deletions(-)
+
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -995,18 +995,10 @@ mt753x_trap_frames(struct mt7530_priv *p
+                  MT753X_BPDU_CPU_ONLY);
+ }
+-static int
++static void
+ mt753x_cpu_port_enable(struct dsa_switch *ds, int port)
+ {
+       struct mt7530_priv *priv = ds->priv;
+-      int ret;
+-
+-      /* Setup max capability of CPU port at first */
+-      if (priv->info->cpu_port_config) {
+-              ret = priv->info->cpu_port_config(ds, port);
+-              if (ret)
+-                      return ret;
+-      }
+       /* Enable Mediatek header mode on the cpu port */
+       mt7530_write(priv, MT7530_PVC_P(port),
+@@ -1032,8 +1024,6 @@ mt753x_cpu_port_enable(struct dsa_switch
+       /* Set to fallback mode for independent VLAN learning */
+       mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK,
+                  MT7530_PORT_FALLBACK_MODE);
+-
+-      return 0;
+ }
+ static int
+@@ -2288,8 +2278,6 @@ mt7530_setup(struct dsa_switch *ds)
+       val |= MHWTRAP_MANUAL;
+       mt7530_write(priv, MT7530_MHWTRAP, val);
+-      priv->p6_interface = PHY_INTERFACE_MODE_NA;
+-
+       mt753x_trap_frames(priv);
+       /* Enable and reset MIB counters */
+@@ -2304,9 +2292,7 @@ mt7530_setup(struct dsa_switch *ds)
+               mt7530_set(priv, MT7530_PSC_P(i), SA_DIS);
+               if (dsa_is_cpu_port(ds, i)) {
+-                      ret = mt753x_cpu_port_enable(ds, i);
+-                      if (ret)
+-                              return ret;
++                      mt753x_cpu_port_enable(ds, i);
+               } else {
+                       mt7530_port_disable(ds, i);
+@@ -2410,9 +2396,7 @@ mt7531_setup_common(struct dsa_switch *d
+               mt7530_set(priv, MT7531_DBG_CNT(i), MT7531_DIS_CLR);
+               if (dsa_is_cpu_port(ds, i)) {
+-                      ret = mt753x_cpu_port_enable(ds, i);
+-                      if (ret)
+-                              return ret;
++                      mt753x_cpu_port_enable(ds, i);
+               } else {
+                       mt7530_port_disable(ds, i);
+@@ -2501,10 +2485,6 @@ mt7531_setup(struct dsa_switch *ds)
+       mt7530_rmw(priv, MT7531_GPIO_MODE0, MT7531_GPIO0_MASK,
+                  MT7531_GPIO0_INTERRUPT);
+-      /* Let phylink decide the interface later. */
+-      priv->p5_interface = PHY_INTERFACE_MODE_NA;
+-      priv->p6_interface = PHY_INTERFACE_MODE_NA;
+-
+       /* Enable PHY core PLL, since phy_device has not yet been created
+        * provided for phy_[read,write]_mmd_indirect is called, we provide
+        * our own mt7531_ind_mmd_phy_[read,write] to complete this
+@@ -2716,26 +2696,9 @@ mt753x_phylink_mac_config(struct dsa_swi
+       struct mt7530_priv *priv = ds->priv;
+       u32 mcr_cur, mcr_new;
+-      switch (port) {
+-      case 5:
+-              if (priv->p5_interface == state->interface)
+-                      break;
+-
++      if (port == 5 || port == 6)
+               mt753x_mac_config(ds, port, mode, state);
+-              if (priv->p5_intf_sel != P5_DISABLED)
+-                      priv->p5_interface = state->interface;
+-              break;
+-      case 6:
+-              if (priv->p6_interface == state->interface)
+-                      break;
+-
+-              mt753x_mac_config(ds, port, mode, state);
+-
+-              priv->p6_interface = state->interface;
+-              break;
+-      }
+-
+       mcr_cur = mt7530_read(priv, MT7530_PMCR_P(port));
+       mcr_new = mcr_cur;
+       mcr_new &= ~PMCR_LINK_SETTINGS_MASK;
+@@ -2771,17 +2734,10 @@ static void mt753x_phylink_mac_link_up(s
+       mcr = PMCR_RX_EN | PMCR_TX_EN | PMCR_FORCE_LNK;
+-      /* MT753x MAC works in 1G full duplex mode for all up-clocked
+-       * variants.
+-       */
+-      if (interface == PHY_INTERFACE_MODE_TRGMII ||
+-          (phy_interface_mode_is_8023z(interface))) {
+-              speed = SPEED_1000;
+-              duplex = DUPLEX_FULL;
+-      }
+-
+       switch (speed) {
+       case SPEED_1000:
++      case SPEED_2500:
++      case SPEED_10000:
+               mcr |= PMCR_FORCE_SPEED_1000;
+               break;
+       case SPEED_100:
+@@ -2799,6 +2755,7 @@ static void mt753x_phylink_mac_link_up(s
+       if (mode == MLO_AN_PHY && phydev && phy_init_eee(phydev, false) >= 0) {
+               switch (speed) {
+               case SPEED_1000:
++              case SPEED_2500:
+                       mcr |= PMCR_FORCE_EEE1G;
+                       break;
+               case SPEED_100:
+@@ -2810,61 +2767,6 @@ static void mt753x_phylink_mac_link_up(s
+       mt7530_set(priv, MT7530_PMCR_P(port), mcr);
+ }
+-static int
+-mt7531_cpu_port_config(struct dsa_switch *ds, int port)
+-{
+-      struct mt7530_priv *priv = ds->priv;
+-      phy_interface_t interface;
+-      int speed;
+-
+-      switch (port) {
+-      case 5:
+-              if (!priv->p5_sgmii)
+-                      interface = PHY_INTERFACE_MODE_RGMII;
+-              else
+-                      interface = PHY_INTERFACE_MODE_2500BASEX;
+-
+-              priv->p5_interface = interface;
+-              break;
+-      case 6:
+-              interface = PHY_INTERFACE_MODE_2500BASEX;
+-
+-              priv->p6_interface = interface;
+-              break;
+-      default:
+-              return -EINVAL;
+-      }
+-
+-      if (interface == PHY_INTERFACE_MODE_2500BASEX)
+-              speed = SPEED_2500;
+-      else
+-              speed = SPEED_1000;
+-
+-      mt7531_mac_config(ds, port, MLO_AN_FIXED, interface);
+-
+-      mt7530_write(priv, MT7530_PMCR_P(port),
+-                   PMCR_CPU_PORT_SETTING(priv->id));
+-      mt753x_phylink_mac_link_up(ds, port, MLO_AN_FIXED, interface, NULL,
+-                                 speed, DUPLEX_FULL, true, true);
+-
+-      return 0;
+-}
+-
+-static int
+-mt7988_cpu_port_config(struct dsa_switch *ds, int port)
+-{
+-      struct mt7530_priv *priv = ds->priv;
+-
+-      mt7530_write(priv, MT7530_PMCR_P(port),
+-                   PMCR_CPU_PORT_SETTING(priv->id));
+-
+-      mt753x_phylink_mac_link_up(ds, port, MLO_AN_FIXED,
+-                                 PHY_INTERFACE_MODE_INTERNAL, NULL,
+-                                 SPEED_10000, DUPLEX_FULL, true, true);
+-
+-      return 0;
+-}
+-
+ static void mt753x_phylink_get_caps(struct dsa_switch *ds, int port,
+                                   struct phylink_config *config)
+ {
+@@ -3122,7 +3024,6 @@ const struct mt753x_info mt753x_table[]
+               .sw_setup = mt7531_setup,
+               .phy_read = mt7531_ind_phy_read,
+               .phy_write = mt7531_ind_phy_write,
+-              .cpu_port_config = mt7531_cpu_port_config,
+               .mac_port_get_caps = mt7531_mac_port_get_caps,
+               .mac_port_config = mt7531_mac_config,
+       },
+@@ -3132,7 +3033,6 @@ const struct mt753x_info mt753x_table[]
+               .sw_setup = mt7988_setup,
+               .phy_read = mt7531_ind_phy_read,
+               .phy_write = mt7531_ind_phy_write,
+-              .cpu_port_config = mt7988_cpu_port_config,
+               .mac_port_get_caps = mt7988_mac_port_get_caps,
+       },
+ };
+--- a/drivers/net/dsa/mt7530.h
++++ b/drivers/net/dsa/mt7530.h
+@@ -331,13 +331,6 @@ enum mt7530_vlan_port_acc_frm {
+                                        PMCR_TX_FC_EN | PMCR_RX_FC_EN | \
+                                        PMCR_FORCE_FDX | PMCR_FORCE_LNK | \
+                                        PMCR_FORCE_EEE1G | PMCR_FORCE_EEE100)
+-#define  PMCR_CPU_PORT_SETTING(id)    (PMCR_FORCE_MODE_ID((id)) | \
+-                                       PMCR_IFG_XMIT(1) | PMCR_MAC_MODE | \
+-                                       PMCR_BACKOFF_EN | PMCR_BACKPR_EN | \
+-                                       PMCR_TX_EN | PMCR_RX_EN | \
+-                                       PMCR_TX_FC_EN | PMCR_RX_FC_EN | \
+-                                       PMCR_FORCE_SPEED_1000 | \
+-                                       PMCR_FORCE_FDX | PMCR_FORCE_LNK)
+ #define MT7530_PMEEECR_P(x)           (0x3004 + (x) * 0x100)
+ #define  WAKEUP_TIME_1000(x)          (((x) & 0xFF) << 24)
+@@ -737,7 +730,6 @@ struct mt753x_info {
+       int (*sw_setup)(struct dsa_switch *ds);
+       int (*phy_read)(struct mt7530_priv *priv, int port, int regnum);
+       int (*phy_write)(struct mt7530_priv *priv, int port, int regnum, u16 val);
+-      int (*cpu_port_config)(struct dsa_switch *ds, int port);
+       void (*mac_port_get_caps)(struct dsa_switch *ds, int port,
+                                 struct phylink_config *config);
+       void (*mac_port_validate)(struct dsa_switch *ds, int port,
+@@ -763,7 +755,6 @@ struct mt753x_info {
+  * @ports:            Holding the state among ports
+  * @reg_mutex:                The lock for protecting among process accessing
+  *                    registers
+- * @p6_interface      Holding the current port 6 interface
+  * @p5_intf_sel:      Holding the current port 5 interface select
+  * @p5_sgmii:         Flag for distinguishing if port 5 of the MT7531 switch
+  *                    has got SGMII
+@@ -785,8 +776,6 @@ struct mt7530_priv {
+       const struct mt753x_info *info;
+       unsigned int            id;
+       bool                    mcm;
+-      phy_interface_t         p6_interface;
+-      phy_interface_t         p5_interface;
+       enum p5_interface_select p5_intf_sel;
+       bool                    p5_sgmii;
+       u8                      mirror_rx;