Skip to content

Commit 0c7ed1f

Browse files
wkzkuba-moo
authored andcommitted
net: dsa: mv88e6xxx: Restore USXGMII support for 6393X
In 4a56212, USXGMII support was added for 6393X, but this was lost in the PCS conversion (the blamed commit), most likely because these efforts where more or less done in parallel. Restore this feature by porting Michal's patch to fit the new implementation. Reviewed-by: Florian Fainelli <[email protected]> Tested-by: Michal Smulski <[email protected]> Reviewed-by: Vladimir Oltean <[email protected]> Fixes: e5b732a ("net: dsa: mv88e6xxx: convert 88e639x to phylink_pcs") Signed-off-by: Tobias Waldekranz <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 3d501dd commit 0c7ed1f

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

drivers/net/dsa/mv88e6xxx/pcs-639x.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ mv88e639x_pcs_select(struct mv88e6xxx_chip *chip, int port,
465465
case PHY_INTERFACE_MODE_10GBASER:
466466
case PHY_INTERFACE_MODE_XAUI:
467467
case PHY_INTERFACE_MODE_RXAUI:
468+
case PHY_INTERFACE_MODE_USXGMII:
468469
return &mpcs->xg_pcs;
469470

470471
default:
@@ -873,7 +874,8 @@ static int mv88e6393x_xg_pcs_post_config(struct phylink_pcs *pcs,
873874
struct mv88e639x_pcs *mpcs = xg_pcs_to_mv88e639x_pcs(pcs);
874875
int err;
875876

876-
if (interface == PHY_INTERFACE_MODE_10GBASER) {
877+
if (interface == PHY_INTERFACE_MODE_10GBASER ||
878+
interface == PHY_INTERFACE_MODE_USXGMII) {
877879
err = mv88e6393x_erratum_5_2(mpcs);
878880
if (err)
879881
return err;
@@ -886,12 +888,37 @@ static int mv88e6393x_xg_pcs_post_config(struct phylink_pcs *pcs,
886888
return mv88e639x_xg_pcs_enable(mpcs);
887889
}
888890

891+
static void mv88e6393x_xg_pcs_get_state(struct phylink_pcs *pcs,
892+
struct phylink_link_state *state)
893+
{
894+
struct mv88e639x_pcs *mpcs = xg_pcs_to_mv88e639x_pcs(pcs);
895+
u16 status, lp_status;
896+
int err;
897+
898+
if (state->interface != PHY_INTERFACE_MODE_USXGMII)
899+
return mv88e639x_xg_pcs_get_state(pcs, state);
900+
901+
state->link = false;
902+
903+
err = mv88e639x_read(mpcs, MV88E6390_USXGMII_PHY_STATUS, &status);
904+
err = err ? : mv88e639x_read(mpcs, MV88E6390_USXGMII_LP_STATUS, &lp_status);
905+
if (err) {
906+
dev_err(mpcs->mdio.dev.parent,
907+
"can't read USXGMII status: %pe\n", ERR_PTR(err));
908+
return;
909+
}
910+
911+
state->link = !!(status & MDIO_USXGMII_LINK);
912+
state->an_complete = state->link;
913+
phylink_decode_usxgmii_word(state, lp_status);
914+
}
915+
889916
static const struct phylink_pcs_ops mv88e6393x_xg_pcs_ops = {
890917
.pcs_enable = mv88e6393x_xg_pcs_enable,
891918
.pcs_disable = mv88e6393x_xg_pcs_disable,
892919
.pcs_pre_config = mv88e6393x_xg_pcs_pre_config,
893920
.pcs_post_config = mv88e6393x_xg_pcs_post_config,
894-
.pcs_get_state = mv88e639x_xg_pcs_get_state,
921+
.pcs_get_state = mv88e6393x_xg_pcs_get_state,
895922
.pcs_config = mv88e639x_xg_pcs_config,
896923
};
897924

0 commit comments

Comments
 (0)