couple changes to squash into this:
 - fix build error for systems using in 16bit
 - tweak bf548-ezkit update
 - do not leak priv malloc() if dev malloc() failed
 - make sure we clear eth_device (we really need a zalloc())
 - initialize dev->enetaddr in the driver register func
 - initialize the driver mac with dev->enetaddr

seems to work on my bf548-ezkit:
....
Net:   smc911x-0
Hit any key to stop autoboot:  0
bfin> t 0 u-boot.bin
smc911x: initializing
smc911x: detected LAN9218 controller
smc911x: phy initialized
smc911x: MAC 00:e0:22:fe:bd:04
Using smc911x-0 device
TFTP from server 192.168.0.2; our IP address is 192.168.0.15
Filename 'u-boot.bin'.
Load address: 0x0
Loading: ##################
done
Bytes transferred = 258112 (3f040 hex)
bfin>

-mike

diff --git a/board/bf548-ezkit/bf548-ezkit.c b/board/bf548-ezkit/bf548-ezkit.c
index 69a581b..88a0cd4 100644
--- a/board/bf548-ezkit/bf548-ezkit.c
+++ b/board/bf548-ezkit/bf548-ezkit.c
@@ -79,12 +79,9 @@ int board_early_init_f(void)
        return 0;
 }
 
+#ifdef CONFIG_SMC911X
 int board_eth_init(bd_t *bis)
 {
-       int rc = 0;
-#ifdef CONFIG_SMC911X
-       rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
-#endif
-       return rc;
+       return smc911x_initialize(0, CONFIG_SMC911X_BASE);
 }
-
+#endif
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
index 9eb080f..2bbd7ea 100644
--- a/drivers/net/smc911x.c
+++ b/drivers/net/smc911x.c
@@ -37,49 +37,17 @@ void pkt_data_push(struct eth_device *dev, u32 addr, u32 
val) \
 
 #define mdelay(n)       udelay((n)*1000)
 
-static int smx911x_handle_mac_address(struct eth_device *dev)
+static void smx911x_handle_mac_address(struct eth_device *dev)
 {
        unsigned long addrh, addrl;
-       uchar m[6];
-       char env_parm_name[10];  /* Long enough for ethxxaddr */
-       u8 dev_num = ((struct smc911x_priv *)(dev->priv))->dev_num;
-
-       if (dev_num == 0)
-               strncpy(env_parm_name, "ethaddr", 7);
-       else
-               sprintf(env_parm_name, "eth%huaddr", dev_num);
-
-       if (eth_getenv_enetaddr(env_parm_name, m)) {
-               /* if the environment has a valid mac address then use it */
-               addrl = m[0] | (m[1] << 8) | (m[2] << 16) | (m[3] << 24);
-               addrh = m[4] | (m[5] << 8);
-               smc911x_set_mac_csr(dev, ADDRL, addrl);
-               smc911x_set_mac_csr(dev, ADDRH, addrh);
-       } else {
-               /* if not, try to get one from the eeprom */
-               addrh = smc911x_get_mac_csr(dev, ADDRH);
-               addrl = smc911x_get_mac_csr(dev, ADDRL);
-
-               m[0] = (addrl       ) & 0xff;
-               m[1] = (addrl >>  8 ) & 0xff;
-               m[2] = (addrl >> 16 ) & 0xff;
-               m[3] = (addrl >> 24 ) & 0xff;
-               m[4] = (addrh       ) & 0xff;
-               m[5] = (addrh >>  8 ) & 0xff;
-
-               /* we get 0xff when there is no eeprom connected */
-               if ((m[0] & m[1] & m[2] & m[3] & m[4] & m[5]) == 0xff) {
-                       printf(DRIVERNAME ": no valid mac address in "
-                               "environment and no eeprom found\n");
-                       return -1;
-               }
-
-               eth_setenv_enetaddr(env_parm_name, m);
-       }
+       uchar *m = dev->enetaddr;
 
-       printf(DRIVERNAME ": MAC %pM\n", m);
+       addrl = m[0] | (m[1] << 8) | (m[2] << 16) | (m[3] << 24);
+       addrh = m[4] | (m[5] << 8);
+       smc911x_set_mac_csr(dev, ADDRL, addrl);
+       smc911x_set_mac_csr(dev, ADDRH, addrh);
 
-       return 0;
+       printf(DRIVERNAME ": MAC %pM\n", m);
 }
 
 static int smc911x_miiphy_read(struct eth_device *dev,
@@ -188,8 +156,7 @@ static int smc911x_init(struct eth_device *dev, bd_t * bd)
        /* Configure the PHY, initialize the link state */
        smc911x_phy_configure(dev);
 
-       if ((smx911x_handle_mac_address(dev)) < 0)
-               goto err_out;
+       smx911x_handle_mac_address(dev);
 
        /* Turn on Tx + Rx */
        smc911x_enable(dev);
@@ -274,16 +241,34 @@ static int smc911x_rx(struct eth_device *dev)
 
 int smc911x_initialize(u8 dev_num, int base_addr)
 {
-       struct smc911x_priv *priv = malloc(sizeof(struct smc911x_priv));
+       unsigned long addrl, addrh;
+       struct smc911x_priv *priv;
+       struct eth_device *dev;
+
+       priv = malloc(sizeof(*priv));
        if (!priv)
                return 0;
-       struct eth_device *dev = malloc(sizeof(struct eth_device));
-       if (!dev)
+
+       dev = malloc(sizeof(*dev));
+       if (!dev) {
+               free(dev);
                return 0;
+       }
+       memset(dev, 0, sizeof(*dev));
+
        priv->dev_num = dev_num;
        dev->priv = priv;
        dev->iobase = base_addr;
 
+       addrh = smc911x_get_mac_csr(dev, ADDRH);
+       addrl = smc911x_get_mac_csr(dev, ADDRL);
+       dev->enetaddr[0] = addrl;
+       dev->enetaddr[1] = addrl >>  8;
+       dev->enetaddr[2] = addrl >> 16;
+       dev->enetaddr[3] = addrl >> 24;
+       dev->enetaddr[4] = addrh;
+       dev->enetaddr[5] = addrh >> 8;
+
        dev->init = smc911x_init;
        dev->halt = smc911x_halt;
        dev->send = smc911x_send;
diff --git a/drivers/net/smc911x.h b/drivers/net/smc911x.h
index 67af519..58dac80 100644
--- a/drivers/net/smc911x.h
+++ b/drivers/net/smc911x.h
@@ -64,8 +64,8 @@ static inline u32 smc911x_reg_read(struct eth_device *dev, 
u32 offset)
 static inline void smc911x_reg_write(struct eth_device *dev,
                                        u32 offset, u32 val)
 {
-       *(volatile u16*)(dev->iobase + addr) = (u16)val;
-       *(volatile u16*)(dev->iobase + addr + 2) = (u16)(val >> 16);
+       *(volatile u16 *)(dev->iobase + offset) = (u16)val;
+       *(volatile u16 *)(dev->iobase + offset + 2) = (u16)(val >> 16);
 }
 #else
 #error "SMC911X: undefined bus width"

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to