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

Commit 7b065f91 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller
Browse files

sfc: Fix test for MDIO read failure



Commit 27dd2cac changed
mdio_clause45_check_mmds() to read both DEVS0 and DEVS1 registers and
to combine their values into an unsigned 32-bit mask.  This made the
following test for a negative (failure) value useless.  Fix it to
check whether either read failed.

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 22ef02c2
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -125,24 +125,25 @@ int mdio_clause45_wait_reset_mmds(struct efx_nic *efx,
int mdio_clause45_check_mmds(struct efx_nic *efx,
			     unsigned int mmd_mask, unsigned int fatal_mask)
{
	int mmd = 0, probe_mmd, devs0, devs1;
	u32 devices;
	int mmd = 0, probe_mmd;

	/* Historically we have probed the PHYXS to find out what devices are
	 * present,but that doesn't work so well if the PHYXS isn't expected
	 * to exist, if so just find the first item in the list supplied. */
	probe_mmd = (mmd_mask & MDIO_MMDREG_DEVS_PHYXS) ? MDIO_MMD_PHYXS :
	    __ffs(mmd_mask);
	devices = (mdio_clause45_read(efx, efx->mii.phy_id,
				      probe_mmd, MDIO_MMDREG_DEVS0) |
		   mdio_clause45_read(efx, efx->mii.phy_id,
				      probe_mmd, MDIO_MMDREG_DEVS1) << 16);

	/* Check all the expected MMDs are present */
	if (devices < 0) {
	devs0 = mdio_clause45_read(efx, efx->mii.phy_id,
				   probe_mmd, MDIO_MMDREG_DEVS0);
	devs1 = mdio_clause45_read(efx, efx->mii.phy_id,
				   probe_mmd, MDIO_MMDREG_DEVS1);
	if (devs0 < 0 || devs1 < 0) {
		EFX_ERR(efx, "failed to read devices present\n");
		return -EIO;
	}
	devices = devs0 | (devs1 << 16);
	if ((devices & mmd_mask) != mmd_mask) {
		EFX_ERR(efx, "required MMDs not present: got %x, "
			"wanted %x\n", devices, mmd_mask);