sfc: Fix unreliable link detection in some loopback modes

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/drivers/net/sfc/tenxpress.c b/drivers/net/sfc/tenxpress.c
index b3ca2dc..1567ab5 100644
--- a/drivers/net/sfc/tenxpress.c
+++ b/drivers/net/sfc/tenxpress.c
@@ -445,14 +445,13 @@
 	int phy_id = efx->mii.phy_id;
 	u32 reg;
 
-	if (efx->loopback_mode == LOOPBACK_GPHY)
-		return true;
-	else if (efx_phy_mode_disabled(efx->phy_mode))
+	if (efx_phy_mode_disabled(efx->phy_mode))
 		return false;
+	else if (efx->loopback_mode == LOOPBACK_GPHY)
+		return true;
 	else if (efx->loopback_mode)
 		return mdio_clause45_links_ok(efx,
 					      MDIO_MMDREG_DEVS_PMAPMD |
-					      MDIO_MMDREG_DEVS_PCS |
 					      MDIO_MMDREG_DEVS_PHYXS);
 
 	/* We must use the same definition of link state as LASI,
@@ -588,6 +587,10 @@
 				change = true;
 		}
 		sfx7101_check_bad_lp(efx, link_ok);
+	} else if (efx->loopback_mode) {
+		bool link_ok = sft9001_link_ok(efx, NULL);
+		if (link_ok != efx->link_up)
+			change = true;
 	} else {
 		u32 status = mdio_clause45_read(efx, efx->mii.phy_id,
 						MDIO_MMD_PMAPMD,