Commit 09ee9f87 authored by Michael Abbott's avatar Michael Abbott Committed by David S. Miller

dm9000: Implement full reset of DM9000 network device

A Davicom application note for the DM9000 network device recommends
performing software reset twice to correctly initialise the device.
Without this reset some devices fail to initialise correctly on
system startup.

Cc: David S. Miller <davem@davemloft.net>
Cc: Jingoo Han <jg1.han@samsung.com>
Cc: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: default avatarMichael Abbott <michael.abbott@diamond.ac.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 677d7d28
...@@ -158,18 +158,6 @@ static inline board_info_t *to_dm9000_board(struct net_device *dev) ...@@ -158,18 +158,6 @@ static inline board_info_t *to_dm9000_board(struct net_device *dev)
/* DM9000 network board routine ---------------------------- */ /* DM9000 network board routine ---------------------------- */
static void
dm9000_reset(board_info_t * db)
{
dev_dbg(db->dev, "resetting device\n");
/* RESET device */
writeb(DM9000_NCR, db->io_addr);
udelay(200);
writeb(NCR_RST, db->io_data);
udelay(200);
}
/* /*
* Read a byte from I/O port * Read a byte from I/O port
*/ */
...@@ -191,6 +179,27 @@ iow(board_info_t * db, int reg, int value) ...@@ -191,6 +179,27 @@ iow(board_info_t * db, int reg, int value)
writeb(value, db->io_data); writeb(value, db->io_data);
} }
static void
dm9000_reset(board_info_t *db)
{
dev_dbg(db->dev, "resetting device\n");
/* Reset DM9000, see DM9000 Application Notes V1.22 Jun 11, 2004 page 29
* The essential point is that we have to do a double reset, and the
* instruction is to set LBK into MAC internal loopback mode.
*/
iow(db, DM9000_NCR, 0x03);
udelay(100); /* Application note says at least 20 us */
if (ior(db, DM9000_NCR) & 1)
dev_err(db->dev, "dm9000 did not respond to first reset\n");
iow(db, DM9000_NCR, 0);
iow(db, DM9000_NCR, 0x03);
udelay(100);
if (ior(db, DM9000_NCR) & 1)
dev_err(db->dev, "dm9000 did not respond to second reset\n");
}
/* routines for sending block to chip */ /* routines for sending block to chip */
static void dm9000_outblk_8bit(void __iomem *reg, void *data, int count) static void dm9000_outblk_8bit(void __iomem *reg, void *data, int count)
......
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