From nobody Mon Sep 17 00:00:00 2001 From: Francois Romieu Date: Sun May 14 12:18:44 2006 +0200 Subject: [PATCH] r8169: mac address change support Fix for http://bugzilla.kernel.org/show_bug.cgi?id=6032. Cc: Tim Mattox Signed-off-by: Francois Romieu --- drivers/net/r8169.c | 33 +++++++++++++++++++++++++++++++++ 1 files changed, 33 insertions(+), 0 deletions(-) ead70fc572805bf2bc567282203d276427e02630 diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 0ad3310..70a8cf1 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -1381,6 +1381,38 @@ 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, j; + + 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); + RTL_W8(Cfg9346, Cfg9346_Unlock); + for (i = 0; i < 2; i++) { + __le32 l = 0; + + for (j = 0; j < 4; j++) { + l <<= 8; + l |= dev->dev_addr[4*i + j]; + } + RTL_W32(MAC0 + 2*i, cpu_to_be32(l)); + } + RTL_W8(Cfg9346, Cfg9346_Lock); + 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 +1648,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; -- 1.3.1