mac80211: Pass new RSSI level in CQM RSSI notification
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>
Wed, 25 Jan 2017 11:43:40 +0000 (12:43 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 8 Feb 2017 09:43:04 +0000 (10:43 +0100)
Extend ieee80211_cqm_rssi_notify with a rssi_level parameter so that
this information can be passed to netlink clients in the next patch, if
available.  Most drivers will have this value at hand.  wl1251 receives
events from the firmware that only tell it whether latest measurement
is above or below threshold so we don't pass any value at this time
(parameter is 0).

Signed-off-by: Andrew Zaborowski <andrew.zaborowski@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/rx.c
drivers/net/wireless/rsi/rsi_91x_mac80211.c
drivers/net/wireless/st/cw1200/sta.c
drivers/net/wireless/ti/wl1251/event.c
drivers/net/wireless/ti/wlcore/event.c
include/net/mac80211.h
net/mac80211/mlme.c
net/mac80211/trace.h

index 0e60e38b2acf058aef19954ae6e9ccacb2ed0f3e..e06a2e323cc89c6a0f7e1034195e4fe449c6a267 100644 (file)
@@ -571,6 +571,7 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
                ieee80211_cqm_rssi_notify(
                        vif,
                        NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
+                       sig,
                        GFP_KERNEL);
        } else if (sig > thold &&
                   (last_event == 0 || sig > last_event + hyst)) {
@@ -580,6 +581,7 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
                ieee80211_cqm_rssi_notify(
                        vif,
                        NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
+                       sig,
                        GFP_KERNEL);
        }
 }
index dadaa73ab49d7f098d4056214252cf627c0cbd51..e3216473aecb7a7e27afb707a66e3b00ddd3164d 100644 (file)
@@ -877,7 +877,7 @@ static void rsi_perform_cqm(struct rsi_common *common,
 
        common->cqm_info.last_cqm_event_rssi = rssi;
        rsi_dbg(INFO_ZONE, "CQM: Notifying event: %d\n", event);
-       ieee80211_cqm_rssi_notify(adapter->vifs[0], event, GFP_KERNEL);
+       ieee80211_cqm_rssi_notify(adapter->vifs[0], event, rssi, GFP_KERNEL);
 
        return;
 }
index daf06a4f842ed2e787e41390ab92d1364569d860..a52224836a2bb65ba03fa5f7c3838c7f60346a7d 100644 (file)
@@ -1019,7 +1019,7 @@ void cw1200_event_handler(struct work_struct *work)
                                NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW :
                                NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH;
                        pr_debug("[CQM] RSSI event: %d.\n", rcpi_rssi);
-                       ieee80211_cqm_rssi_notify(priv->vif, cqm_evt,
+                       ieee80211_cqm_rssi_notify(priv->vif, cqm_evt, rcpi_rssi,
                                                  GFP_KERNEL);
                        break;
                }
index d0593bc1f1a929449ef0dff7956d2c8681be2e35..f5acd24d0e2b142d96ef1e24cdd94a7252d66b52 100644 (file)
@@ -150,7 +150,7 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
                                     "ROAMING_TRIGGER_LOW_RSSI_EVENT");
                        ieee80211_cqm_rssi_notify(wl->vif,
                                NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
-                               GFP_KERNEL);
+                               0, GFP_KERNEL);
                }
 
                if (vector & ROAMING_TRIGGER_REGAINED_RSSI_EVENT_ID) {
@@ -158,7 +158,7 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
                                     "ROAMING_TRIGGER_REGAINED_RSSI_EVENT");
                        ieee80211_cqm_rssi_notify(wl->vif,
                                NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
-                               GFP_KERNEL);
+                               0, GFP_KERNEL);
                }
        }
 
index 4b59f67724dead0621174da68b2e6167506b3b95..f2e90d223d94848ba4c7ee762a5c2d3ec10a99b2 100644 (file)
@@ -129,7 +129,8 @@ void wlcore_event_rssi_trigger(struct wl1271 *wl, s8 *metric_arr)
 
                vif = wl12xx_wlvif_to_vif(wlvif);
                if (event != wlvif->last_rssi_event)
-                       ieee80211_cqm_rssi_notify(vif, event, GFP_KERNEL);
+                       ieee80211_cqm_rssi_notify(vif, event, metric,
+                                                 GFP_KERNEL);
                wlvif->last_rssi_event = event;
        }
 }
index 33624ffbd5a5d815031259848efdca09537cf63e..b9a08cd1d97d8486294197ccd72d3d4538f5e7ca 100644 (file)
@@ -5278,6 +5278,7 @@ void ieee80211_resume_disconnect(struct ieee80211_vif *vif);
  *
  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
  * @rssi_event: the RSSI trigger event type
+ * @rssi_level: new RSSI level value or 0 if not available
  * @gfp: context flags
  *
  * When the %IEEE80211_VIF_SUPPORTS_CQM_RSSI is set, and a connection quality
@@ -5286,6 +5287,7 @@ void ieee80211_resume_disconnect(struct ieee80211_vif *vif);
  */
 void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
                               enum nl80211_cqm_rssi_threshold_event rssi_event,
+                              s32 rssi_level,
                               gfp_t gfp);
 
 /**
index 8a634451867464d8b8494000b11189f152143b8e..ee423688c92e1b41b89f510640db5a12e5c44139 100644 (file)
@@ -3419,14 +3419,14 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
                        ieee80211_cqm_rssi_notify(
                                &sdata->vif,
                                NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
-                               GFP_KERNEL);
+                               sig, GFP_KERNEL);
                } else if (sig > thold &&
                           (last_event == 0 || sig > last_event + hyst)) {
                        ifmgd->last_cqm_event_signal = sig;
                        ieee80211_cqm_rssi_notify(
                                &sdata->vif,
                                NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
-                               GFP_KERNEL);
+                               sig, GFP_KERNEL);
                }
        }
 
@@ -5041,11 +5041,12 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
 
 void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
                               enum nl80211_cqm_rssi_threshold_event rssi_event,
+                              s32 rssi_level,
                               gfp_t gfp)
 {
        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
 
-       trace_api_cqm_rssi_notify(sdata, rssi_event);
+       trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level);
 
        cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp);
 }
index 92a47afaa989e6b63b494eacc23c56409f767642..f78d9f4f87113159800be917d35cdde1f6fb28ed 100644 (file)
@@ -1996,23 +1996,26 @@ TRACE_EVENT(api_connection_loss,
 
 TRACE_EVENT(api_cqm_rssi_notify,
        TP_PROTO(struct ieee80211_sub_if_data *sdata,
-                enum nl80211_cqm_rssi_threshold_event rssi_event),
+                enum nl80211_cqm_rssi_threshold_event rssi_event,
+                s32 rssi_level),
 
-       TP_ARGS(sdata, rssi_event),
+       TP_ARGS(sdata, rssi_event, rssi_level),
 
        TP_STRUCT__entry(
                VIF_ENTRY
                __field(u32, rssi_event)
+               __field(s32, rssi_level)
        ),
 
        TP_fast_assign(
                VIF_ASSIGN;
                __entry->rssi_event = rssi_event;
+               __entry->rssi_level = rssi_level;
        ),
 
        TP_printk(
-               VIF_PR_FMT " event:%d",
-               VIF_PR_ARG, __entry->rssi_event
+               VIF_PR_FMT " event:%d rssi:%d",
+               VIF_PR_ARG, __entry->rssi_event, __entry->rssi_level
        )
 );