Commit 6f7b89b4 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Jakub Kicinski
Browse files

net: pcs: xpcs: clean up reading clause 73 link partner advertisement



Read the clause 73 link partner advertisement in a loop and then
translate to the ethtool modes.

Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent dad98748
Loading
Loading
Loading
Loading
+17 −22
Original line number Original line Diff line number Diff line
@@ -487,7 +487,7 @@ static int xpcs_aneg_done_c73(struct dw_xpcs *xpcs,
		return ret;
		return ret;


	if (ret & MDIO_AN_STAT1_COMPLETE) {
	if (ret & MDIO_AN_STAT1_COMPLETE) {
		ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL1);
		ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_AN_LPA);
		if (ret < 0)
		if (ret < 0)
			return ret;
			return ret;


@@ -506,7 +506,8 @@ static int xpcs_aneg_done_c73(struct dw_xpcs *xpcs,
static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs,
static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs,
			     struct phylink_link_state *state)
			     struct phylink_link_state *state)
{
{
	int ret;
	u16 lpa[3];
	int i, ret;


	ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1);
	ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1);
	if (ret < 0)
	if (ret < 0)
@@ -519,32 +520,26 @@ static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs,


	phylink_set(state->lp_advertising, Autoneg);
	phylink_set(state->lp_advertising, Autoneg);


	/* Clause 73 outcome */
	/* Read Clause 73 link partner advertisement */
	ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL3);
	for (i = ARRAY_SIZE(lpa); --i >= 0; ) {
		ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_AN_LPA + i);
		if (ret < 0)
		if (ret < 0)
			return ret;
			return ret;


	if (ret & DW_C73_2500KX)
		lpa[i] = ret;
		phylink_set(state->lp_advertising, 2500baseX_Full);
	}

	ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL2);
	if (ret < 0)
		return ret;


	if (ret & DW_C73_1000KX)
	if (lpa[2] & DW_C73_2500KX)
		phylink_set(state->lp_advertising, 2500baseX_Full);
	if (lpa[1] & DW_C73_1000KX)
		phylink_set(state->lp_advertising, 1000baseKX_Full);
		phylink_set(state->lp_advertising, 1000baseKX_Full);
	if (ret & DW_C73_10000KX4)
	if (lpa[1] & DW_C73_10000KX4)
		phylink_set(state->lp_advertising, 10000baseKX4_Full);
		phylink_set(state->lp_advertising, 10000baseKX4_Full);
	if (ret & DW_C73_10000KR)
	if (lpa[1] & DW_C73_10000KR)
		phylink_set(state->lp_advertising, 10000baseKR_Full);
		phylink_set(state->lp_advertising, 10000baseKR_Full);

	if (lpa[0] & DW_C73_PAUSE)
	ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL1);
	if (ret < 0)
		return ret;

	if (ret & DW_C73_PAUSE)
		phylink_set(state->lp_advertising, Pause);
		phylink_set(state->lp_advertising, Pause);
	if (ret & DW_C73_ASYM_PAUSE)
	if (lpa[0] & DW_C73_ASYM_PAUSE)
		phylink_set(state->lp_advertising, Asym_Pause);
		phylink_set(state->lp_advertising, Asym_Pause);


	linkmode_and(state->lp_advertising, state->lp_advertising,
	linkmode_and(state->lp_advertising, state->lp_advertising,
+0 −3
Original line number Original line Diff line number Diff line
@@ -32,9 +32,6 @@
#define DW_SR_AN_ADV1			0x10
#define DW_SR_AN_ADV1			0x10
#define DW_SR_AN_ADV2			0x11
#define DW_SR_AN_ADV2			0x11
#define DW_SR_AN_ADV3			0x12
#define DW_SR_AN_ADV3			0x12
#define DW_SR_AN_LP_ABL1		0x13
#define DW_SR_AN_LP_ABL2		0x14
#define DW_SR_AN_LP_ABL3		0x15


/* Clause 73 Defines */
/* Clause 73 Defines */
/* AN_LP_ABL1 */
/* AN_LP_ABL1 */