sfc: Fix test for MDIO read failure
authorBen Hutchings <bhutchings@solarflare.com>
Fri, 27 Feb 2009 13:06:12 +0000 (13:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Mar 2009 11:15:02 +0000 (03:15 -0800)
Commit 27dd2caca4eabe7c13a052b7456495ba75535e6a 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: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sfc/mdio_10g.c

index f9e2f95..4462fb5 100644 (file)
@@ -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);