To compile this driver as a module, choose M here.  The module
          will be called dm9000.
 
+config DM9000_FORCE_SIMPLE_PHY_POLL
+       bool "Force simple NSR based PHY polling"
+       depends on DM9000
+       ---help---
+         This configuration forces the DM9000 to use the NSR's LinkStatus
+         bit to determine if the link is up or down instead of the more
+         costly MII PHY reads. Note, this will not work if the chip is
+         operating with an external PHY.
+
 config ENC28J60
        tristate "ENC28J60 support"
        depends on EXPERIMENTAL && SPI && NET_ETHERNET
 
        .set_eeprom             = dm9000_set_eeprom,
 };
 
+static void dm9000_show_carrier(board_info_t *db,
+                               unsigned carrier, unsigned nsr)
+{
+       struct net_device *ndev = db->ndev;
+       unsigned ncr = dm9000_read_locked(db, DM9000_NCR);
+
+       if (carrier)
+               dev_info(db->dev, "%s: link up, %dMbps, %s-duplex, no LPA\n",
+                        ndev->name, (nsr & NSR_SPEED) ? 10 : 100,
+                        (ncr & NCR_FDX) ? "full" : "half");
+       else
+               dev_info(db->dev, "%s: link down\n", ndev->name);
+}
+
 static void
 dm9000_poll_work(struct work_struct *w)
 {
        struct delayed_work *dw = container_of(w, struct delayed_work, work);
        board_info_t *db = container_of(dw, board_info_t, phy_poll);
+       struct net_device *ndev = db->ndev;
+
+       if (db->flags & DM9000_PLATF_SIMPLE_PHY &&
+           !(db->flags & DM9000_PLATF_EXT_PHY)) {
+               unsigned nsr = dm9000_read_locked(db, DM9000_NSR);
+               unsigned old_carrier = netif_carrier_ok(ndev) ? 1 : 0;
+               unsigned new_carrier;
 
-       mii_check_media(&db->mii, netif_msg_link(db), 0);
+               new_carrier = (nsr & NSR_LINKST) ? 1 : 0;
+
+               if (old_carrier != new_carrier) {
+                       if (netif_msg_link(db))
+                               dm9000_show_carrier(db, new_carrier, nsr);
+
+                       if (!new_carrier)
+                               netif_carrier_off(ndev);
+                       else
+                               netif_carrier_on(ndev);
+               }
+       } else
+               mii_check_media(&db->mii, netif_msg_link(db), 0);
        
-       if (netif_running(db->ndev))
+       if (netif_running(ndev))
                dm9000_schedule_poll(db);
 }
 
                db->flags = pdata->flags;
        }
 
+#ifdef CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL
+       db->flags |= DM9000_PLATF_SIMPLE_PHY;
+#endif
+
        dm9000_reset(db);
 
        /* try multiple times, DM9000 sometimes gets the read wrong */