aboutsummaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authorLadislav Michl2010-02-08 14:15:15 -0500
committerTom Rix2010-03-07 12:36:34 -0600
commitb29ff6277239f5c8bc9366e74afac5a36ab3b23e (patch)
tree7e71b53d853cdf4b432d9aaa6cc8e139dd4dc9e4 /board
parentef8d008730fb62fc81a792274eea40480593a7d3 (diff)
NetStar: eeprom - undefined reference to `memset'
Defining partially initialized struct eth_device on stack means gcc has to zero out it, and some gcc versions optimize this with an implicit call to memset. Move definition to data section to avoid that (it has also nice side effect that we need not to pass it to helper functions anymore) Signed-off-by: Ladislav Michl <ladis@linux-mips.org> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
Diffstat (limited to 'board')
-rw-r--r--board/netstar/eeprom.c68
1 files changed, 37 insertions, 31 deletions
diff --git a/board/netstar/eeprom.c b/board/netstar/eeprom.c
index adb01b96b89..ad301eb9cf0 100644
--- a/board/netstar/eeprom.c
+++ b/board/netstar/eeprom.c
@@ -28,40 +28,50 @@
#include <net.h>
#include "../drivers/net/smc91111.h"
-static u16 read_eeprom_reg(struct eth_device *dev, u16 reg)
+static struct eth_device dev = {
+ .iobase = CONFIG_SMC91111_BASE
+};
+
+static u16 read_eeprom_reg(u16 reg)
{
int timeout;
- SMC_SELECT_BANK(dev, 2);
- SMC_outw(dev, reg, PTR_REG);
+ SMC_SELECT_BANK(&dev, 2);
+ SMC_outw(&dev, reg, PTR_REG);
+
+ SMC_SELECT_BANK(&dev, 1);
+ SMC_outw(&dev, SMC_inw(&dev, CTL_REG) | CTL_EEPROM_SELECT |
+ CTL_RELOAD, CTL_REG);
- SMC_SELECT_BANK(dev, 1);
- SMC_outw(dev, SMC_inw (dev, CTL_REG) | CTL_EEPROM_SELECT | CTL_RELOAD,
- CTL_REG);
timeout = 100;
- while((SMC_inw (dev, CTL_REG) & CTL_RELOAD) && --timeout)
+
+ while ((SMC_inw(&dev, CTL_REG) & CTL_RELOAD) && --timeout)
udelay(100);
if (timeout == 0) {
printf("Timeout Reading EEPROM register %02x\n", reg);
return 0;
}
- return SMC_inw (dev, GP_REG);
+ return SMC_inw(&dev, GP_REG);
}
-static int write_eeprom_reg(struct eth_device *dev, u16 value, u16 reg)
+static int write_eeprom_reg(u16 value, u16 reg)
{
int timeout;
- SMC_SELECT_BANK(dev, 2);
- SMC_outw(dev, reg, PTR_REG);
+ SMC_SELECT_BANK(&dev, 2);
+ SMC_outw(&dev, reg, PTR_REG);
+
+ SMC_SELECT_BANK(&dev, 1);
+
+ SMC_outw(&dev, value, GP_REG);
+ SMC_outw(&dev, SMC_inw(&dev, CTL_REG) | CTL_EEPROM_SELECT |
+ CTL_STORE, CTL_REG);
- SMC_SELECT_BANK(dev, 1);
- SMC_outw(dev, value, GP_REG);
- SMC_outw(dev, SMC_inw (dev, CTL_REG) | CTL_EEPROM_SELECT | CTL_STORE, CTL_REG);
timeout = 100;
- while ((SMC_inw(dev, CTL_REG) & CTL_STORE) && --timeout)
- udelay (100);
+
+ while ((SMC_inw(&dev, CTL_REG) & CTL_STORE) && --timeout)
+ udelay(100);
if (timeout == 0) {
printf("Timeout Writing EEPROM register %02x\n", reg);
return 0;
@@ -70,17 +80,17 @@ static int write_eeprom_reg(struct eth_device *dev, u16 value, u16 reg)
return 1;
}
-static int write_data(struct eth_device *dev, u16 *buf, int len)
+static int write_data(u16 *buf, int len)
{
u16 reg = 0x23;
while (len--)
- write_eeprom_reg(dev, *buf++, reg++);
+ write_eeprom_reg(*buf++, reg++);
return 0;
}
-static int verify_macaddr(struct eth_device *dev, char *s)
+static int verify_macaddr(char *s)
{
u16 reg;
int i, err = 0;
@@ -88,7 +98,7 @@ static int verify_macaddr(struct eth_device *dev, char *s)
printf("MAC Address: ");
err = i = 0;
for (i = 0; i < 3; i++) {
- reg = read_eeprom_reg(dev, 0x20 + i);
+ reg = read_eeprom_reg(0x20 + i);
printf("%02x:%02x%c", reg & 0xff, reg >> 8, i != 2 ? ':' : '\n');
if (s)
err |= reg != ((u16 *)s)[i];
@@ -97,7 +107,7 @@ static int verify_macaddr(struct eth_device *dev, char *s)
return err ? 0 : 1;
}
-static int set_mac(struct eth_device *dev, char *s)
+static int set_mac(char *s)
{
int i;
char *e, eaddr[6];
@@ -109,7 +119,7 @@ static int set_mac(struct eth_device *dev, char *s)
}
for (i = 0; i < 3; i++)
- write_eeprom_reg(dev, *(((u16 *)eaddr) + i), 0x20 + i);
+ write_eeprom_reg(*(((u16 *)eaddr) + i), 0x20 + i);
return 0;
}
@@ -145,10 +155,6 @@ int eeprom(int argc, char *argv[])
int i, len, ret;
unsigned char buf[58], *p;
- struct eth_device dev = {
- .iobase = CONFIG_SMC91111_BASE
- };
-
app_startup(argv);
if (get_version() != XF_VERSION) {
printf("Wrong XF_VERSION.\n");
@@ -157,14 +163,14 @@ int eeprom(int argc, char *argv[])
return 1;
}
- if ((SMC_inw (&dev, BANK_SELECT) & 0xFF00) != 0x3300) {
+ if ((SMC_inw(&dev, BANK_SELECT) & 0xFF00) != 0x3300) {
printf("SMSC91111 not found.\n");
return 2;
}
/* Called without parameters - print MAC address */
if (argc < 2) {
- verify_macaddr(&dev, NULL);
+ verify_macaddr(NULL);
return 0;
}
@@ -198,8 +204,8 @@ int eeprom(int argc, char *argv[])
}
/* First argument (MAC) is mandatory */
- set_mac(&dev, argv[1]);
- if (verify_macaddr(&dev, argv[1])) {
+ set_mac(argv[1]);
+ if (verify_macaddr(argv[1])) {
printf("*** MAC address does not match! ***\n");
return 4;
}
@@ -207,7 +213,7 @@ int eeprom(int argc, char *argv[])
while (len--)
*p++ = 0;
- write_data(&dev, (u16 *)buf, sizeof(buf) >> 1);
+ write_data((u16 *)buf, sizeof(buf) >> 1);
return 0;
}