NetStar: eeprom - undefined reference to `memset'
authorLadislav Michl <Ladislav.Michl@seznam.cz>
Mon, 8 Feb 2010 19:15:15 +0000 (14:15 -0500)
committerTom Rix <Tom.Rix@windriver.com>
Sun, 7 Mar 2010 18:36:34 +0000 (12:36 -0600)
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>
board/netstar/eeprom.c

index adb01b96b89ce465e50ffc5357a2c188d8114b1e..ad301eb9cf06e04ce0ce8a17026c1ba010c6c88b 100644 (file)
 #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;
 }