linux/net/wireless/sysfs.c
<<
>>
Prefs
   1/*
   2 * This file provides /sys/class/ieee80211/<wiphy name>/
   3 * and some default attributes.
   4 *
   5 * Copyright 2005-2006  Jiri Benc <jbenc@suse.cz>
   6 * Copyright 2006       Johannes Berg <johannes@sipsolutions.net>
   7 *
   8 * This file is GPLv2 as found in COPYING.
   9 */
  10
  11#include <linux/device.h>
  12#include <linux/module.h>
  13#include <linux/netdevice.h>
  14#include <linux/nl80211.h>
  15#include <linux/rtnetlink.h>
  16#include <net/cfg80211.h>
  17#include "sysfs.h"
  18#include "core.h"
  19
  20static inline struct cfg80211_registered_device *dev_to_rdev(
  21        struct device *dev)
  22{
  23        return container_of(dev, struct cfg80211_registered_device, wiphy.dev);
  24}
  25
  26#define SHOW_FMT(name, fmt, member)                                     \
  27static ssize_t name ## _show(struct device *dev,                        \
  28                              struct device_attribute *attr,            \
  29                              char *buf)                                \
  30{                                                                       \
  31        return sprintf(buf, fmt "\n", dev_to_rdev(dev)->member);        \
  32}
  33
  34SHOW_FMT(index, "%d", wiphy_idx);
  35SHOW_FMT(macaddress, "%pM", wiphy.perm_addr);
  36SHOW_FMT(address_mask, "%pM", wiphy.addr_mask);
  37
  38static ssize_t addresses_show(struct device *dev,
  39                              struct device_attribute *attr,
  40                              char *buf)
  41{
  42        struct wiphy *wiphy = &dev_to_rdev(dev)->wiphy;
  43        char *start = buf;
  44        int i;
  45
  46        if (!wiphy->addresses)
  47                return sprintf(buf, "%pM\n", wiphy->perm_addr);
  48
  49        for (i = 0; i < wiphy->n_addresses; i++)
  50                buf += sprintf(buf, "%pM\n", &wiphy->addresses[i].addr);
  51
  52        return buf - start;
  53}
  54
  55static struct device_attribute ieee80211_dev_attrs[] = {
  56        __ATTR_RO(index),
  57        __ATTR_RO(macaddress),
  58        __ATTR_RO(address_mask),
  59        __ATTR_RO(addresses),
  60        {}
  61};
  62
  63static void wiphy_dev_release(struct device *dev)
  64{
  65        struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
  66
  67        cfg80211_dev_free(rdev);
  68}
  69
  70#ifdef CONFIG_HOTPLUG
  71static int wiphy_uevent(struct device *dev, struct kobj_uevent_env *env)
  72{
  73        /* TODO, we probably need stuff here */
  74        return 0;
  75}
  76#endif
  77
  78static int wiphy_suspend(struct device *dev, pm_message_t state)
  79{
  80        struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
  81        int ret = 0;
  82
  83        rdev->suspend_at = get_seconds();
  84
  85        if (rdev->ops->suspend) {
  86                rtnl_lock();
  87                ret = rdev->ops->suspend(&rdev->wiphy);
  88                rtnl_unlock();
  89        }
  90
  91        return ret;
  92}
  93
  94static int wiphy_resume(struct device *dev)
  95{
  96        struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
  97        int ret = 0;
  98
  99        /* Age scan results with time spent in suspend */
 100        spin_lock_bh(&rdev->bss_lock);
 101        cfg80211_bss_age(rdev, get_seconds() - rdev->suspend_at);
 102        spin_unlock_bh(&rdev->bss_lock);
 103
 104        if (rdev->ops->resume) {
 105                rtnl_lock();
 106                ret = rdev->ops->resume(&rdev->wiphy);
 107                rtnl_unlock();
 108        }
 109
 110        return ret;
 111}
 112
 113struct class ieee80211_class = {
 114        .name = "ieee80211",
 115        .owner = THIS_MODULE,
 116        .dev_release = wiphy_dev_release,
 117        .dev_attrs = ieee80211_dev_attrs,
 118#ifdef CONFIG_HOTPLUG
 119        .dev_uevent = wiphy_uevent,
 120#endif
 121        .suspend = wiphy_suspend,
 122        .resume = wiphy_resume,
 123};
 124
 125int wiphy_sysfs_init(void)
 126{
 127        return class_register(&ieee80211_class);
 128}
 129
 130void wiphy_sysfs_exit(void)
 131{
 132        class_unregister(&ieee80211_class);
 133}
 134
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.