[openwrt/openwrt] generic: pcs-mtk-lynxi: add hack to use 2500Base-X without AN

LEDE Commits lede-commits at lists.infradead.org
Mon Mar 27 16:58:26 PDT 2023


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/880d1311335120f64447ca9d11933872d734e19a

commit 880d1311335120f64447ca9d11933872d734e19a
Author: Daniel Golle <daniel at makrotopia.org>
AuthorDate: Mon Mar 27 18:41:54 2023 +0100

    generic: pcs-mtk-lynxi: add hack to use 2500Base-X without AN
    
    Using 2500Base-T SFP modules e.g. on the BananaPi R3 requires manually
    disabling auto-negotiation, e.g. using ethtool. While a proper fix
    using SFP quirks is being discussed upstream, bring a work-around to
    restore user experience to what it was before the switch to the
    dedicated SGMII PCS driver.
    
    Signed-off-by: Daniel Golle <daniel at makrotopia.org>
---
 ...-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch | 40 ++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/target/linux/generic/hack-5.15/750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch b/target/linux/generic/hack-5.15/750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch
new file mode 100644
index 0000000000..b03f0feab2
--- /dev/null
+++ b/target/linux/generic/hack-5.15/750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch
@@ -0,0 +1,40 @@
+--- a/drivers/net/pcs/pcs-mtk-lynxi.c
++++ b/drivers/net/pcs/pcs-mtk-lynxi.c
+@@ -92,14 +92,23 @@ static void mtk_pcs_lynxi_get_state(stru
+ 				    struct phylink_link_state *state)
+ {
+ 	struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs);
+-	unsigned int bm, adv;
++	unsigned int bm, bmsr, adv;
+ 
+ 	/* Read the BMSR and LPA */
+ 	regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &bm);
+-	regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv);
++	bmsr = FIELD_GET(SGMII_BMSR, bm);
++
++	if (state->interface == PHY_INTERFACE_MODE_2500BASEX) {
++		state->link = !!(bmsr & BMSR_LSTATUS);
++		state->an_complete = !!(bmsr & BMSR_ANEGCOMPLETE);
++		state->speed = SPEED_2500;
++		state->duplex = DUPLEX_FULL;
+ 
+-	phylink_mii_c22_pcs_decode_state(state, FIELD_GET(SGMII_BMSR, bm),
+-					 FIELD_GET(SGMII_LPA, adv));
++		return;
++	}
++
++	regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv);
++	phylink_mii_c22_pcs_decode_state(state, bmsr, FIELD_GET(SGMII_LPA, adv));
+ }
+ 
+ static int mtk_pcs_lynxi_config(struct phylink_pcs *pcs, unsigned int mode,
+@@ -134,7 +143,8 @@ static int mtk_pcs_lynxi_config(struct p
+ 		/* 1000base-X or 2500base-X autoneg */
+ 		sgm_mode = SGMII_REMOTE_FAULT_DIS;
+ 		use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
+-					   advertising);
++					   advertising) &&
++			 !(interface == PHY_INTERFACE_MODE_2500BASEX);
+ 	} else {
+ 		/* 1000base-X or 2500base-X without autoneg */
+ 		sgm_mode = 0;




More information about the lede-commits mailing list