Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lan78xx: Read MAC address from DT if present

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>

authored by

Phil Elwell and committed by
David S. Miller
760db29b a83762d9

+20 -22
+20 -22
drivers/net/usb/lan78xx.c
··· 37 37 #include <linux/irqchip/chained_irq.h> 38 38 #include <linux/microchipphy.h> 39 39 #include <linux/phy.h> 40 + #include <linux/of_net.h> 40 41 #include "lan78xx.h" 41 42 42 43 #define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>" ··· 1653 1652 addr[5] = (addr_hi >> 8) & 0xFF; 1654 1653 1655 1654 if (!is_valid_ether_addr(addr)) { 1656 - /* reading mac address from EEPROM or OTP */ 1657 - if ((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN, 1658 - addr) == 0) || 1659 - (lan78xx_read_otp(dev, EEPROM_MAC_OFFSET, ETH_ALEN, 1660 - addr) == 0)) { 1661 - if (is_valid_ether_addr(addr)) { 1662 - /* eeprom values are valid so use them */ 1663 - netif_dbg(dev, ifup, dev->net, 1664 - "MAC address read from EEPROM"); 1665 - } else { 1666 - /* generate random MAC */ 1667 - random_ether_addr(addr); 1668 - netif_dbg(dev, ifup, dev->net, 1669 - "MAC address set to random addr"); 1670 - } 1671 - 1672 - addr_lo = addr[0] | (addr[1] << 8) | 1673 - (addr[2] << 16) | (addr[3] << 24); 1674 - addr_hi = addr[4] | (addr[5] << 8); 1675 - 1676 - ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo); 1677 - ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi); 1655 + if (!eth_platform_get_mac_address(&dev->udev->dev, addr)) { 1656 + /* valid address present in Device Tree */ 1657 + netif_dbg(dev, ifup, dev->net, 1658 + "MAC address read from Device Tree"); 1659 + } else if (((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, 1660 + ETH_ALEN, addr) == 0) || 1661 + (lan78xx_read_otp(dev, EEPROM_MAC_OFFSET, 1662 + ETH_ALEN, addr) == 0)) && 1663 + is_valid_ether_addr(addr)) { 1664 + /* eeprom values are valid so use them */ 1665 + netif_dbg(dev, ifup, dev->net, 1666 + "MAC address read from EEPROM"); 1678 1667 } else { 1679 1668 /* generate random MAC */ 1680 1669 random_ether_addr(addr); 1681 1670 netif_dbg(dev, ifup, dev->net, 1682 1671 "MAC address set to random addr"); 1683 1672 } 1673 + 1674 + addr_lo = addr[0] | (addr[1] << 8) | 1675 + (addr[2] << 16) | (addr[3] << 24); 1676 + addr_hi = addr[4] | (addr[5] << 8); 1677 + 1678 + ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo); 1679 + ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi); 1684 1680 } 1685 1681 1686 1682 ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo);