public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
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 

  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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox