mac80211: calculate wstats_flags on the fly
authorJohannes Berg <johannes@sipsolutions.net>
Tue, 10 Feb 2009 20:26:01 +0000 (21:26 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 13 Feb 2009 18:45:59 +0000 (13:45 -0500)
Just to make wext.c more self-contained.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/ieee80211_i.h
net/mac80211/main.c
net/mac80211/wext.c

index 678278344d79913f3e3ce4714a1de7ea277ff254..2cb743ed9f9c715dc830bc5a96357346fdaa5176 100644 (file)
@@ -592,7 +592,6 @@ struct ieee80211_local {
        int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss;
        unsigned int filter_flags; /* FIF_* */
        struct iw_statistics wstats;
-       u8 wstats_flags;
        bool tim_in_locked_section; /* see ieee80211_beacon_get() */
        int tx_headroom; /* required headroom for hardware/radiotap */
 
index b4973a1b65952fba9906e7435323871de47da3db..5667f4e8067fdd4f885a507fa15a5085003f1dcd 100644 (file)
@@ -905,14 +905,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
 
        local->hw.conf.listen_interval = local->hw.max_listen_interval;
 
-       local->wstats_flags |= local->hw.flags & (IEEE80211_HW_SIGNAL_UNSPEC |
-                                                 IEEE80211_HW_SIGNAL_DBM) ?
-                              IW_QUAL_QUAL_UPDATED : IW_QUAL_QUAL_INVALID;
-       local->wstats_flags |= local->hw.flags & IEEE80211_HW_NOISE_DBM ?
-                              IW_QUAL_NOISE_UPDATED : IW_QUAL_NOISE_INVALID;
-       if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
-               local->wstats_flags |= IW_QUAL_DBM;
-
        result = sta_info_start(local);
        if (result < 0)
                goto fail_sta_info;
index b337d7d5edb3b21dfebb365ac3ae825f77a6ad90..2b023dce8b24618a2130df07a072df1c08d1f4a9 100644 (file)
@@ -145,6 +145,21 @@ static int ieee80211_ioctl_siwgenie(struct net_device *dev,
        return -EOPNOTSUPP;
 }
 
+static u8 ieee80211_get_wstats_flags(struct ieee80211_local *local)
+{
+       u8 wstats_flags = 0;
+
+       wstats_flags |= local->hw.flags & (IEEE80211_HW_SIGNAL_UNSPEC |
+                                          IEEE80211_HW_SIGNAL_DBM) ?
+                               IW_QUAL_QUAL_UPDATED : IW_QUAL_QUAL_INVALID;
+       wstats_flags |= local->hw.flags & IEEE80211_HW_NOISE_DBM ?
+                               IW_QUAL_NOISE_UPDATED : IW_QUAL_NOISE_INVALID;
+       if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
+               wstats_flags |= IW_QUAL_DBM;
+
+       return wstats_flags;
+}
+
 static int ieee80211_ioctl_giwrange(struct net_device *dev,
                                 struct iw_request_info *info,
                                 struct iw_point *data, char *extra)
@@ -187,13 +202,13 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev,
                range->max_qual.noise = 0;
 
        range->max_qual.qual = 100;
-       range->max_qual.updated = local->wstats_flags;
+       range->max_qual.updated = ieee80211_get_wstats_flags(local);
 
        range->avg_qual.qual = 50;
        /* not always true but better than nothing */
        range->avg_qual.level = range->max_qual.level / 2;
        range->avg_qual.noise = range->max_qual.noise / 2;
-       range->avg_qual.updated = local->wstats_flags;
+       range->avg_qual.updated = ieee80211_get_wstats_flags(local);
 
        range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
                          IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
@@ -979,7 +994,7 @@ static struct iw_statistics *ieee80211_get_wireless_stats(struct net_device *dev
                wstats->qual.level = sta->last_signal;
                wstats->qual.qual = sta->last_qual;
                wstats->qual.noise = sta->last_noise;
-               wstats->qual.updated = local->wstats_flags;
+               wstats->qual.updated = ieee80211_get_wstats_flags(local);
        }
 
        rcu_read_unlock();