--- linux-2.6.23/drivers/net/phy/phy.c.orig	2007-10-09 22:31:38.000000000 +0200
+++ linux-2.6.23/drivers/net/phy/phy.c	2009-02-04 16:52:35.000000000 +0100
@@ -475,7 +475,7 @@
 	init_timer(&phydev->phy_timer);
 	phydev->phy_timer.function = &phy_timer;
 	phydev->phy_timer.data = (unsigned long) phydev;
-	mod_timer(&phydev->phy_timer, jiffies + HZ);
+	mod_timer(&phydev->phy_timer, jiffies + PHY_INIT_TIME);
 }
 
 /**
@@ -781,6 +781,7 @@
 	struct phy_device *phydev = (struct phy_device *)data;
 	int needs_aneg = 0;
 	int err = 0;
+	int use_fast_timer = 0;
 
 	spin_lock(&phydev->lock);
 
@@ -792,14 +793,17 @@
 		case PHY_STARTING:
 		case PHY_READY:
 		case PHY_PENDING:
+			use_fast_timer = 1;
 			break;
 		case PHY_UP:
+			use_fast_timer = 1;
 			needs_aneg = 1;
 
 			phydev->link_timeout = PHY_AN_TIMEOUT;
 
 			break;
 		case PHY_AN:
+			use_fast_timer = 1;
 			err = phy_read_status(phydev);
 
 			if (err < 0)
@@ -854,15 +858,18 @@
 			}
 			break;
 		case PHY_NOLINK:
-			err = phy_read_status(phydev);
-
-			if (err)
-				break;
-
-			if (phydev->link) {
-				phydev->state = PHY_RUNNING;
-				netif_carrier_on(phydev->attached_dev);
-				phydev->adjust_link(phydev->attached_dev);
+			/* Only read link status if we are polling */
+			if (PHY_POLL == phydev->irq) {
+				err = phy_read_status(phydev);
+				
+				if (err)
+					break;
+				
+				if (phydev->link) {
+					phydev->state = PHY_RUNNING;
+					netif_carrier_on(phydev->attached_dev);
+					phydev->adjust_link(phydev->attached_dev);
+				}
 			}
 			break;
 		case PHY_FORCING:
@@ -956,6 +963,11 @@
 	if (err < 0)
 		phy_error(phydev);
 
-	mod_timer(&phydev->phy_timer, jiffies + PHY_STATE_TIME * HZ);
+	/* Configure a fast timer during initial states to speed up
+	   the initialization. */
+	if (use_fast_timer)
+		mod_timer(&phydev->phy_timer, jiffies + PHY_INIT_TIME);
+	else
+		mod_timer(&phydev->phy_timer, jiffies + PHY_STATE_TIME);
 }
 
