Commit 321f69a4 authored by Ben Dooks's avatar Ben Dooks Committed by Jeff Garzik

DM9000: Use msleep() instead of udelay()

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: default avatarBen Dooks <ben-linux@fluff.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 89c8b0e6
...@@ -116,6 +116,7 @@ typedef struct board_info { ...@@ -116,6 +116,7 @@ typedef struct board_info {
u8 io_mode; /* 0:word, 2:byte */ u8 io_mode; /* 0:word, 2:byte */
u8 phy_addr; u8 phy_addr;
unsigned int flags; unsigned int flags;
unsigned int in_suspend :1;
int debug_level; int debug_level;
...@@ -1107,6 +1108,18 @@ dm9000_hash_table(struct net_device *dev) ...@@ -1107,6 +1108,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 * Read a word from phyxcer
*/ */
...@@ -1131,7 +1144,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg) ...@@ -1131,7 +1144,7 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
writeb(reg_save, db->io_addr); writeb(reg_save, db->io_addr);
spin_unlock_irqrestore(&db->lock,flags); spin_unlock_irqrestore(&db->lock,flags);
udelay(100); /* Wait read complete */ dm9000_msleep(db, 1); /* Wait read complete */
spin_lock_irqsave(&db->lock,flags); spin_lock_irqsave(&db->lock,flags);
reg_save = readb(db->io_addr); reg_save = readb(db->io_addr);
...@@ -1175,7 +1188,7 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value) ...@@ -1175,7 +1188,7 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value)
writeb(reg_save, db->io_addr); writeb(reg_save, db->io_addr);
spin_unlock_irqrestore(&db->lock,flags); spin_unlock_irqrestore(&db->lock,flags);
udelay(500); /* Wait write complete */ dm9000_msleep(db, 1); /* Wait write complete */
spin_lock_irqsave(&db->lock,flags); spin_lock_irqsave(&db->lock,flags);
reg_save = readb(db->io_addr); reg_save = readb(db->io_addr);
...@@ -1192,8 +1205,12 @@ static int ...@@ -1192,8 +1205,12 @@ static int
dm9000_drv_suspend(struct platform_device *dev, pm_message_t state) dm9000_drv_suspend(struct platform_device *dev, pm_message_t state)
{ {
struct net_device *ndev = platform_get_drvdata(dev); struct net_device *ndev = platform_get_drvdata(dev);
board_info_t *db;
if (ndev) { if (ndev) {
db = (board_info_t *) ndev->priv;
db->in_suspend = 1;
if (netif_running(ndev)) { if (netif_running(ndev)) {
netif_device_detach(ndev); netif_device_detach(ndev);
dm9000_shutdown(ndev); dm9000_shutdown(ndev);
...@@ -1216,6 +1233,8 @@ dm9000_drv_resume(struct platform_device *dev) ...@@ -1216,6 +1233,8 @@ dm9000_drv_resume(struct platform_device *dev)
netif_device_attach(ndev); netif_device_attach(ndev);
} }
db->in_suspend = 0;
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment