From fdf5ff3cb91df352d3b50e637bdfffba00d72f77 Mon Sep 17 00:00:00 2001 From: "Luis R. Rodriguez" Date: Mon, 21 Jan 2013 13:31:01 -0800 Subject: [PATCH] compat: backport netdev_set_default_ethtool_ops() Stanislaw found that due to commit 2c60db03 by Eric Dumazet the wireless core was not assigning driver specific ethtool_ops. This was fixed by Stanislaw's commit d07d7507 which added netdev_set_default_ethtool_ops(). Since Eric's commit 2c60db03 is on v3.7-rc1 Stanislaw's fix is required down to v3.7 as well. The d07d7507 commit is currently present on v3.8-rc4 and is on its way to what we think may be v3.7.5. Because of this kernels older than v3.7.5 will require the full implementation while older kernels than v3.7.0 will require just assigning the ops passed only if netdev has no ops already set just as we used to have it implemented on cfg80211. mcgrof@frijol ~/linux-stable (git::linux-3.8.y)$ git describe --contains 2c60db v3.7-rc1~145^2~142 mcgrof@frijol ~/linux-stable (git::linux-3.8.y)$ git describe --contains d07d75 v3.8-rc4~29^2~4 ckmake results: 1 2.6.24 [ OK ] 2 2.6.25 [ OK ] 3 2.6.26 [ OK ] 4 2.6.27 [ OK ] 5 2.6.28 [ OK ] 6 2.6.29 [ OK ] 7 2.6.30 [ OK ] 8 2.6.31 [ OK ] 9 2.6.32 [ OK ] 10 2.6.33 [ OK ] 11 2.6.34 [ OK ] 12 2.6.35 [ OK ] 13 2.6.36 [ OK ] 14 2.6.37 [ OK ] 15 2.6.38 [ OK ] 16 2.6.39 [ OK ] 17 3.0.50 [ OK ] 18 3.1.10 [ OK ] 19 3.2.33 [ OK ] 20 3.3.8 [ OK ] 21 3.4.17 [ OK ] 22 3.5.7 [ OK ] 23 3.6.5 [ OK ] 24 3.7.0 [ OK ] real 0m34.791s user 11m38.572s sys 3m56.927s Signed-off-by: Luis R. Rodriguez --- compat/compat-3.8.c | 22 ++++++++++++++++++++++ include/linux/compat-3.8.h | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/compat/compat-3.8.c b/compat/compat-3.8.c index 034dd776ef2f..186725857412 100644 --- a/compat/compat-3.8.c +++ b/compat/compat-3.8.c @@ -16,6 +16,28 @@ #include #include #include "hid-ids.h" +#include + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,5)) + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)) +void netdev_set_default_ethtool_ops(struct net_device *dev, + const struct ethtool_ops *ops) +{ + if (!dev->ethtool_ops) + dev->ethtool_ops = ops; +} +#else /* kernel is between 3.7.0 and 3.7.4 */; +void netdev_set_default_ethtool_ops(struct net_device *dev, + const struct ethtool_ops *ops) +{ + if (dev->ethtool_ops == &default_ethtool_ops) + dev->ethtool_ops = ops; +} +#endif + +EXPORT_SYMBOL_GPL(netdev_set_default_ethtool_ops); +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,5) */ /* a list of devices that shouldn't be handled by HID core at all */ static const struct hid_device_id hid_ignore_list[] = { diff --git a/include/linux/compat-3.8.h b/include/linux/compat-3.8.h index 052de9570e07..942b4cbd3190 100644 --- a/include/linux/compat-3.8.h +++ b/include/linux/compat-3.8.h @@ -6,6 +6,12 @@ #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) #include +#include + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,5)) +extern void netdev_set_default_ethtool_ops(struct net_device *dev, + const struct ethtool_ops *ops); +#endif #define HID_BUS_ANY 0xffff #define HID_GROUP_ANY 0x0000 -- 2.30.2