|
|
@@ -0,0 +1,66 @@
|
|
|
+From 97ca310aa18a93329ef5cd68c20de89761962f45 Mon Sep 17 00:00:00 2001
|
|
|
+From: David Bauer <[email protected]>
|
|
|
+Date: Sun, 13 Jun 2021 12:19:36 +0200
|
|
|
+Subject: [PATCH] net: phy: at803x: fix feature detection
|
|
|
+
|
|
|
+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 <[email protected]>
|
|
|
+---
|
|
|
+ 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
|
|
|
+@@ -411,6 +411,34 @@ static int at803x_aneg_done(struct phy_d
|
|
|
+ return aneg_done;
|
|
|
+ }
|
|
|
+
|
|
|
++static int at803x_get_features(struct phy_device *phydev)
|
|
|
++{
|
|
|
++ int err;
|
|
|
++
|
|
|
++ err = genphy_read_abilities(phydev);
|
|
|
++ if (err)
|
|
|
++ return err;
|
|
|
++
|
|
|
++ if (!(phydev->phy_id & phydev->drv->phy_id_mask) == (ATH8031_PHY_ID & phydev->drv->phy_id_mask))
|
|
|
++ 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_read_status(struct phy_device *phydev)
|
|
|
+ {
|
|
|
+ int ss, err, old_link = phydev->link;
|
|
|
+@@ -513,7 +541,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,
|