From: Patrick Ziegler Date: Thu, 15 Aug 2013 12:40:09 +0000 (+0200) Subject: backports: add eth_prepare_mac_addr_change() and eth_commit_mac_addr_change() X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=521acfd92f168fc9b8b6a1cefe9a165243f3d872;p=openwrt%2Fstaging%2Fblogic.git backports: add eth_prepare_mac_addr_change() and eth_commit_mac_addr_change() These functions are required by qmi_wwan device driver. Signed-off-by: Patrick Ziegler Signed-off-by: Luis R. Rodriguez --- diff --git a/backport/backport-include/linux/etherdevice.h b/backport/backport-include/linux/etherdevice.h index 5c82fc4e9cf6..6aff2449c348 100644 --- a/backport/backport-include/linux/etherdevice.h +++ b/backport/backport-include/linux/etherdevice.h @@ -114,6 +114,14 @@ static inline int is_unicast_ether_addr(const u8 *addr) } #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) +#define eth_prepare_mac_addr_change LINUX_BACKPORT(eth_prepare_mac_addr_change) +extern int eth_prepare_mac_addr_change(struct net_device *dev, void *p); + +#define eth_commit_mac_addr_change LINUX_BACKPORT(eth_commit_mac_addr_change) +extern void eth_commit_mac_addr_change(struct net_device *dev, void *p); +#endif /* < 3.9 */ + #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) #define eth_mac_addr LINUX_BACKPORT(eth_mac_addr) extern int eth_mac_addr(struct net_device *dev, void *p); diff --git a/backport/backport-include/linux/if.h b/backport/backport-include/linux/if.h index 79260820ac9a..8f85b83e635c 100644 --- a/backport/backport-include/linux/if.h +++ b/backport/backport-include/linux/if.h @@ -29,4 +29,8 @@ #define IFF_TX_SKB_SHARING 0x10000 #endif +#ifndef IFF_LIVE_ADDR_CHANGE +#define IFF_LIVE_ADDR_CHANGE 0x100000 +#endif + #endif /* _BACKPORT_LINUX_IF_H */ diff --git a/backport/compat/compat-3.9.c b/backport/compat/compat-3.9.c index 03f3af8a3da9..ba8e3cf490d9 100644 --- a/backport/compat/compat-3.9.c +++ b/backport/compat/compat-3.9.c @@ -12,6 +12,9 @@ #include #include #include +#include +#include +#include #ifdef __sg_page_iter_next @@ -64,4 +67,34 @@ void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) } EXPORT_SYMBOL_GPL(devm_ioremap_resource); +/** + * eth_prepare_mac_addr_change - prepare for mac change + * @dev: network device + * @p: socket address + */ +int eth_prepare_mac_addr_change(struct net_device *dev, void *p) +{ + struct sockaddr *addr = p; + + if (!(dev->priv_flags & IFF_LIVE_ADDR_CHANGE) && netif_running(dev)) + return -EBUSY; + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + return 0; +} +EXPORT_SYMBOL_GPL(eth_prepare_mac_addr_change); + +/** + * eth_commit_mac_addr_change - commit mac change + * @dev: network device + * @p: socket address + */ +void eth_commit_mac_addr_change(struct net_device *dev, void *p) +{ + struct sockaddr *addr = p; + + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); +} +EXPORT_SYMBOL_GPL(eth_commit_mac_addr_change); + #endif /* __sg_page_iter_next */