Commit 04c7788c authored by Thierry Reding's avatar Thierry Reding Committed by David S. Miller

r8169: Load MAC address from device tree if present

If the system was booted using a device tree and if the device tree
contains a MAC address, use it instead of reading one from the EEPROM.
This is useful in situations where the EEPROM isn't properly programmed
or where the firmware wants to override the existing MAC address.
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
Reviewed-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c53f59d4
...@@ -7110,6 +7110,21 @@ static int rtl_alloc_irq(struct rtl8169_private *tp) ...@@ -7110,6 +7110,21 @@ static int rtl_alloc_irq(struct rtl8169_private *tp)
return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags); return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags);
} }
static void rtl_read_mac_address(struct rtl8169_private *tp,
u8 mac_addr[ETH_ALEN])
{
/* Get MAC address */
switch (tp->mac_version) {
case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38:
case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51:
*(u32 *)&mac_addr[0] = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC);
*(u16 *)&mac_addr[4] = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC);
break;
default:
break;
}
}
DECLARE_RTL_COND(rtl_link_list_ready_cond) DECLARE_RTL_COND(rtl_link_list_ready_cond)
{ {
return RTL_R8(tp, MCU) & LINK_LIST_RDY; return RTL_R8(tp, MCU) & LINK_LIST_RDY;
...@@ -7301,6 +7316,7 @@ static int rtl_get_ether_clk(struct rtl8169_private *tp) ...@@ -7301,6 +7316,7 @@ static int rtl_get_ether_clk(struct rtl8169_private *tp)
static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data; const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
u8 mac_addr[ETH_ALEN] __aligned(4) = {};
struct rtl8169_private *tp; struct rtl8169_private *tp;
struct net_device *dev; struct net_device *dev;
int chipset, region, i; int chipset, region, i;
...@@ -7403,20 +7419,14 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -7403,20 +7419,14 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
u64_stats_init(&tp->rx_stats.syncp); u64_stats_init(&tp->rx_stats.syncp);
u64_stats_init(&tp->tx_stats.syncp); u64_stats_init(&tp->tx_stats.syncp);
/* Get MAC address */ /* get MAC address */
switch (tp->mac_version) { rc = eth_platform_get_mac_address(&pdev->dev, mac_addr);
u8 mac_addr[ETH_ALEN] __aligned(4); if (rc)
case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38: rtl_read_mac_address(tp, mac_addr);
case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51:
*(u32 *)&mac_addr[0] = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC); if (is_valid_ether_addr(mac_addr))
*(u16 *)&mac_addr[4] = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC); rtl_rar_set(tp, mac_addr);
if (is_valid_ether_addr(mac_addr))
rtl_rar_set(tp, mac_addr);
break;
default:
break;
}
for (i = 0; i < ETH_ALEN; i++) for (i = 0; i < ETH_ALEN; i++)
dev->dev_addr[i] = RTL_R8(tp, MAC0 + i); dev->dev_addr[i] = RTL_R8(tp, MAC0 + i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment