⬢ DragonFlyBSD Kernel Audit
DF-4160 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/netif/xe/if_xe.c
+++ b/sys/dev/netif/xe/if_xe.c
@@ -1634,9 +1634,16 @@ xe_mii_init(struct xe_softc *scp) {
 
     /* Reset the PHY */
     xe_phy_writereg(scp, PHY_BMCR, PHY_BMCR_RESET);
     DELAY(500);
-    while(xe_phy_readreg(scp, PHY_BMCR) & PHY_BMCR_RESET);
+    {
+	int i;
+	for (i = 0; i < 1000; i++) {
+		if (!(xe_phy_readreg(scp, PHY_BMCR) & PHY_BMCR_RESET))
+			break;
+		DELAY(1000);
+	}
+	if (i == 1000)
+		return 0;	/* stuck-reset PHY: treat as absent */
+    }
     XE_MII_DUMP(scp);
     return 1;
 }