struct sis900_private *sis_priv = netdev_priv(net_dev);
        struct mii_phy *mii_phy = sis_priv->mii;
        static const int next_tick = 5*HZ;
+       int speed = 0, duplex = 0;
        u16 status;
 
-       if (!sis_priv->autong_complete){
-               int uninitialized_var(speed), duplex = 0;
-
-               sis900_read_mode(net_dev, &speed, &duplex);
-               if (duplex){
-                       sis900_set_mode(sis_priv, speed, duplex);
-                       sis630_set_eq(net_dev, sis_priv->chipset_rev);
-                       netif_carrier_on(net_dev);
-               }
-
-               sis_priv->timer.expires = jiffies + HZ;
-               add_timer(&sis_priv->timer);
-               return;
-       }
-
        status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS);
        status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS);
 
                status = sis900_default_phy(net_dev);
                mii_phy = sis_priv->mii;
 
-               if (status & MII_STAT_LINK)
-                       sis900_check_mode(net_dev, mii_phy);
+               if (status & MII_STAT_LINK) {
+                       WARN_ON(!(status & MII_STAT_AUTO_DONE));
+
+                       sis900_read_mode(net_dev, &speed, &duplex);
+                       if (duplex) {
+                               sis900_set_mode(sis_priv, speed, duplex);
+                               sis630_set_eq(net_dev, sis_priv->chipset_rev);
+                               netif_carrier_on(net_dev);
+                       }
+               }
        } else {
        /* Link ON -> OFF */
                 if (!(status & MII_STAT_LINK)){