diff options
| author | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2022-10-27 14:10:52 +0100 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2022-10-28 21:48:30 -0700 | 
| commit | c000dca098002da193b98099df051c9ead0cacb4 (patch) | |
| tree | fa29b4fac8aed47699bd97757fd4b26fedd5382c | |
| parent | 5cf7797526ee81bea0f627bccaa3d887f48f53e0 (diff) | |
net: mtk_eth_soc: add pcs_get_state() implementation
Add a pcs_get_state() implementation which uses the advertisements
to compute the resulting link modes, and BMSR contents to determine
negotiation and link status.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | drivers/net/ethernet/mediatek/mtk_sgmii.c | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/drivers/net/ethernet/mediatek/mtk_sgmii.c b/drivers/net/ethernet/mediatek/mtk_sgmii.c index 7637ba16b44b..63785bd9a118 100644 --- a/drivers/net/ethernet/mediatek/mtk_sgmii.c +++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c @@ -19,6 +19,20 @@ static struct mtk_pcs *pcs_to_mtk_pcs(struct phylink_pcs *pcs)  	return container_of(pcs, struct mtk_pcs, pcs);  } +static void mtk_pcs_get_state(struct phylink_pcs *pcs, +			      struct phylink_link_state *state) +{ +	struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs); +	unsigned int bm, adv; + +	/* Read the BMSR and LPA */ +	regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &bm); +	regmap_read(mpcs->regmap, SGMSYS_PCS_ADVERTISE, &adv); + +	phylink_mii_c22_pcs_decode_state(state, FIELD_GET(SGMII_BMSR, bm), +					 FIELD_GET(SGMII_LPA, adv)); +} +  /* For SGMII interface mode */  static void mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs)  { @@ -117,6 +131,7 @@ static void mtk_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode,  }  static const struct phylink_pcs_ops mtk_pcs_ops = { +	.pcs_get_state = mtk_pcs_get_state,  	.pcs_config = mtk_pcs_config,  	.pcs_an_restart = mtk_pcs_restart_an,  	.pcs_link_up = mtk_pcs_link_up, | 
