mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 08:21:14 +00:00
54 lines
1.9 KiB
Diff
54 lines
1.9 KiB
Diff
|
From 880d1311335120f64447ca9d11933872d734e19a Mon Sep 17 00:00:00 2001
|
||
|
From: Daniel Golle <daniel@makrotopia.org>
|
||
|
Date: Mon, 27 Mar 2023 18:41:54 +0100
|
||
|
Subject: [PATCH] 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@makrotopia.org>
|
||
|
|
||
|
--- 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;
|