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: Ben Dooks <ben-linux@fluff.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
89c8b0e6cd
commit
321f69a4c3
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue