backports: add eth_prepare_mac_addr_change() and eth_commit_mac_addr_change()
authorPatrick Ziegler <patrick.ziegler@fh-kl.de>
Thu, 15 Aug 2013 12:40:09 +0000 (14:40 +0200)
committerLuis R. Rodriguez <mcgrof@do-not-panic.com>
Fri, 16 Aug 2013 02:56:27 +0000 (19:56 -0700)
These functions are required by qmi_wwan device driver.

Signed-off-by: Patrick Ziegler <patrick.ziegler@fh-kl.de>
Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
backport/backport-include/linux/etherdevice.h
backport/backport-include/linux/if.h
backport/compat/compat-3.9.c

index 5c82fc4e9cf61952f3f605603eba269ff1938a50..6aff2449c34846e89d5012ee295b88ac7c083f53 100644 (file)
@@ -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);
index 79260820ac9ad5ef4463ced6edbd311d95884bf0..8f85b83e635c708d4d3c3df6d0884500d65f73dc 100644 (file)
@@ -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 */
index 03f3af8a3da9c1d18fff62d06f02666817e331c9..ba8e3cf490d945c83c84e40bad20fba9e5a9945f 100644 (file)
@@ -12,6 +12,9 @@
 #include <linux/scatterlist.h>
 #include <linux/device.h>
 #include <linux/err.h>
+#include <linux/netdevice.h>
+#include <linux/if.h>
+#include <linux/if_ether.h>
 
 #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 */