Ethernet MAC address

From ArmadeusWiki
Jump to: navigation, search

If, for any reasons, you want to change your board Ethernet MAC address, here is the procedure.

Introduction

Every network card has a MAC address to identify itself on the network. The MAC address first three octets are known as the Organizationally Unique Identifier. Armadeus OUI is 00:1E:AC [1]

Hardware

Note Note: The APF27, the APF51 and newer boards have an Ethernet MAC address burned into the processor during the production process. This hardware address can not be changed anymore. Though this address can be overloaded by software if needed.


Armadeus APF9328 board has a separate MAC controller, the DM9000 chip from Davicom [2]. The APF schematic, page 10, shows the implementation of the chip with an EEPROM chip to store its parameters, including MAC address.

U-boot

U-boot has a parameter containing the Ethernet address. This parameter is independent from the hardware address. The parameter is ethaddr.

BIOS> printenv ethaddr
00:1E:AC:XX:XX:XX

XX:XX:XX being the board specific address.

Change MAC address

It can happen that the MAC address is wrong (e.g.: 00:00:0E:00:00:00 in my case), empty or that you want to change it.

Empty MAC address

If the board MAC address is empty, the procedure is simplified.

In U-boot, simply set the correct value in the parameter ethaddr, ping any address and save the environment.

BIOS> setenv ethaddr 00:1e:ac:XX:XX:XX
BIOS> ping 1 
MAC: 00:1e:ac:XX:XX:XX                
operating at 100M full duplex mode    
 [Ctrl-C]
Abort
ping failed; host 1 is not alive
BIOS> saveenv

FIXME: The above message are made-up, don't know if reprogramming message is displayed or not...

Wrong MAC address

If the MAC address is already set but wrong, changing the U-boot parameter ethaddr will not automatically reprogram the EEPROM. It is necessary to indicate to U-boot to reprogram the EEPROM.

This is made possible by a specific patch to U-boot by Armadeus for the DM9000 chip [3] line 68 and following. Thanks to this patch, setting the ethaddr parameter to ff:ff:ff:ff:ff:ff and ping any IP will provoke the MAC address reprogramming. Then simply set ethaddr parameter again to the correct MAC address and ping any IP address, as shown below.

BIOS> setenv ethaddr ff:ff:ff:ff:ff:ff
BIOS> ping 1                          
Warning: MAC addresses reprogramming..
MAC: ff:ff:ff:ff:ff:ff                
operating at 100M full duplex mode    
 [Ctrl-C]
Abort
ping failed; host 1 is not alive
BIOS> setenv ethaddr 00:1e:ac:XX:XX:XX
BIOS> ping 1                          
Warning: MAC addresses reprogramming..
MAC: 00:1e:ac:XX:XX:XX                
operating at 100M full duplex mode    
 [Ctrl-C]
Abort
ping failed; host 1 is not alive
BIOS> 

Check your MAC address in Linux

Linux kernel and U-boot do not use the same source to get the board MAC address. As mentioned before, U-boot trusts its parameter ethaddr. Instead, Linux kernel, which uses the DM9000 driver, reads the MAC address from the EEPROM. During Linux boot, the driver prints the MAC address.

[...]
dm9000 Ethernet Driver, V1.31                                                                                             
eth0: dm9000e at c1854000,c1856002 IRQ 110 MAC: 00:1e:ac:xx:xx:xx (eeprom)
[...]

When logged on Linux, the tool ifconfig also displays information about the Ethernet MAC address.

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:1E:AC:XX:XX:XX
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::21e:acxx:xxxx:xx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)
          Interrupt:110 Base address:0x4000

The field HWaddr corresponds to the MAC address read by dm9000 driver and used during communication.