Skip to content

Commit

Permalink
lan78xx: Read MAC address from DT if present
Browse files Browse the repository at this point in the history
There is a standard mechanism for locating and using a MAC address from
the Device Tree. Use this facility in the lan78xx driver to support
applications without programmed EEPROM or OTP. At the same time,
regularise the handling of the different address sources.

Signed-off-by: Phil Elwell <phil@raspberrypi.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Phil Elwell authored and David S. Miller committed Apr 20, 2018
1 parent a83762d commit 760db29
Showing 1 changed file with 20 additions and 22 deletions.
42 changes: 20 additions & 22 deletions drivers/net/usb/lan78xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include <linux/irqchip/chained_irq.h>
#include <linux/microchipphy.h>
#include <linux/phy.h>
#include <linux/of_net.h>
#include "lan78xx.h"

#define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>"
Expand Down Expand Up @@ -1652,34 +1653,31 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
addr[5] = (addr_hi >> 8) & 0xFF;

if (!is_valid_ether_addr(addr)) {
/* reading mac address from EEPROM or OTP */
if ((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
addr) == 0) ||
(lan78xx_read_otp(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
addr) == 0)) {
if (is_valid_ether_addr(addr)) {
/* eeprom values are valid so use them */
netif_dbg(dev, ifup, dev->net,
"MAC address read from EEPROM");
} else {
/* generate random MAC */
random_ether_addr(addr);
netif_dbg(dev, ifup, dev->net,
"MAC address set to random addr");
}

addr_lo = addr[0] | (addr[1] << 8) |
(addr[2] << 16) | (addr[3] << 24);
addr_hi = addr[4] | (addr[5] << 8);

ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
if (!eth_platform_get_mac_address(&dev->udev->dev, addr)) {
/* valid address present in Device Tree */
netif_dbg(dev, ifup, dev->net,
"MAC address read from Device Tree");
} else if (((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET,
ETH_ALEN, addr) == 0) ||
(lan78xx_read_otp(dev, EEPROM_MAC_OFFSET,
ETH_ALEN, addr) == 0)) &&
is_valid_ether_addr(addr)) {
/* eeprom values are valid so use them */
netif_dbg(dev, ifup, dev->net,
"MAC address read from EEPROM");
} else {
/* generate random MAC */
random_ether_addr(addr);
netif_dbg(dev, ifup, dev->net,
"MAC address set to random addr");
}

addr_lo = addr[0] | (addr[1] << 8) |
(addr[2] << 16) | (addr[3] << 24);
addr_hi = addr[4] | (addr[5] << 8);

ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
}

ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
Expand Down

0 comments on commit 760db29

Please sign in to comment.