[U-Boot] [PATCH 13/30] drivers/net/: get mac address from environment

Mike Frysinger vapier at gentoo.org
Tue Feb 17 06:10:34 CET 2009


The environment is the canonical storage location of the mac address, so
we're killing off the global data location and moving everything to
querying the env directly.

The drivers that get converted here:
	3c589
	4xx_enet
	dc2114x
	dm9000x
	enc28j60
	fsl_mcdmafec
	ks8695eth
	mcffec
	rtl8019
	rtl8169
	s3c4510b_eth
	xilinx_emac
	xilinx_emaclite

Signed-off-by: Mike Frysinger <vapier at gentoo.org>
CC: Ben Warren <biggerbadderben at gmail.com>
CC: Rolf Offermanns <rof at sysgo.de>
CC: Stefan Roese <sr at denx.de>
CC: Sascha Hauer <saschahauer at web.de>
CC: TsiChung Liew <Tsi-Chung.Liew at freescale.com>
CC: Greg Ungerer <greg.ungerer at opengear.com>
CC: Xue Ligong <lgxue at hotmail.com>
CC: Wang Kehao <whut.edu.cn>
CC: Masami Komiya <mkomiya at sonare.it>
CC: Curt Brune <curt at cucy.com>
CC: Michal SIMEK <monstr at monstr.eu>
---
 drivers/net/3c589.c           |    7 +++++--
 drivers/net/4xx_enet.c        |   13 +++++--------
 drivers/net/dc2114x.c         |    9 ++++++---
 drivers/net/dm9000x.c         |   26 +++++++-------------------
 drivers/net/enc28j60.c        |    4 +++-
 drivers/net/fsl_mcdmafec.c    |   11 ++++++-----
 drivers/net/ks8695eth.c       |    8 +-------
 drivers/net/mcffec.c          |   10 +++++-----
 drivers/net/rtl8019.c         |   14 ++++++++------
 drivers/net/rtl8169.c         |    2 +-
 drivers/net/s3c4510b_eth.c    |    2 +-
 drivers/net/s3c4510b_eth.h    |    2 +-
 drivers/net/xilinx_emac.c     |   12 +++++++-----
 drivers/net/xilinx_emaclite.c |   11 +++++++----
 14 files changed, 63 insertions(+), 68 deletions(-)

diff --git a/drivers/net/3c589.c b/drivers/net/3c589.c
index 0cf8dff..f2c7d32 100644
--- a/drivers/net/3c589.c
+++ b/drivers/net/3c589.c
@@ -259,10 +259,13 @@ static void el_reset(bd_t *bd)
 
 	/* set mac addr */
 	{
-		unsigned char *mac_addr = bd->bi_enetaddr;
+		uchar mac_addr[6];
 		int i;
 
-		el_get_mac_addr( mac_addr );
+		if (!eth_getenv_enetaddr("ethaddr", mac_addr)) {
+			el_get_mac_addr(mac_addr);
+			eth_setenv_enetaddr("ethaddr", mac_addr);
+		}
 
 		GO_WINDOW(2);
 		VX_BUSY_WAIT;
diff --git a/drivers/net/4xx_enet.c b/drivers/net/4xx_enet.c
index 1978269..918373b 100644
--- a/drivers/net/4xx_enet.c
+++ b/drivers/net/4xx_enet.c
@@ -1927,24 +1927,22 @@ int ppc_4xx_eth_initialize (bd_t * bis)
 		memcpy(ethaddr[eth_num], "\0\0\0\0\0\0", 6);
 
 	for (eth_num = 0; eth_num < LAST_EMAC_NUM; eth_num++) {
+		int ethaddr_idx = eth_num + CONFIG_EMAC_NR_START;
 		switch (eth_num) {
 		default:		/* fall through */
 		case 0:
-			memcpy(ethaddr[eth_num + CONFIG_EMAC_NR_START],
-			       bis->bi_enetaddr, 6);
+			eth_getenv_enetaddr("ethaddr", ethaddr[ethaddr_idx]);
 			hw_addr[eth_num] = 0x0;
 			break;
 #ifdef CONFIG_HAS_ETH1
 		case 1:
-			memcpy(ethaddr[eth_num + CONFIG_EMAC_NR_START],
-			       bis->bi_enet1addr, 6);
+			eth_getenv_enetaddr("eth1addr", ethaddr[ethaddr_idx]);
 			hw_addr[eth_num] = 0x100;
 			break;
 #endif
 #ifdef CONFIG_HAS_ETH2
 		case 2:
-			memcpy(ethaddr[eth_num + CONFIG_EMAC_NR_START],
-			       bis->bi_enet2addr, 6);
+			eth_getenv_enetaddr("eth2addr", ethaddr[ethaddr_idx]);
 #if defined(CONFIG_460GT)
 			hw_addr[eth_num] = 0x300;
 #else
@@ -1954,8 +1952,7 @@ int ppc_4xx_eth_initialize (bd_t * bis)
 #endif
 #ifdef CONFIG_HAS_ETH3
 		case 3:
-			memcpy(ethaddr[eth_num + CONFIG_EMAC_NR_START],
-			       bis->bi_enet3addr, 6);
+			eth_getenv_enetaddr("eth3addr", ethaddr[ethaddr_idx]);
 #if defined(CONFIG_460GT)
 			hw_addr[eth_num] = 0x400;
 #else
diff --git a/drivers/net/dc2114x.c b/drivers/net/dc2114x.c
index c0137a7..5ae53e8 100644
--- a/drivers/net/dc2114x.c
+++ b/drivers/net/dc2114x.c
@@ -752,11 +752,14 @@ static void update_srom(struct eth_device *dev, bd_t *bis)
 		0x0000, 0x0000, 0x0000, 0x0000,	/* 38 */
 		0x0000, 0x0000, 0x0000, 0x4e07,	/* 3c */
 	};
+	uchar enetaddr[6];
 
 	/* Ethernet Addr... */
-	eeprom[0x0a] = ((bis->bi_enetaddr[1] & 0xff) << 8) | (bis->bi_enetaddr[0] & 0xff);
-	eeprom[0x0b] = ((bis->bi_enetaddr[3] & 0xff) << 8) | (bis->bi_enetaddr[2] & 0xff);
-	eeprom[0x0c] = ((bis->bi_enetaddr[5] & 0xff) << 8) | (bis->bi_enetaddr[4] & 0xff);
+	if (!eth_getenv_enetaddr("ethaddr", enetaddr))
+		return;
+	eeprom[0x0a] = (enetaddr[1] << 8) | enetaddr[0];
+	eeprom[0x0b] = (enetaddr[3] << 8) | enetaddr[2];
+	eeprom[0x0c] = (enetaddr[5] << 8) | enetaddr[4];
 
 	for (i=0; i<0x40; i++) {
 		write_srom(dev, DE4X5_APROM, i, eeprom[i]);
diff --git a/drivers/net/dm9000x.c b/drivers/net/dm9000x.c
index ffb739d..c52d307 100644
--- a/drivers/net/dm9000x.c
+++ b/drivers/net/dm9000x.c
@@ -287,6 +287,7 @@ eth_init(bd_t * bd)
 	int i, oft, lnk;
 	u8 io_mode;
 	struct board_info *db = &dm9000_info;
+	uchar enetaddr[6];
 
 	DM9000_DBG("eth_init()\n");
 
@@ -345,32 +346,19 @@ eth_init(bd_t * bd)
 	DM9000_iow(DM9000_ISR, ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS);
 
 	/* Set Node address */
+	if (!eth_getenv_enetaddr("ethaddr", enetaddr)) {
 #if !defined(CONFIG_AT91SAM9261EK)
-	for (i = 0; i < 6; i++)
-		((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
+		for (i = 0; i < 6; i++)
+			enetaddr[i] = read_srom_word(i);
+		eth_setenv_enetaddr("ethaddr", enetaddr);
 #endif
-
-	if (is_zero_ether_addr(bd->bi_enetaddr) ||
-	    is_multicast_ether_addr(bd->bi_enetaddr)) {
-		/* try reading from environment */
-		u8 i;
-		char *s, *e;
-		s = getenv ("ethaddr");
-		for (i = 0; i < 6; ++i) {
-			bd->bi_enetaddr[i] = s ?
-				simple_strtoul (s, &e, 16) : 0;
-			if (s)
-				s = (*e) ? e + 1 : e;
-		}
 	}
 
-	printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", bd->bi_enetaddr[0],
-	       bd->bi_enetaddr[1], bd->bi_enetaddr[2], bd->bi_enetaddr[3],
-	       bd->bi_enetaddr[4], bd->bi_enetaddr[5]);
+	printf("MAC: %pM\n", enetaddr);
 
 	/* fill device MAC address registers */
 	for (i = 0, oft = DM9000_PAR; i < 6; i++, oft++)
-		DM9000_iow(oft, bd->bi_enetaddr[i]);
+		DM9000_iow(oft, enetaddr[i]);
 	for (i = 0, oft = 0x16; i < 8; i++, oft++)
 		DM9000_iow(oft, 0xff);
 
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c
index 5c24b0d..3238a50 100644
--- a/drivers/net/enc28j60.c
+++ b/drivers/net/enc28j60.c
@@ -330,6 +330,7 @@ static int rxResetCounter = 0;
 int eth_init (bd_t * bis)
 {
 	unsigned char estatVal;
+	uchar enetaddr[6];
 
 	/* configure GPIO */
 	(*((volatile unsigned long *) IO1DIR)) |= ENC_SPI_SLAVE_CS;
@@ -351,7 +352,8 @@ int eth_init (bd_t * bis)
 
 	/* initialize controller */
 	encReset ();
-	encInit (bis->bi_enetaddr);
+	eth_getenv_enetaddr("ethaddr", enetaddr);
+	encInit (enetaddr);
 
 	m_nic_bfs (CTL_REG_ECON1, ENC_ECON1_RXEN);	/* enable receive */
 
diff --git a/drivers/net/fsl_mcdmafec.c b/drivers/net/fsl_mcdmafec.c
index d056010..35a6dfb 100644
--- a/drivers/net/fsl_mcdmafec.c
+++ b/drivers/net/fsl_mcdmafec.c
@@ -369,6 +369,7 @@ static int fec_init(struct eth_device *dev, bd_t * bd)
 	struct fec_info_dma *info = dev->priv;
 	volatile fecdma_t *fecp = (fecdma_t *) (info->iobase);
 	int i;
+	uchar enetaddr[6];
 
 #ifdef ET_DEBUG
 	printf("fec_init: iobase 0x%08x ...\n", info->iobase);
@@ -397,11 +398,11 @@ static int fec_init(struct eth_device *dev, bd_t * bd)
 	fecp->eir = 0xffffffff;
 
 	/* Set station address   */
-	if ((u32) fecp == CONFIG_SYS_FEC0_IOBASE) {
-		fec_set_hwaddr(fecp, bd->bi_enetaddr);
-	} else {
-		fec_set_hwaddr(fecp, bd->bi_enet1addr);
-	}
+	if ((u32) fecp == CONFIG_SYS_FEC0_IOBASE)
+		eth_getenv_enetaddr("ethaddr", enetaddr);
+	else
+		eth_getenv_enetaddr("eth1addr", enetaddr);
+	fec_set_hwaddr(fecp, enetaddr);
 
 	/* Set Opcode/Pause Duration Register */
 	fecp->opd = 0x00010020;
diff --git a/drivers/net/ks8695eth.c b/drivers/net/ks8695eth.c
index 7f3e0c2..5ea6e7f 100644
--- a/drivers/net/ks8695eth.c
+++ b/drivers/net/ks8695eth.c
@@ -150,13 +150,7 @@ void eth_reset(bd_t *bd)
 	ks8695_write(KS8695_LAN_DMA_RX, 0x71);
 	ks8695_write(KS8695_LAN_DMA_RX_START, 0x1);
 
-	printf("KS8695 ETHERNET: ");
-	for (i = 0; (i < 5); i++) {
-		bd->bi_enetaddr[i] = eth_mac[i];
-		printf("%02x:", eth_mac[i]);
-	}
-	bd->bi_enetaddr[i] = eth_mac[i];
-	printf("%02x\n", eth_mac[i]);
+	printf("KS8695 ETHERNET: %pM\n", eth_mac);
 }
 
 /****************************************************************************/
diff --git a/drivers/net/mcffec.c b/drivers/net/mcffec.c
index 18240a8..64be5de 100644
--- a/drivers/net/mcffec.c
+++ b/drivers/net/mcffec.c
@@ -416,7 +416,7 @@ int fec_init(struct eth_device *dev, bd_t * bd)
 	struct fec_info_s *info = dev->priv;
 	volatile fec_t *fecp = (fec_t *) (info->iobase);
 	int i;
-	u8 *ea = NULL;
+	uchar ea[6];
 
 	fecpin_setclear(dev, 1);
 
@@ -444,25 +444,25 @@ int fec_init(struct eth_device *dev, bd_t * bd)
 	if ((u32) fecp == CONFIG_SYS_FEC0_IOBASE) {
 #ifdef CONFIG_SYS_FEC1_IOBASE
 		volatile fec_t *fecp1 = (fec_t *) (CONFIG_SYS_FEC1_IOBASE);
-		ea = &bd->bi_enet1addr[0];
+		eth_getenv_enetaddr("eth1addr", ea);
 		fecp1->palr =
 		    (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
 		fecp1->paur = (ea[4] << 24) | (ea[5] << 16);
 #endif
-		ea = &bd->bi_enetaddr[0];
+		eth_getenv_enetaddr("ethaddr", ea);
 		fecp->palr =
 		    (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
 		fecp->paur = (ea[4] << 24) | (ea[5] << 16);
 	} else {
 #ifdef CONFIG_SYS_FEC0_IOBASE
 		volatile fec_t *fecp0 = (fec_t *) (CONFIG_SYS_FEC0_IOBASE);
-		ea = &bd->bi_enetaddr[0];
+		eth_getenv_enetaddr("ethaddr", ea);
 		fecp0->palr =
 		    (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
 		fecp0->paur = (ea[4] << 24) | (ea[5] << 16);
 #endif
 #ifdef CONFIG_SYS_FEC1_IOBASE
-		ea = &bd->bi_enet1addr[0];
+		eth_getenv_enetaddr("eth1addr", ea);
 		fecp->palr =
 		    (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
 		fecp->paur = (ea[4] << 24) | (ea[5] << 16);
diff --git a/drivers/net/rtl8019.c b/drivers/net/rtl8019.c
index 3ddf917..f516afe 100644
--- a/drivers/net/rtl8019.c
+++ b/drivers/net/rtl8019.c
@@ -91,6 +91,7 @@ void eth_halt (void)
 
 int eth_init (bd_t * bd)
 {
+	uchar enetaddr[6];
 	eth_reset ();
 	put_reg (RTL8019_COMMAND, RTL8019_PAGE0STOP);
 	put_reg (RTL8019_DATACONFIGURATION, 0x48);
@@ -105,12 +106,13 @@ int eth_init (bd_t * bd)
 	put_reg (RTL8019_INTERRUPTSTATUS, 0xff);
 	put_reg (RTL8019_INTERRUPTMASK, 0x11);	/*b; */
 	put_reg (RTL8019_COMMAND, RTL8019_PAGE1STOP);
-	put_reg (RTL8019_PHYSICALADDRESS0, bd->bi_enetaddr[0]);
-	put_reg (RTL8019_PHYSICALADDRESS1, bd->bi_enetaddr[1]);
-	put_reg (RTL8019_PHYSICALADDRESS2, bd->bi_enetaddr[2]);
-	put_reg (RTL8019_PHYSICALADDRESS3, bd->bi_enetaddr[3]);
-	put_reg (RTL8019_PHYSICALADDRESS4, bd->bi_enetaddr[4]);
-	put_reg (RTL8019_PHYSICALADDRESS5, bd->bi_enetaddr[5]);
+	eth_getenv_enetaddr("ethaddr", enetaddr);
+	put_reg (RTL8019_PHYSICALADDRESS0, enetaddr[0]);
+	put_reg (RTL8019_PHYSICALADDRESS1, enetaddr[1]);
+	put_reg (RTL8019_PHYSICALADDRESS2, enetaddr[2]);
+	put_reg (RTL8019_PHYSICALADDRESS3, enetaddr[3]);
+	put_reg (RTL8019_PHYSICALADDRESS4, enetaddr[4]);
+	put_reg (RTL8019_PHYSICALADDRESS5, enetaddr[5]);
 	put_reg (RTL8019_MULTIADDRESS0, 0x00);
 	put_reg (RTL8019_MULTIADDRESS1, 0x00);
 	put_reg (RTL8019_MULTIADDRESS2, 0x00);
diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
index e9f6391..f8c14b4 100644
--- a/drivers/net/rtl8169.c
+++ b/drivers/net/rtl8169.c
@@ -750,7 +750,7 @@ static int rtl_init(struct eth_device *dev, bd_t *bis)
 
 	/* Get MAC address.  FIXME: read EEPROM */
 	for (i = 0; i < MAC_ADDR_LEN; i++)
-		bis->bi_enetaddr[i] = dev->enetaddr[i] = RTL_R8(MAC0 + i);
+		dev->enetaddr[i] = RTL_R8(MAC0 + i);
 
 #ifdef DEBUG_RTL8169
 	printf("chipset = %d\n", tpc->chipset);
diff --git a/drivers/net/s3c4510b_eth.c b/drivers/net/s3c4510b_eth.c
index 6dcb244..818ed3d 100644
--- a/drivers/net/s3c4510b_eth.c
+++ b/drivers/net/s3c4510b_eth.c
@@ -100,7 +100,7 @@ int eth_init(bd_t *bis)
 	ETH *eth = &m_eth;
 
 	/* store our MAC address */
-	eth->m_mac = bis->bi_enetaddr;
+	eth_getenv_enetaddr("ethaddr", eth->m_mac);
 
 	/* setup DBMA and MAC */
 	PUT_REG( REG_BDMARXCON, ETH_BRxRS);   /* reset BDMA RX machine */
diff --git a/drivers/net/s3c4510b_eth.h b/drivers/net/s3c4510b_eth.h
index 048307f..18a52a7 100644
--- a/drivers/net/s3c4510b_eth.h
+++ b/drivers/net/s3c4510b_eth.h
@@ -296,7 +296,7 @@ typedef struct __ETH {
 	TX_FrameDescriptor  *m_baseTX_FD; /*  pointer to base TX frame descriptor    */
 	RX_FrameDescriptor   *m_curRX_FD; /*  pointer to current RX frame descriptor */
 	RX_FrameDescriptor  *m_baseRX_FD; /*  pointer to base RX frame descriptor    */
-	u8                        *m_mac; /*  pointer to our MAC address             */
+	u8                      m_mac[6]; /*  pointer to our MAC address             */
 } ETH;
 
 #endif
diff --git a/drivers/net/xilinx_emac.c b/drivers/net/xilinx_emac.c
index c7f1a2a..a489aa9 100644
--- a/drivers/net/xilinx_emac.c
+++ b/drivers/net/xilinx_emac.c
@@ -166,6 +166,7 @@ void eth_halt(void)
 
 int eth_init(bd_t * bis)
 {
+	uchar enetaddr[6];
 	u32 helpreg;
 	debug ("EMAC Initialization Started\n\r");
 
@@ -200,15 +201,16 @@ int eth_init(bd_t * bis)
 	helpreg &= ~(XEM_ECR_XMIT_ENABLE_MASK | XEM_ECR_RECV_ENABLE_MASK);
 	out_be32 (emac.baseaddress + XEM_ECR_OFFSET, helpreg);
 
-	if (!getenv("ethaddr")) {
-		memcpy(bis->bi_enetaddr, emacaddr, ENET_ADDR_LENGTH);
+	if (!eth_getenv_enetaddr("ethaddr", enetaddr)) {
+		memcpy(enetaddr, emacaddr, ENET_ADDR_LENGTH);
+		eth_setenv_enetaddr("ethaddr", enetaddr);
 	}
 
 	/* Set the device station address high and low registers */
-	helpreg = (bis->bi_enetaddr[0] << 8) | bis->bi_enetaddr[1];
+	helpreg = (enetaddr[0] << 8) | enetaddr[1];
 	out_be32 (emac.baseaddress + XEM_SAH_OFFSET, helpreg);
-	helpreg = (bis->bi_enetaddr[2] << 24) | (bis->bi_enetaddr[3] << 16) |
-			(bis->bi_enetaddr[4] << 8) | bis->bi_enetaddr[5];
+	helpreg = (enetaddr[2] << 24) | (enetaddr[3] << 16) |
+			(enetaddr[4] << 8) | enetaddr[5];
 	out_be32 (emac.baseaddress + XEM_SAL_OFFSET, helpreg);
 
 	helpreg = XEM_ECR_UNICAST_ENABLE_MASK | XEM_ECR_BROAD_ENABLE_MASK |
diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c
index 0e96ef1..cf39573 100644
--- a/drivers/net/xilinx_emaclite.c
+++ b/drivers/net/xilinx_emaclite.c
@@ -140,12 +140,15 @@ void eth_halt (void)
 
 int eth_init (bd_t * bis)
 {
+	uchar enetaddr[6];
+
 	debug ("EmacLite Initialization Started\n");
 	memset (&emaclite, 0, sizeof (xemaclite));
 	emaclite.baseaddress = XILINX_EMACLITE_BASEADDR;
 
-	if (!getenv("ethaddr")) {
-		memcpy(bis->bi_enetaddr, emacaddr, ENET_ADDR_LENGTH);
+	if (!eth_getenv_enetaddr("ethaddr", enetaddr)) {
+		memcpy(enetaddr, emacaddr, ENET_ADDR_LENGTH);
+		eth_setenv_enetaddr("ethaddr", enetaddr);
 	}
 
 /*
@@ -154,7 +157,7 @@ int eth_init (bd_t * bis)
 	/* Restart PING TX */
 	out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0);
 	/* Copy MAC address */
-	xemaclite_alignedwrite (bis->bi_enetaddr,
+	xemaclite_alignedwrite (enetaddr,
 		emaclite.baseaddress, ENET_ADDR_LENGTH);
 	/* Set the length */
 	out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);
@@ -167,7 +170,7 @@ int eth_init (bd_t * bis)
 #ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
 	/* The same operation with PONG TX */
 	out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 0);
-	xemaclite_alignedwrite (bis->bi_enetaddr, emaclite.baseaddress +
+	xemaclite_alignedwrite (enetaddr, emaclite.baseaddress +
 		XEL_BUFFER_OFFSET, ENET_ADDR_LENGTH);
 	out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);
 	out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET,
-- 
1.6.1.3



More information about the U-Boot mailing list