generic: 5.10: replace pending 730-net-phy-at803x-fix... with upstream
[openwrt/staging/dedeckeh.git] / target / linux / generic / backport-5.10 / 729-v5.14-net-phy-at803x-mask-1000-Base-X-link-mode.patch
diff --git a/target/linux/generic/backport-5.10/729-v5.14-net-phy-at803x-mask-1000-Base-X-link-mode.patch b/target/linux/generic/backport-5.10/729-v5.14-net-phy-at803x-mask-1000-Base-X-link-mode.patch
new file mode 100644 (file)
index 0000000..a977db0
--- /dev/null
@@ -0,0 +1,68 @@
+From b856150c8098f12996ee81c3ab2a65adbaeeb3ec Mon Sep 17 00:00:00 2001
+From: David Bauer <mail@david-bauer.net>
+Date: Sun, 27 Jun 2021 12:16:07 +0200
+Subject: [PATCH] net: phy: at803x: mask 1000 Base-X link mode
+
+AR8031/AR8033 have different status registers for copper
+and fiber operation. However, the extended status register
+is the same for both operation modes.
+
+As a result of that, ESTATUS_1000_XFULL is set to 1 even when
+operating in copper TP mode.
+
+Remove this mode from the supported link modes, as this driver
+currently only supports copper operation.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/phy/at803x.c | 30 +++++++++++++++++++++++++++++-
+ 1 file changed, 29 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/phy/at803x.c
++++ b/drivers/net/phy/at803x.c
+@@ -583,6 +583,34 @@ static void at803x_remove(struct phy_dev
+               regulator_disable(priv->vddio);
+ }
++static int at803x_get_features(struct phy_device *phydev)
++{
++      int err;
++
++      err = genphy_read_abilities(phydev);
++      if (err)
++              return err;
++
++      if (!at803x_match_phy_id(phydev, ATH8031_PHY_ID))
++              return 0;
++
++      /* AR8031/AR8033 have different status registers
++       * for copper and fiber operation. However, the
++       * extended status register is the same for both
++       * operation modes.
++       *
++       * As a result of that, ESTATUS_1000_XFULL is set
++       * to 1 even when operating in copper TP mode.
++       *
++       * Remove this mode from the supported link modes,
++       * as this driver currently only supports copper
++       * operation.
++       */
++      linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
++                         phydev->supported);
++      return 0;
++}
++
+ static int at803x_clk_out_config(struct phy_device *phydev)
+ {
+       struct at803x_priv *priv = phydev->priv;
+@@ -1156,7 +1184,7 @@ static struct phy_driver at803x_driver[]
+       .resume                 = at803x_resume,
+       .read_page              = at803x_read_page,
+       .write_page             = at803x_write_page,
+-      /* PHY_GBIT_FEATURES */
++      .get_features           = at803x_get_features,
+       .read_status            = at803x_read_status,
+       .aneg_done              = at803x_aneg_done,
+       .ack_interrupt          = &at803x_ack_interrupt,