Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a461103b authored by Ben Hutchings's avatar Ben Hutchings
Browse files

sfc: Do not read STAT1.FAULT in efx_mdio_check_mmd()



This field does not exist in all MMDs we want to check, and all
callers allow it to be set (fault_fatal = 0).

Remove the loopback condition, as STAT2.DEVPRST should be valid
regardless of any fault.

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent e5f0fd27
Loading
Loading
Loading
Loading
+5 −27
Original line number Diff line number Diff line
@@ -51,13 +51,10 @@ int efx_mdio_reset_mmd(struct efx_nic *port, int mmd,
	return spins ? spins : -ETIMEDOUT;
}

static int efx_mdio_check_mmd(struct efx_nic *efx, int mmd, int fault_fatal)
static int efx_mdio_check_mmd(struct efx_nic *efx, int mmd)
{
	int status;

	if (LOOPBACK_INTERNAL(efx))
		return 0;

	if (mmd != MDIO_MMD_AN) {
		/* Read MMD STATUS2 to check it is responding. */
		status = efx_mdio_read(efx, mmd, MDIO_STAT2);
@@ -68,20 +65,6 @@ static int efx_mdio_check_mmd(struct efx_nic *efx, int mmd, int fault_fatal)
		}
	}

	/* Read MMD STATUS 1 to check for fault. */
	status = efx_mdio_read(efx, mmd, MDIO_STAT1);
	if (status & MDIO_STAT1_FAULT) {
		if (fault_fatal) {
			netif_err(efx, hw, efx->net_dev,
				  "PHY MMD %d reporting fatal"
				  " fault: status %x\n", mmd, status);
			return -EIO;
		} else {
			netif_dbg(efx, hw, efx->net_dev,
				  "PHY MMD %d reporting status"
				  " %x (expected)\n", mmd, status);
		}
	}
	return 0;
}

@@ -130,8 +113,7 @@ int efx_mdio_wait_reset_mmds(struct efx_nic *efx, unsigned int mmd_mask)
	return rc;
}

int efx_mdio_check_mmds(struct efx_nic *efx,
			unsigned int mmd_mask, unsigned int fatal_mask)
int efx_mdio_check_mmds(struct efx_nic *efx, unsigned int mmd_mask)
{
	int mmd = 0, probe_mmd, devs1, devs2;
	u32 devices;
@@ -161,13 +143,9 @@ int efx_mdio_check_mmds(struct efx_nic *efx,

	/* Check all required MMDs are responding and happy. */
	while (mmd_mask) {
		if (mmd_mask & 1) {
			int fault_fatal = fatal_mask & 1;
			if (efx_mdio_check_mmd(efx, mmd, fault_fatal))
		if ((mmd_mask & 1) && efx_mdio_check_mmd(efx, mmd))
			return -EIO;
		}
		mmd_mask = mmd_mask >> 1;
		fatal_mask = fatal_mask >> 1;
		mmd++;
	}

@@ -337,7 +315,7 @@ int efx_mdio_test_alive(struct efx_nic *efx)
			  "no MDIO PHY present with ID %d\n", efx->mdio.prtad);
		rc = -EINVAL;
	} else {
		rc = efx_mdio_check_mmds(efx, efx->mdio.mmds, 0);
		rc = efx_mdio_check_mmds(efx, efx->mdio.mmds);
	}

	mutex_unlock(&efx->mac_lock);
+1 −2
Original line number Diff line number Diff line
@@ -68,8 +68,7 @@ extern int efx_mdio_reset_mmd(struct efx_nic *efx, int mmd,
			      int spins, int spintime);

/* As efx_mdio_check_mmd but for multiple MMDs */
int efx_mdio_check_mmds(struct efx_nic *efx,
			unsigned int mmd_mask, unsigned int fatal_mask);
int efx_mdio_check_mmds(struct efx_nic *efx, unsigned int mmd_mask);

/* Check the link status of specified mmds in bit mask */
extern bool efx_mdio_links_ok(struct efx_nic *efx, unsigned int mmd_mask);
+1 −1
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ static int tenxpress_phy_init(struct efx_nic *efx)
		if (rc < 0)
			return rc;

		rc = efx_mdio_check_mmds(efx, TENXPRESS_REQUIRED_DEVS, 0);
		rc = efx_mdio_check_mmds(efx, TENXPRESS_REQUIRED_DEVS);
		if (rc < 0)
			return rc;
	}
+1 −1
Original line number Diff line number Diff line
@@ -193,7 +193,7 @@ static int txc_reset_phy(struct efx_nic *efx)
		goto fail;

	/* Check that all the MMDs we expect are present and responding. */
	rc = efx_mdio_check_mmds(efx, TXC_REQUIRED_DEVS, 0);
	rc = efx_mdio_check_mmds(efx, TXC_REQUIRED_DEVS);
	if (rc < 0)
		goto fail;