cfg80211: clean up signal type
authorJohannes Berg <johannes@sipsolutions.net>
Wed, 18 Feb 2009 17:45:06 +0000 (18:45 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 27 Feb 2009 19:52:42 +0000 (14:52 -0500)
It wasn't a good idea to make the signal type a per-BSS option,
although then it is closer to the actual value. Move it to be
a per-wiphy setting, update mac80211 to match.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/cfg80211.h
include/net/wireless.h
net/mac80211/main.c
net/mac80211/scan.c
net/wireless/nl80211.c
net/wireless/scan.c

index 8dcc464440374ea9c423fd9857e80217dbc4191b..e0312746a8cced434644ae1738cbf3ebe38ef589 100644 (file)
@@ -577,8 +577,7 @@ enum cfg80211_signal_type {
  * @information_elements: the information elements (Note that there
  *     is no guarantee that these are well-formed!)
  * @len_information_elements: total length of the information elements
- * @signal: signal strength value
- * @signal_type: signal type
+ * @signal: signal strength value (type depends on the wiphy's signal_type)
  * @free_priv: function pointer to free private data
  * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
  */
@@ -593,7 +592,6 @@ struct cfg80211_bss {
        size_t len_information_elements;
 
        s32 signal;
-       enum cfg80211_signal_type signal_type;
 
        void (*free_priv)(struct cfg80211_bss *bss);
        u8 priv[0] __attribute__((__aligned__(sizeof(void *))));
@@ -782,6 +780,7 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted);
  *
  * @wiphy: the wiphy reporting the BSS
  * @bss: the found BSS
+ * @signal: the signal strength, type depends on the wiphy's signal_type
  * @gfp: context flags
  *
  * This informs cfg80211 that BSS information was found and
@@ -791,8 +790,7 @@ struct cfg80211_bss*
 cfg80211_inform_bss_frame(struct wiphy *wiphy,
                          struct ieee80211_channel *channel,
                          struct ieee80211_mgmt *mgmt, size_t len,
-                         s32 signal, enum cfg80211_signal_type sigtype,
-                         gfp_t gfp);
+                         s32 signal, gfp_t gfp);
 
 struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
                                      struct ieee80211_channel *channel,
index 1c6285eb166668dbf267d7c79d3d9d8be7307133..d815aa8b4534ed6914f843eb032e8e6d238510e2 100644 (file)
@@ -200,6 +200,7 @@ struct ieee80211_supported_band {
  *     the regulatory_hint() API. This can be used by the driver
  *     on the reg_notifier() if it chooses to ignore future
  *     regulatory domain changes caused by other drivers.
+ * @signal_type: signal type reported in &struct cfg80211_bss.
  */
 struct wiphy {
        /* assign these fields before you register the wiphy */
@@ -213,6 +214,8 @@ struct wiphy {
        bool custom_regulatory;
        bool strict_regulatory;
 
+       enum cfg80211_signal_type signal_type;
+
        int bss_priv_size;
        u8 max_scan_ssids;
 
index fce9d08986e9de911785fcc80e47dbd94b28f574..f38db4d37e5d6bd93c93ceff48652ce78f6bb0bf 100644 (file)
@@ -861,6 +861,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        /* mac80211 always supports monitor */
        local->hw.wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
 
+       if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
+               local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
+       else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
+               local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC;
+
        result = wiphy_register(local->hw.wiphy);
        if (result < 0)
                goto fail_wiphy_register;
index c063f8204263d1883151aa5723308ce6ebf2fbde..23f4de274744cbb73dbda94f3360b5aba14344ae 100644 (file)
@@ -63,20 +63,15 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
 {
        struct ieee80211_bss *bss;
        int clen;
-       enum cfg80211_signal_type sigtype = CFG80211_SIGNAL_TYPE_NONE;
        s32 signal = 0;
 
-       if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
-               sigtype = CFG80211_SIGNAL_TYPE_MBM;
+       if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
                signal = rx_status->signal * 100;
-       } else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) {
-               sigtype = CFG80211_SIGNAL_TYPE_UNSPEC;
+       else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
                signal = (rx_status->signal * 100) / local->hw.max_signal;
-       }
 
        bss = (void *)cfg80211_inform_bss_frame(local->hw.wiphy, channel,
-                                               mgmt, len, signal, sigtype,
-                                               GFP_ATOMIC);
+                                               mgmt, len, signal, GFP_ATOMIC);
 
        if (!bss)
                return NULL;
index 245fddcc77c31438aa5788e142c4cc3a71df51ab..a7e751edc73953b5487708e68b45c6dcc6b81834 100644 (file)
@@ -2457,7 +2457,7 @@ static int nl80211_send_bss(struct sk_buff *msg, u32 pid, u32 seq, int flags,
        NLA_PUT_U16(msg, NL80211_BSS_CAPABILITY, res->capability);
        NLA_PUT_U32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq);
 
-       switch (res->signal_type) {
+       switch (rdev->wiphy.signal_type) {
        case CFG80211_SIGNAL_TYPE_MBM:
                NLA_PUT_U32(msg, NL80211_BSS_SIGNAL_MBM, res->signal);
                break;
index 01c136d98c5b756b18c077c9d506290a7db0c299..60600657b65755816fde7ccff48dcb9af737cff0 100644 (file)
@@ -370,7 +370,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
                found->pub.beacon_interval = res->pub.beacon_interval;
                found->pub.tsf = res->pub.tsf;
                found->pub.signal = res->pub.signal;
-               found->pub.signal_type = res->pub.signal_type;
                found->pub.capability = res->pub.capability;
                found->ts = res->ts;
                kref_put(&res->ref, bss_release);
@@ -392,8 +391,7 @@ struct cfg80211_bss *
 cfg80211_inform_bss_frame(struct wiphy *wiphy,
                          struct ieee80211_channel *channel,
                          struct ieee80211_mgmt *mgmt, size_t len,
-                         s32 signal, enum cfg80211_signal_type sigtype,
-                         gfp_t gfp)
+                         s32 signal, gfp_t gfp)
 {
        struct cfg80211_internal_bss *res;
        size_t ielen = len - offsetof(struct ieee80211_mgmt,
@@ -401,7 +399,7 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
        bool overwrite;
        size_t privsz = wiphy->bss_priv_size;
 
-       if (WARN_ON(sigtype == NL80211_BSS_SIGNAL_UNSPEC &&
+       if (WARN_ON(wiphy->signal_type == NL80211_BSS_SIGNAL_UNSPEC &&
                    (signal < 0 || signal > 100)))
                return NULL;
 
@@ -415,7 +413,6 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
 
        memcpy(res->pub.bssid, mgmt->bssid, ETH_ALEN);
        res->pub.channel = channel;
-       res->pub.signal_type = sigtype;
        res->pub.signal = signal;
        res->pub.tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
        res->pub.beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
@@ -607,9 +604,9 @@ static inline unsigned int elapsed_jiffies_msecs(unsigned long start)
 }
 
 static char *
-ieee80211_bss(struct iw_request_info *info,
-                     struct cfg80211_internal_bss *bss,
-                     char *current_ev, char *end_buf)
+ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
+             struct cfg80211_internal_bss *bss, char *current_ev,
+             char *end_buf)
 {
        struct iw_event iwe;
        u8 *buf, *cfg, *p;
@@ -638,13 +635,13 @@ ieee80211_bss(struct iw_request_info *info,
        current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,
                                          IW_EV_FREQ_LEN);
 
-       if (bss->pub.signal_type != CFG80211_SIGNAL_TYPE_NONE) {
+       if (wiphy->signal_type != CFG80211_SIGNAL_TYPE_NONE) {
                memset(&iwe, 0, sizeof(iwe));
                iwe.cmd = IWEVQUAL;
                iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
                                     IW_QUAL_NOISE_INVALID |
                                     IW_QUAL_QUAL_UPDATED;
-               switch (bss->pub.signal_type) {
+               switch (wiphy->signal_type) {
                case CFG80211_SIGNAL_TYPE_MBM:
                        sig = bss->pub.signal / 100;
                        iwe.u.qual.level = sig;
@@ -823,8 +820,8 @@ static int ieee80211_scan_results(struct cfg80211_registered_device *dev,
                        spin_unlock_bh(&dev->bss_lock);
                        return -E2BIG;
                }
-               current_ev = ieee80211_bss(info, bss,
-                                                  current_ev, end_buf);
+               current_ev = ieee80211_bss(&dev->wiphy, info, bss,
+                                          current_ev, end_buf);
        }
        spin_unlock_bh(&dev->bss_lock);
        return current_ev - buf;