ramips: fix AR8033 fiber operation
authorDavid Bauer <mail@david-bauer.net>
Mon, 14 Jun 2021 22:15:17 +0000 (00:15 +0200)
committerDavid Bauer <mail@david-bauer.net>
Sun, 27 Jun 2021 11:19:36 +0000 (13:19 +0200)
It was reported AR8033 did not work in fiber operation mode on the ER-X.

While the earlier attempt of fixing this mitigated the issue of 1000
Base-X link mode not being supported, it also switched to the copper
page, breaking fiber operation altogether.

Extend the hack adding fiber operation so it does not switch to the
copper page. Also remove the part where the supported link mode bit for
1000 Base-X is removed, as this is required for fiber operation.

Signed-off-by: David Bauer <mail@david-bauer.net>
target/linux/ramips/patches-5.10/710-at803x.patch
target/linux/ramips/patches-5.4/991-at803x.patch

index d15dd929658659f5d95963d7e88c26a74da77854..ec8f3ba55ffc7c1c3cf83c1c5960e6f3c40ffb91 100644 (file)
@@ -118,7 +118,23 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
-@@ -744,6 +818,10 @@ static int at803x_read_status(struct phy
+@@ -554,6 +628,7 @@ static int at803x_probe(struct phy_devic
+                       return ret;
+       }
++#if 0
+       /* Some bootloaders leave the fiber page selected.
+        * Switch to the copper page, as otherwise we read
+        * the PHY capabilities from the fiber side.
+@@ -565,6 +640,7 @@ static int at803x_probe(struct phy_devic
+               if (ret)
+                       goto err;
+       }
++#endif
+       return 0;
+@@ -744,6 +820,10 @@ static int at803x_read_status(struct phy
  {
        int ss, err, old_link = phydev->link;
  
@@ -129,7 +145,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
        /* Update the link, but return if there was an error */
        err = genphy_update_link(phydev);
        if (err)
-@@ -844,6 +922,12 @@ static int at803x_config_aneg(struct phy
+@@ -844,6 +924,12 @@ static int at803x_config_aneg(struct phy
  {
        int ret;
  
@@ -142,7 +158,23 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
        ret = at803x_config_mdix(phydev, phydev->mdix_ctrl);
        if (ret < 0)
                return ret;
-@@ -1145,6 +1229,7 @@ static struct phy_driver at803x_driver[]
+@@ -943,6 +1029,7 @@ static int at803x_get_features(struct ph
+       if (err)
+               return err;
++#if 0
+       if (!at803x_match_phy_id(phydev, ATH8031_PHY_ID))
+               return 0;
+@@ -960,6 +1047,7 @@ static int at803x_get_features(struct ph
+        */
+       linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
+                          phydev->supported);
++#endif
+       return 0;
+ }
+@@ -1173,6 +1261,7 @@ static struct phy_driver at803x_driver[]
        /* Qualcomm Atheros AR8031/AR8033 */
        PHY_ID_MATCH_EXACT(ATH8031_PHY_ID),
        .name                   = "Qualcomm Atheros AR8031/AR8033",
index 4de3118547942d71a3a547bd8ec24278c48b0988..a0d9a03fcffed53eba56c1192aa4893b3222371c 100644 (file)
@@ -42,7 +42,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
  
  #define AT803X_DEBUG_REG_0                    0x00
  #define AT803X_DEBUG_RX_CLK_DLY_EN            BIT(15)
-@@ -274,12 +285,73 @@ static int at803x_resume(struct phy_devi
+@@ -274,18 +285,80 @@ static int at803x_resume(struct phy_devi
        return phy_modify(phydev, MII_BMCR, BMCR_PDOWN | BMCR_ISOLATE, 0);
  }
  
@@ -116,7 +116,38 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
-@@ -415,6 +487,10 @@ static int at803x_read_status(struct phy
+       phydev->priv = priv;
++#if 0
+       /* Some bootloaders leave the fiber page selected.
+        * Switch to the copper page, as otherwise we read
+        * the PHY capabilities from the fiber side.
+@@ -295,6 +368,7 @@ static int at803x_probe(struct phy_devic
+               ret = at803x_write_page(phydev, AT803X_PAGE_COPPER);
+               mutex_unlock(&phydev->mdio.bus->mdio_lock);
+       }
++#endif
+       return ret;
+ }
+@@ -419,6 +493,7 @@ static int at803x_get_features(struct ph
+       if (err)
+               return err;
++#if 0
+       if (!(phydev->phy_id & phydev->drv->phy_id_mask) == (ATH8031_PHY_ID & phydev->drv->phy_id_mask))
+               return 0;
+@@ -436,6 +511,7 @@ static int at803x_get_features(struct ph
+        */
+       linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
+                          phydev->supported);
++#endif
+       return 0;
+ }
+@@ -443,6 +519,10 @@ static int at803x_read_status(struct phy
  {
        int ss, err, old_link = phydev->link;
  
@@ -127,7 +158,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
        /* Update the link, but return if there was an error */
        err = genphy_update_link(phydev);
        if (err)
-@@ -469,6 +545,19 @@ static int at803x_read_status(struct phy
+@@ -497,6 +577,19 @@ static int at803x_read_status(struct phy
        return 0;
  }
  
@@ -147,7 +178,7 @@ Signed-off-by: René van Dorst <opensource@vdorst.com>
  static struct phy_driver at803x_driver[] = {
  {
        /* ATHEROS 8035 */
-@@ -504,6 +593,7 @@ static struct phy_driver at803x_driver[]
+@@ -532,6 +625,7 @@ static struct phy_driver at803x_driver[]
        /* ATHEROS 8031 */
        .phy_id                 = ATH8031_PHY_ID,
        .name                   = "Atheros 8031 ethernet",