summaryrefslogtreecommitdiffstats
path: root/drivers/net/dm9000.c
diff options
context:
space:
mode:
authorBen Dooks <ben-linux@fluff.org>2008-02-05 01:02:09 +0100
committerJeff Garzik <jeff@garzik.org>2008-02-11 17:06:28 +0100
commit86c62fab5aafe33d033d2f616ba8be0527e1c286 (patch)
treee7fa174e6e825d62722618b9d1f197d177b40e6c /drivers/net/dm9000.c
parentDM9000: Use msleep() instead of udelay() (diff)
downloadlinux-86c62fab5aafe33d033d2f616ba8be0527e1c286.tar.xz
linux-86c62fab5aafe33d033d2f616ba8be0527e1c286.zip
DM9000: Remove barely used SROM array read.
The srom array in the board data is only being used in the device probe routines. The probe also only uses the first 6 bytes of an array we spend 512ms reading 128 bytes from. Change to reading the MAC area directly to the MAC address structure. As a side product, we rename the read_srom_word to dm9000_read_eeprom to bring it into line with the rest of the driver. No change is made to the delay in this function, which will be dealt with in a later patch. Signed-off-by: Ben Dooks <ben-linux@fluff.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/dm9000.c')
-rw-r--r--drivers/net/dm9000.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 2e0add074889..fa7eb39dbf3c 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -132,7 +132,6 @@ typedef struct board_info {
struct resource *data_req;
struct resource *irq_res;
- unsigned char srom[128];
spinlock_t lock;
struct mii_if_info mii;
@@ -166,7 +165,8 @@ static irqreturn_t dm9000_interrupt(int, void *);
static int dm9000_phy_read(struct net_device *dev, int phyaddr_unsused, int reg);
static void dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg,
int value);
-static u16 read_srom_word(board_info_t *, int);
+
+static void dm9000_read_eeprom(board_info_t *, int addr, unsigned char *to);
static void dm9000_rx(struct net_device *);
static void dm9000_hash_table(struct net_device *);
@@ -630,13 +630,9 @@ dm9000_probe(struct platform_device *pdev)
db->mii.mdio_read = dm9000_phy_read;
db->mii.mdio_write = dm9000_phy_write;
- /* Read SROM content */
- for (i = 0; i < 64; i++)
- ((u16 *) db->srom)[i] = read_srom_word(db, i);
-
- /* Set Node Address */
- for (i = 0; i < 6; i++)
- ndev->dev_addr[i] = db->srom[i];
+ /* try reading the node address from the attached EEPROM */
+ for (i = 0; i < 6; i += 2)
+ dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);
if (!is_valid_ether_addr(ndev->dev_addr)) {
/* try reading from mac */
@@ -998,17 +994,19 @@ dm9000_rx(struct net_device *dev)
}
/*
- * Read a word data from SROM
+ * Read a word data from EEPROM
*/
-static u16
-read_srom_word(board_info_t * db, int offset)
+static void
+dm9000_read_eeprom(board_info_t * db, int offset, unsigned char *to)
{
iow(db, DM9000_EPAR, offset);
iow(db, DM9000_EPCR, EPCR_ERPRR);
mdelay(8); /* according to the datasheet 200us should be enough,
but it doesn't work */
iow(db, DM9000_EPCR, 0x0);
- return (ior(db, DM9000_EPDRL) + (ior(db, DM9000_EPDRH) << 8));
+
+ to[0] = ior(db, DM9000_EPDRL);
+ to[1] = ior(db, DM9000_EPDRH);
}
#ifdef DM9000_PROGRAM_EEPROM