Commit 16ceda2e authored by Raju Rangoju's avatar Raju Rangoju Committed by Jakub Kicinski
Browse files

amd-xgbe: do not double read link status



The link status is latched low so that momentary link drops
can be detected. Always double-reading the status defeats this
design feature. Only double read if link was already down

This prevents unnecessary duplicate readings of the link status.

Fixes: 4f3b20bf ("amd-xgbe: add support for rx-adaptation")
Signed-off-by: default avatarRaju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250701065016.4140707-1-Raju.Rangoju@amd.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 103406b3
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1304,6 +1304,10 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata)

	pdata->phy.link = pdata->phy_if.phy_impl.link_status(pdata,
							     &an_restart);
	/* bail out if the link status register read fails */
	if (pdata->phy.link < 0)
		return;

	if (an_restart) {
		xgbe_phy_config_aneg(pdata);
		goto adjust_link;
+15 −9
Original line number Diff line number Diff line
@@ -2746,8 +2746,7 @@ static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
{
	struct xgbe_phy_data *phy_data = pdata->phy_data;
	unsigned int reg;
	int ret;
	int reg, ret;

	*an_restart = 0;

@@ -2781,11 +2780,20 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
			return 0;
	}

	/* Link status is latched low, so read once to clear
	 * and then read again to get current state
	 */
	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
	if (reg < 0)
		return reg;

	/* Link status is latched low so that momentary link drops
	 * can be detected. If link was already down read again
	 * to get the latest state.
	 */

	if (!pdata->phy.link && !(reg & MDIO_STAT1_LSTATUS)) {
		reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
		if (reg < 0)
			return reg;
	}

	if (pdata->en_rx_adap) {
		/* if the link is available and adaptation is done,
@@ -2804,9 +2812,7 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
			xgbe_phy_set_mode(pdata, phy_data->cur_mode);
		}

		/* check again for the link and adaptation status */
		reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
		if ((reg & MDIO_STAT1_LSTATUS) && pdata->rx_adapt_done)
		if (pdata->rx_adapt_done)
			return 1;
	} else if (reg & MDIO_STAT1_LSTATUS)
		return 1;