@@ -1384,6 +1384,26 @@ static int ieee80211_skb_resize(struct ieee80211_local *local,
return 0;
}
+static bool is_dynamic_ps_enabled(struct ieee80211_local *local)
+{
+ if (!(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK))
+ /* driver doesn't support power save */
+ return false;
+
+ if (local->hw.conf.dynamic_ps_timeout <= 0)
+ /* dynamic power save disabled */
+ return false;
+
+ if (local->scanning)
+ /* we are scanning, don't enable power save */
+ return false;
+
+ if (!local->ps_sdata)
+ return false;
+
+ return true;
+}
+
static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb)
{
@@ -1396,9 +1416,7 @@ static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
dev_hold(sdata->dev);
- if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
- local->hw.conf.dynamic_ps_timeout > 0 &&
- !(local->scanning) && local->ps_sdata) {
+ if (is_dynamic_ps_enabled(local)) {
if (local->hw.conf.flags & IEEE80211_CONF_PS) {
ieee80211_stop_queues_by_reason(&local->hw,
IEEE80211_QUEUE_STOP_REASON_PS);