|
@@ -20,7 +20,6 @@
|
|
|
#include <linux/etherdevice.h>
|
|
|
#include <linux/moduleparam.h>
|
|
|
#include <linux/rtnetlink.h>
|
|
|
-#include <linux/pm_qos.h>
|
|
|
#include <linux/crc32.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/export.h>
|
|
@@ -1476,7 +1475,7 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
|
|
|
}
|
|
|
|
|
|
/* need to hold RTNL or interface lock */
|
|
|
-void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
|
|
|
+void ieee80211_recalc_ps(struct ieee80211_local *local)
|
|
|
{
|
|
|
struct ieee80211_sub_if_data *sdata, *found = NULL;
|
|
|
int count = 0;
|
|
@@ -1505,48 +1504,23 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
|
|
|
}
|
|
|
|
|
|
if (count == 1 && ieee80211_powersave_allowed(found)) {
|
|
|
+ u8 dtimper = found->u.mgd.dtim_period;
|
|
|
s32 beaconint_us;
|
|
|
|
|
|
- if (latency < 0)
|
|
|
- latency = pm_qos_request(PM_QOS_NETWORK_LATENCY);
|
|
|
-
|
|
|
beaconint_us = ieee80211_tu_to_usec(
|
|
|
found->vif.bss_conf.beacon_int);
|
|
|
|
|
|
timeout = local->dynamic_ps_forced_timeout;
|
|
|
- if (timeout < 0) {
|
|
|
- /*
|
|
|
- * Go to full PSM if the user configures a very low
|
|
|
- * latency requirement.
|
|
|
- * The 2000 second value is there for compatibility
|
|
|
- * until the PM_QOS_NETWORK_LATENCY is configured
|
|
|
- * with real values.
|
|
|
- */
|
|
|
- if (latency > (1900 * USEC_PER_MSEC) &&
|
|
|
- latency != (2000 * USEC_PER_SEC))
|
|
|
- timeout = 0;
|
|
|
- else
|
|
|
- timeout = 100;
|
|
|
- }
|
|
|
+ if (timeout < 0)
|
|
|
+ timeout = 100;
|
|
|
local->hw.conf.dynamic_ps_timeout = timeout;
|
|
|
|
|
|
- if (beaconint_us > latency) {
|
|
|
- local->ps_sdata = NULL;
|
|
|
- } else {
|
|
|
- int maxslp = 1;
|
|
|
- u8 dtimper = found->u.mgd.dtim_period;
|
|
|
-
|
|
|
- /* If the TIM IE is invalid, pretend the value is 1 */
|
|
|
- if (!dtimper)
|
|
|
- dtimper = 1;
|
|
|
- else if (dtimper > 1)
|
|
|
- maxslp = min_t(int, dtimper,
|
|
|
- latency / beaconint_us);
|
|
|
-
|
|
|
- local->hw.conf.max_sleep_period = maxslp;
|
|
|
- local->hw.conf.ps_dtim_period = dtimper;
|
|
|
- local->ps_sdata = found;
|
|
|
- }
|
|
|
+ /* If the TIM IE is invalid, pretend the value is 1 */
|
|
|
+ if (!dtimper)
|
|
|
+ dtimper = 1;
|
|
|
+
|
|
|
+ local->hw.conf.ps_dtim_period = dtimper;
|
|
|
+ local->ps_sdata = found;
|
|
|
} else {
|
|
|
local->ps_sdata = NULL;
|
|
|
}
|
|
@@ -1997,7 +1971,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
|
|
ieee80211_bss_info_change_notify(sdata, bss_info_changed);
|
|
|
|
|
|
mutex_lock(&local->iflist_mtx);
|
|
|
- ieee80211_recalc_ps(local, -1);
|
|
|
+ ieee80211_recalc_ps(local);
|
|
|
mutex_unlock(&local->iflist_mtx);
|
|
|
|
|
|
ieee80211_recalc_smps(sdata);
|
|
@@ -2165,7 +2139,7 @@ static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
|
|
|
__ieee80211_stop_poll(sdata);
|
|
|
|
|
|
mutex_lock(&local->iflist_mtx);
|
|
|
- ieee80211_recalc_ps(local, -1);
|
|
|
+ ieee80211_recalc_ps(local);
|
|
|
mutex_unlock(&local->iflist_mtx);
|
|
|
|
|
|
if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
|
|
@@ -2341,7 +2315,7 @@ static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
|
|
|
goto out;
|
|
|
|
|
|
mutex_lock(&sdata->local->iflist_mtx);
|
|
|
- ieee80211_recalc_ps(sdata->local, -1);
|
|
|
+ ieee80211_recalc_ps(sdata->local);
|
|
|
mutex_unlock(&sdata->local->iflist_mtx);
|
|
|
|
|
|
ifmgd->probe_send_count = 0;
|
|
@@ -3548,7 +3522,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
|
|
ifmgd->have_beacon = true;
|
|
|
|
|
|
mutex_lock(&local->iflist_mtx);
|
|
|
- ieee80211_recalc_ps(local, -1);
|
|
|
+ ieee80211_recalc_ps(local);
|
|
|
mutex_unlock(&local->iflist_mtx);
|
|
|
|
|
|
ieee80211_recalc_ps_vif(sdata);
|
|
@@ -4152,21 +4126,6 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local)
|
|
|
rcu_read_unlock();
|
|
|
}
|
|
|
|
|
|
-int ieee80211_max_network_latency(struct notifier_block *nb,
|
|
|
- unsigned long data, void *dummy)
|
|
|
-{
|
|
|
- s32 latency_usec = (s32) data;
|
|
|
- struct ieee80211_local *local =
|
|
|
- container_of(nb, struct ieee80211_local,
|
|
|
- network_latency_notifier);
|
|
|
-
|
|
|
- mutex_lock(&local->iflist_mtx);
|
|
|
- ieee80211_recalc_ps(local, latency_usec);
|
|
|
- mutex_unlock(&local->iflist_mtx);
|
|
|
-
|
|
|
- return NOTIFY_OK;
|
|
|
-}
|
|
|
-
|
|
|
static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata,
|
|
|
struct cfg80211_bss *cbss)
|
|
|
{
|