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"
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