| /* | |
| * Wireless configuration interface internals. | |
| * | |
| * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net> | |
| */ | |
| #ifndef __NET_WIRELESS_CORE_H | |
| #define __NET_WIRELESS_CORE_H | |
| #include <linux/mutex.h> | |
| #include <linux/list.h> | |
| #include <linux/netdevice.h> | |
| #include <net/genetlink.h> | |
| #include <net/wireless.h> | |
| #include <net/cfg80211.h> | |
| struct cfg80211_registered_device { | |
| struct cfg80211_ops *ops; | |
| struct list_head list; | |
| /* we hold this mutex during any call so that | |
| * we cannot do multiple calls at once, and also | |
| * to avoid the deregister call to proceed while | |
| * any call is in progress */ | |
| struct mutex mtx; | |
| /* wiphy index, internal only */ | |
| int idx; | |
| /* associate netdev list */ | |
| struct mutex devlist_mtx; | |
| struct list_head netdev_list; | |
| /* must be last because of the way we do wiphy_priv(), | |
| * and it should at least be aligned to NETDEV_ALIGN */ | |
| struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN))); | |
| }; | |
| static inline | |
| struct cfg80211_registered_device *wiphy_to_dev(struct wiphy *wiphy) | |
| { | |
| BUG_ON(!wiphy); | |
| return container_of(wiphy, struct cfg80211_registered_device, wiphy); | |
| } | |
| extern struct mutex cfg80211_drv_mutex; | |
| extern struct list_head cfg80211_drv_list; | |
| /* | |
| * This function returns a pointer to the driver | |
| * that the genl_info item that is passed refers to. | |
| * If successful, it returns non-NULL and also locks | |
| * the driver's mutex! | |
| * | |
| * This means that you need to call cfg80211_put_dev() | |
| * before being allowed to acquire &cfg80211_drv_mutex! | |
| * | |
| * This is necessary because we need to lock the global | |
| * mutex to get an item off the list safely, and then | |
| * we lock the drv mutex so it doesn't go away under us. | |
| * | |
| * We don't want to keep cfg80211_drv_mutex locked | |
| * for all the time in order to allow requests on | |
| * other interfaces to go through at the same time. | |
| * | |
| * The result of this can be a PTR_ERR and hence must | |
| * be checked with IS_ERR() for errors. | |
| */ | |
| extern struct cfg80211_registered_device * | |
| cfg80211_get_dev_from_info(struct genl_info *info); | |
| /* identical to cfg80211_get_dev_from_info but only operate on ifindex */ | |
| extern struct cfg80211_registered_device * | |
| cfg80211_get_dev_from_ifindex(int ifindex); | |
| extern void cfg80211_put_dev(struct cfg80211_registered_device *drv); | |
| /* free object */ | |
| extern void cfg80211_dev_free(struct cfg80211_registered_device *drv); | |
| extern int cfg80211_dev_rename(struct cfg80211_registered_device *drv, | |
| char *newname); | |
| void ieee80211_set_bitrate_flags(struct wiphy *wiphy); | |
| void wiphy_update_regulatory(struct wiphy *wiphy); | |
| #endif /* __NET_WIRELESS_CORE_H */ |