diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 0ad3310..8b8e042 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -1381,6 +1381,29 @@ static void rtl8169_netpoll(struct net_d } #endif +static void rtl8169_set_mac_addr(struct net_device *dev, void *p) +{ + struct rtl8169_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + struct sockaddr *addr = p; + unsigned int i; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EINVAL; + + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + + if (!netif_running(dev)) + goto out; + + spin_lock_irq(&tp->lock); + for (i = 0; i < MAC_ADDR_LEN; i++) + RTL_W8(MAC0 + i, dev->dev_addr[i]); + spin_unlock_irq(&tp->lock); +out: + return 0; +} + static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev, void __iomem *ioaddr) { @@ -1616,6 +1639,7 @@ rtl8169_init_one(struct pci_dev *pdev, c dev->stop = rtl8169_close; dev->tx_timeout = rtl8169_tx_timeout; dev->set_multicast_list = rtl8169_set_rx_mode; + dev->set_mac_address = rtl8169_set_mac_addr; dev->watchdog_timeo = RTL8169_TX_TIMEOUT; dev->irq = pdev->irq; dev->base_addr = (unsigned long) ioaddr;