From: Mike Frysinger <vapier@gentoo.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] Convert SMC911X Ethernet driver to CONFIG_NET_MULTI API
Date: Thu, 16 Jul 2009 23:46:45 -0400 [thread overview]
Message-ID: <200907162346.46061.vapier@gentoo.org> (raw)
In-Reply-To: <1247796981-2131-1-git-send-email-biggerbadderben@gmail.com>
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"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20090716/27a929bb/attachment.pgp
next prev parent reply other threads:[~2009-07-17 3:46 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-17 2:16 [U-Boot] [PATCH] Convert SMC911X Ethernet driver to CONFIG_NET_MULTI API Ben Warren
2009-07-17 2:19 ` Ben Warren
2009-07-17 3:46 ` Mike Frysinger [this message]
2009-07-17 4:09 ` Ben Warren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200907162346.46061.vapier@gentoo.org \
--to=vapier@gentoo.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.