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>
This commit is contained in:
committed by
Jakub Kicinski
parent
5cf7797526
commit
c000dca098
@@ -19,6 +19,20 @@ static struct mtk_pcs *pcs_to_mtk_pcs(struct phylink_pcs *pcs)
|
|||||||
return container_of(pcs, struct mtk_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 */
|
/* For SGMII interface mode */
|
||||||
static void mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs)
|
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 = {
|
static const struct phylink_pcs_ops mtk_pcs_ops = {
|
||||||
|
.pcs_get_state = mtk_pcs_get_state,
|
||||||
.pcs_config = mtk_pcs_config,
|
.pcs_config = mtk_pcs_config,
|
||||||
.pcs_an_restart = mtk_pcs_restart_an,
|
.pcs_an_restart = mtk_pcs_restart_an,
|
||||||
.pcs_link_up = mtk_pcs_link_up,
|
.pcs_link_up = mtk_pcs_link_up,
|
||||||
|
Reference in New Issue
Block a user