DM9000: Use msleep() instead of udelay()
authorBen Dooks <ben-linux@fluff.org>
Tue, 5 Feb 2008 00:02:08 +0000 (00:02 +0000)
committerJeff Garzik <jeff@garzik.org>
Mon, 11 Feb 2008 16:06:27 +0000 (11:06 -0500)
We can use sleeping functions when reading and writing the
PHY registers, so let us sleep instead of busy waiting for
the PHY.

Note, this also fixes a bug reading the PHY where only 100uS
was being used instead of 150uS

Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/net/dm9000.c

index 071aad1..2e0add0 100644 (file)
@@ -116,6 +116,7 @@ typedef struct board_info {
        u8 io_mode;             /* 0:word, 2:byte */
        u8 phy_addr;
        unsigned int flags;
+       unsigned int in_suspend :1;
 
        int debug_level;
 
@@ -1108,6 +1109,18 @@ dm9000_hash_table(struct net_device *dev)
 
 
 /*
+ * Sleep, either by using msleep() or if we are suspending, then
+ * use mdelay() to sleep.
+ */
+static void dm9000_msleep(board_info_t *db, unsigned int ms)
+{
+       if (db->in_suspend)
+               mdelay(ms);
+       else
+               msleep(ms);
+}
+
+/*
  *   Read a word from phyxcer
  */
 static int
@@ -1131,7 +1144,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
        writeb(reg_save, db->io_addr);
        spin_unlock_irqrestore(&db->lock,flags);
 
-       udelay(100);            /* Wait read complete */
+       dm9000_msleep(db, 1);           /* Wait read complete */
 
        spin_lock_irqsave(&db->lock,flags);
        reg_save = readb(db->io_addr);
@@ -1175,7 +1188,7 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
        writeb(reg_save, db->io_addr);
        spin_unlock_irqrestore(&db->lock,flags);
 
-       udelay(500);            /* Wait write complete */
+       dm9000_msleep(db, 1);           /* Wait write complete */
 
        spin_lock_irqsave(&db->lock,flags);
        reg_save = readb(db->io_addr);
@@ -1192,8 +1205,12 @@ static int
 dm9000_drv_suspend(struct platform_device *dev, pm_message_t state)
 {
        struct net_device *ndev = platform_get_drvdata(dev);
+       board_info_t *db;
 
        if (ndev) {
+               db = (board_info_t *) ndev->priv;
+               db->in_suspend = 1;
+
                if (netif_running(ndev)) {
                        netif_device_detach(ndev);
                        dm9000_shutdown(ndev);
@@ -1216,6 +1233,8 @@ dm9000_drv_resume(struct platform_device *dev)
 
                        netif_device_attach(ndev);
                }
+
+               db->in_suspend = 0;
        }
        return 0;
 }