f2fs: add tracepoints to debug checkpoint request
[platform/adaptation/renesas_rcar/renesas_kernel.git] / net / mac80211 / scan.c
index bf82e69..43a45cf 100644 (file)
 
 #define IEEE80211_PROBE_DELAY (HZ / 33)
 #define IEEE80211_CHANNEL_TIME (HZ / 33)
-#define IEEE80211_PASSIVE_CHANNEL_TIME (HZ / 8)
-
-static void ieee80211_rx_bss_free(struct cfg80211_bss *cbss)
-{
-       struct ieee80211_bss *bss = (void *)cbss->priv;
-
-       kfree(bss_mesh_id(bss));
-       kfree(bss_mesh_cfg(bss));
-}
+#define IEEE80211_PASSIVE_CHANNEL_TIME (HZ / 9)
 
 void ieee80211_rx_bss_put(struct ieee80211_local *local,
                          struct ieee80211_bss *bss)
 {
        if (!bss)
                return;
-       cfg80211_put_bss(container_of((void *)bss, struct cfg80211_bss, priv));
+       cfg80211_put_bss(local->hw.wiphy,
+                        container_of((void *)bss, struct cfg80211_bss, priv));
 }
 
 static bool is_uapsd_supported(struct ieee802_11_elems *elems)
@@ -65,12 +58,11 @@ static bool is_uapsd_supported(struct ieee802_11_elems *elems)
 struct ieee80211_bss *
 ieee80211_bss_info_update(struct ieee80211_local *local,
                          struct ieee80211_rx_status *rx_status,
-                         struct ieee80211_mgmt *mgmt,
-                         size_t len,
+                         struct ieee80211_mgmt *mgmt, size_t len,
                          struct ieee802_11_elems *elems,
-                         struct ieee80211_channel *channel,
-                         bool beacon)
+                         struct ieee80211_channel *channel)
 {
+       bool beacon = ieee80211_is_beacon(mgmt->frame_control);
        struct cfg80211_bss *cbss;
        struct ieee80211_bss *bss;
        int clen, srlen;
@@ -86,10 +78,12 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
        if (!cbss)
                return NULL;
 
-       cbss->free_priv = ieee80211_rx_bss_free;
        bss = (void *)cbss->priv;
 
-       bss->device_ts = rx_status->device_timestamp;
+       if (beacon)
+               bss->device_ts_beacon = rx_status->device_timestamp;
+       else
+               bss->device_ts_presp = rx_status->device_timestamp;
 
        if (elems->parse_error) {
                if (beacon)
@@ -147,9 +141,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
                        bss->valid_data |= IEEE80211_BSS_VALID_WMM;
        }
 
-       if (!beacon)
-               bss->last_probe_resp = jiffies;
-
        return bss;
 }
 
@@ -203,7 +194,7 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
 
        bss = ieee80211_bss_info_update(local, rx_status,
                                        mgmt, skb->len, &elems,
-                                       channel, beacon);
+                                       channel);
        if (bss)
                ieee80211_rx_bss_put(local, bss);
 }
@@ -343,6 +334,9 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
 
        ieee80211_offchannel_stop_vifs(local);
 
+       /* ensure nullfunc is transmitted before leaving operating channel */
+       drv_flush(local, false);
+
        ieee80211_configure_filter(local);
 
        /* We need to set power level at maximum rate for scanning. */
@@ -357,6 +351,9 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
 static bool ieee80211_can_scan(struct ieee80211_local *local,
                               struct ieee80211_sub_if_data *sdata)
 {
+       if (local->radar_detect_enabled)
+               return false;
+
        if (!list_empty(&local->roc_list))
                return false;
 
@@ -391,6 +388,11 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
        int i;
        struct ieee80211_sub_if_data *sdata;
        enum ieee80211_band band = local->hw.conf.channel->band;
+       u32 tx_flags;
+
+       tx_flags = IEEE80211_TX_INTFL_OFFCHAN_TX_OK;
+       if (local->scan_req->no_cck)
+               tx_flags |= IEEE80211_TX_CTL_NO_CCK_RATE;
 
        sdata = rcu_dereference_protected(local->scan_sdata,
                                          lockdep_is_held(&local->mtx));
@@ -402,8 +404,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
                        local->scan_req->ssids[i].ssid_len,
                        local->scan_req->ie, local->scan_req->ie_len,
                        local->scan_req->rates[band], false,
-                       local->scan_req->no_cck,
-                       local->hw.conf.channel, true);
+                       tx_flags, local->hw.conf.channel, true);
 
        /*
         * After sending probe requests, wait for probe responses
@@ -547,8 +548,6 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
        bool associated = false;
        bool tx_empty = true;
        bool bad_latency;
-       bool listen_int_exceeded;
-       unsigned long min_beacon_int = 0;
        struct ieee80211_sub_if_data *sdata;
        struct ieee80211_channel *next_chan;
        enum mac80211_scan_state next_scan_state;
@@ -567,11 +566,6 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
                        if (sdata->u.mgd.associated) {
                                associated = true;
 
-                               if (sdata->vif.bss_conf.beacon_int <
-                                   min_beacon_int || min_beacon_int == 0)
-                                       min_beacon_int =
-                                               sdata->vif.bss_conf.beacon_int;
-
                                if (!qdisc_all_tx_empty(sdata->dev)) {
                                        tx_empty = false;
                                        break;
@@ -588,34 +582,19 @@ static void ieee80211_scan_state_decision(struct ieee80211_local *local,
         * see if we can scan another channel without interfering
         * with the current traffic situation.
         *
-        * Since we don't know if the AP has pending frames for us
-        * we can only check for our tx queues and use the current
-        * pm_qos requirements for rx. Hence, if no tx traffic occurs
-        * at all we will scan as many channels in a row as the pm_qos
-        * latency allows us to. Additionally we also check for the
-        * currently negotiated listen interval to prevent losing
-        * frames unnecessarily.
-        *
-        * Otherwise switch back to the operating channel.
+        * Keep good latency, do not stay off-channel more than 125 ms.
         */
 
        bad_latency = time_after(jiffies +
-                       ieee80211_scan_get_channel_time(next_chan),
-                       local->leave_oper_channel_time +
-                       usecs_to_jiffies(pm_qos_request(PM_QOS_NETWORK_LATENCY)));
-
-       listen_int_exceeded = time_after(jiffies +
-                       ieee80211_scan_get_channel_time(next_chan),
-                       local->leave_oper_channel_time +
-                       usecs_to_jiffies(min_beacon_int * 1024) *
-                       local->hw.conf.listen_interval);
+                                ieee80211_scan_get_channel_time(next_chan),
+                                local->leave_oper_channel_time + HZ / 8);
 
        if (associated && !tx_empty) {
                if (local->scan_req->flags & NL80211_SCAN_FLAG_LOW_PRIORITY)
                        next_scan_state = SCAN_ABORT;
                else
                        next_scan_state = SCAN_SUSPEND;
-       } else if (associated && (bad_latency || listen_int_exceeded)) {
+       } else if (associated && bad_latency) {
                next_scan_state = SCAN_SUSPEND;
        } else {
                next_scan_state = SCAN_SET_CHANNEL;