b03f0feab271aa7c17d9b73686cb65c69f0ddfe1
[openwrt/staging/dedeckeh.git] / target / linux / generic / hack-5.15 / 750-net-pcs-mtk-lynxi-workaround-2500BaseX-no-an.patch
1 --- a/drivers/net/pcs/pcs-mtk-lynxi.c
2 +++ b/drivers/net/pcs/pcs-mtk-lynxi.c
3 @@ -92,14 +92,23 @@ static void mtk_pcs_lynxi_get_state(stru
4 struct phylink_link_state *state)
5 {
6 struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs);
7 - unsigned int bm, adv;
8 + unsigned int bm, bmsr, adv;
9
10 /* Read the BMSR and LPA */
11 regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &bm);
12 - regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv);
13 + bmsr = FIELD_GET(SGMII_BMSR, bm);
14 +
15 + if (state->interface == PHY_INTERFACE_MODE_2500BASEX) {
16 + state->link = !!(bmsr & BMSR_LSTATUS);
17 + state->an_complete = !!(bmsr & BMSR_ANEGCOMPLETE);
18 + state->speed = SPEED_2500;
19 + state->duplex = DUPLEX_FULL;
20
21 - phylink_mii_c22_pcs_decode_state(state, FIELD_GET(SGMII_BMSR, bm),
22 - FIELD_GET(SGMII_LPA, adv));
23 + return;
24 + }
25 +
26 + regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv);
27 + phylink_mii_c22_pcs_decode_state(state, bmsr, FIELD_GET(SGMII_LPA, adv));
28 }
29
30 static int mtk_pcs_lynxi_config(struct phylink_pcs *pcs, unsigned int mode,
31 @@ -134,7 +143,8 @@ static int mtk_pcs_lynxi_config(struct p
32 /* 1000base-X or 2500base-X autoneg */
33 sgm_mode = SGMII_REMOTE_FAULT_DIS;
34 use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
35 - advertising);
36 + advertising) &&
37 + !(interface == PHY_INTERFACE_MODE_2500BASEX);
38 } else {
39 /* 1000base-X or 2500base-X without autoneg */
40 sgm_mode = 0;