From 17a6636c4127b7a04c0bc093571985fbc6938db9 Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Tue, 7 Feb 2012 13:44:50 +0100 Subject: [PATCH 2/2] eth/smsc95xx: fix net_device addr_assign_type handling Fix net_device->addr_assign_type handling in case of generating a random MAC address to reflect the correct state via sysfs to userspace. In case the MAC address get changed via SIOCSIFHWADDR remove NET_ADDR_RANDOM from addr_assign_type in eth_mac_addr(). Signed-off-by: Danny Kukawka --- drivers/net/usb/smsc95xx.c | 2 +- net/ethernet/eth.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index d45520e..3a28e95 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -614,7 +614,7 @@ static void smsc95xx_init_mac_address(struct usbnet *dev) } /* no eeprom, or eeprom values are invalid. generate random MAC */ - random_ether_addr(dev->net->dev_addr); + dev_hw_addr_random (dev->net , dev->net->dev_addr); netif_dbg(dev, ifup, dev->net, "MAC address set to random_ether_addr\n"); } diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index a246836..65224bd 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -288,6 +288,11 @@ int eth_mac_addr(struct net_device *dev, void *p) if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); + /* if device marked as NET_ADDR_RANDOM, reset it to NET_ADDR_PERM */ + if (dev->addr_assign_type & NET_ADDR_RANDOM) { + dev->addr_assign_type ^= NET_ADDR_RANDOM; + } + return 0; } EXPORT_SYMBOL(eth_mac_addr); -- 1.7.7.3