wl1271: add get_survey callback in order to get channel noise
authorJohn W. Linville <linville@tuxdriver.com>
Wed, 28 Jul 2010 20:41:06 +0000 (16:41 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 29 Jul 2010 16:46:49 +0000 (12:46 -0400)
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Acked-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
drivers/net/wireless/wl12xx/wl1271.h
drivers/net/wireless/wl12xx/wl1271_main.c
drivers/net/wireless/wl12xx/wl1271_rx.c

index 53d47d7a2a1ddf757c59194ffc60940f9e12d804..dd3cee6ea5bb6d486b27973d95f9fa5a35e842f1 100644 (file)
@@ -475,6 +475,9 @@ struct wl1271 {
        bool sg_enabled;
 
        struct list_head list;
+
+       /* Most recently reported noise in dBm */
+       s8 noise;
 };
 
 int wl1271_plt_start(struct wl1271 *wl);
index 864318f096eafae696bcccb872116ed1d6f691ed..374abf0f5cc77dc18855089146b65846efb20fd9 100644 (file)
@@ -1927,6 +1927,22 @@ out:
        return mactime;
 }
 
+static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
+                               struct survey_info *survey)
+{
+       struct wl1271 *wl = hw->priv;
+       struct ieee80211_conf *conf = &hw->conf;
+       if (idx != 0)
+               return -ENOENT;
+       survey->channel = conf->channel;
+       survey->filled = SURVEY_INFO_NOISE_DBM;
+       survey->noise = wl->noise;
+       return 0;
+}
+
 /* can't be const, mac80211 writes to this */
 static struct ieee80211_rate wl1271_rates[] = {
        { .bitrate = 10,
@@ -2156,6 +2172,7 @@ static const struct ieee80211_ops wl1271_ops = {
        .set_rts_threshold = wl1271_op_set_rts_threshold,
        .conf_tx = wl1271_op_conf_tx,
        .get_tsf = wl1271_op_get_tsf,
+       .get_survey = wl1271_op_get_survey,
        CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
 };
 
index e98f22b3c3ba8d597eb415905d0b78e649fbaff7..019aa79cd9dfc8cdc25c49973c93d5ecf6592d0f 100644 (file)
@@ -55,6 +55,13 @@ static void wl1271_rx_status(struct wl1271 *wl,
 
        status->signal = desc->rssi;
 
+       /*
+        * FIXME: In wl1251, the SNR should be divided by two.  In wl1271 we
+        * need to divide by two for now, but TI has been discussing about
+        * changing it.  This needs to be rechecked.
+        */
+       wl->noise = desc->rssi - (desc->snr >> 1);
+
        status->freq = ieee80211_channel_to_frequency(desc->channel);
 
        if (desc->flags & WL1271_RX_DESC_ENCRYPT_MASK) {