Commit 0c7ed1f9 authored by Tobias Waldekranz's avatar Tobias Waldekranz Committed by Jakub Kicinski
Browse files

net: dsa: mv88e6xxx: Restore USXGMII support for 6393X



In 4a562127, 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: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Tested-by: default avatarMichal Smulski <michal.smulski@ooma.com>
Reviewed-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Fixes: e5b732a2 ("net: dsa: mv88e6xxx: convert 88e639x to phylink_pcs")
Signed-off-by: default avatarTobias Waldekranz <tobias@waldekranz.com>
Link: https://lore.kernel.org/r/20231205221359.3926018-1-tobias@waldekranz.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3d501dd3
Loading
Loading
Loading
Loading
+29 −2
Original line number Diff line number Diff line
@@ -465,6 +465,7 @@ mv88e639x_pcs_select(struct mv88e6xxx_chip *chip, int port,
	case PHY_INTERFACE_MODE_10GBASER:
	case PHY_INTERFACE_MODE_XAUI:
	case PHY_INTERFACE_MODE_RXAUI:
	case PHY_INTERFACE_MODE_USXGMII:
		return &mpcs->xg_pcs;

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

	if (interface == PHY_INTERFACE_MODE_10GBASER) {
	if (interface == PHY_INTERFACE_MODE_10GBASER ||
	    interface == PHY_INTERFACE_MODE_USXGMII) {
		err = mv88e6393x_erratum_5_2(mpcs);
		if (err)
			return err;
@@ -886,12 +888,37 @@ static int mv88e6393x_xg_pcs_post_config(struct phylink_pcs *pcs,
	return mv88e639x_xg_pcs_enable(mpcs);
}

static void mv88e6393x_xg_pcs_get_state(struct phylink_pcs *pcs,
					struct phylink_link_state *state)
{
	struct mv88e639x_pcs *mpcs = xg_pcs_to_mv88e639x_pcs(pcs);
	u16 status, lp_status;
	int err;

	if (state->interface != PHY_INTERFACE_MODE_USXGMII)
		return mv88e639x_xg_pcs_get_state(pcs, state);

	state->link = false;

	err = mv88e639x_read(mpcs, MV88E6390_USXGMII_PHY_STATUS, &status);
	err = err ? : mv88e639x_read(mpcs, MV88E6390_USXGMII_LP_STATUS, &lp_status);
	if (err) {
		dev_err(mpcs->mdio.dev.parent,
			"can't read USXGMII status: %pe\n", ERR_PTR(err));
		return;
	}

	state->link = !!(status & MDIO_USXGMII_LINK);
	state->an_complete = state->link;
	phylink_decode_usxgmii_word(state, lp_status);
}

static const struct phylink_pcs_ops mv88e6393x_xg_pcs_ops = {
	.pcs_enable = mv88e6393x_xg_pcs_enable,
	.pcs_disable = mv88e6393x_xg_pcs_disable,
	.pcs_pre_config = mv88e6393x_xg_pcs_pre_config,
	.pcs_post_config = mv88e6393x_xg_pcs_post_config,
	.pcs_get_state = mv88e639x_xg_pcs_get_state,
	.pcs_get_state = mv88e6393x_xg_pcs_get_state,
	.pcs_config = mv88e639x_xg_pcs_config,
};