|
@@ -552,15 +552,48 @@ static const struct ethtool_ops dm9000_ethtool_ops = {
|
|
|
.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);
|
|
|
}
|
|
|
|
|
@@ -1267,6 +1300,10 @@ dm9000_probe(struct platform_device *pdev)
|
|
|
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 */
|