wireless: implement basic ethtool support for cfg80211 devices
John W. Linville [Wed, 30 Sep 2009 18:50:17 +0000 (14:50 -0400)]
Signed-off-by: John W. Linville <linville@tuxdriver.com>

net/wireless/Makefile
net/wireless/core.c
net/wireless/ethtool.c [new file with mode: 0644]
net/wireless/ethtool.h [new file with mode: 0644]

index c814150..f07c8dc 100644 (file)
@@ -10,7 +10,7 @@ obj-$(CONFIG_WEXT_SPY) += wext-spy.o
 obj-$(CONFIG_WEXT_PRIV) += wext-priv.o
 
 cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o
-cfg80211-y += mlme.o ibss.o sme.o chan.o
+cfg80211-y += mlme.o ibss.o sme.o chan.o ethtool.o
 cfg80211-$(CONFIG_CFG80211_DEBUGFS) += debugfs.o
 cfg80211-$(CONFIG_CFG80211_WEXT) += wext-compat.o wext-sme.o
 
index eb0bb24..0725296 100644 (file)
@@ -21,6 +21,7 @@
 #include "sysfs.h"
 #include "debugfs.h"
 #include "wext-compat.h"
+#include "ethtool.h"
 
 /* name for sysfs, %d is appended */
 #define PHY_NAME "phy"
@@ -690,6 +691,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
                                wdev->wext.ps = false;
                        }
 #endif
+               if (!dev->ethtool_ops)
+                       dev->ethtool_ops = &cfg80211_ethtool_ops;
                break;
        case NETDEV_GOING_DOWN:
                switch (wdev->iftype) {
diff --git a/net/wireless/ethtool.c b/net/wireless/ethtool.c
new file mode 100644 (file)
index 0000000..80d6d0d
--- /dev/null
@@ -0,0 +1,24 @@
+#include <linux/utsname.h>
+#include <net/cfg80211.h>
+#include "ethtool.h"
+
+static void cfg80211_get_drvinfo(struct net_device *dev,
+                                       struct ethtool_drvinfo *info)
+{
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+
+       strlcpy(info->driver, wiphy_dev(wdev->wiphy)->driver->name,
+               sizeof(info->driver));
+
+       strlcpy(info->version, init_utsname()->release, sizeof(info->version));
+
+       strlcpy(info->fw_version, "N/A", sizeof(info->fw_version));
+
+       strlcpy(info->bus_info, dev_name(wiphy_dev(wdev->wiphy)),
+               sizeof(info->bus_info));
+}
+
+const struct ethtool_ops cfg80211_ethtool_ops = {
+       .get_drvinfo = cfg80211_get_drvinfo,
+       .get_link = ethtool_op_get_link,
+};
diff --git a/net/wireless/ethtool.h b/net/wireless/ethtool.h
new file mode 100644 (file)
index 0000000..70cbee1
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef __CFG80211_ETHTOOL__
+#define __CFG80211_ETHTOOL__
+
+#include <linux/ethtool.h>
+
+extern const struct ethtool_ops cfg80211_ethtool_ops;
+
+#endif /* __CFG80211_ETHTOOL__ */