if (local->hw.conf.flags & IEEE80211_CONF_PS)
                return;
 
-       /*
-        * transmission can be stopped by others which leads to
-        * dynamic_ps_timer expiry. Postpond the ps timer if it
-        * is not the actual idle state.
-        */
-       spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
-       for (q = 0; q < local->hw.queues; q++) {
-               if (local->queue_stop_reasons[q]) {
-                       spin_unlock_irqrestore(&local->queue_stop_reason_lock,
-                                              flags);
+       if (!local->disable_dynamic_ps &&
+           local->hw.conf.dynamic_ps_timeout > 0) {
+               /* don't enter PS if TX frames are pending */
+               if (drv_tx_frames_pending(local)) {
                        mod_timer(&local->dynamic_ps_timer, jiffies +
                                  msecs_to_jiffies(
                                  local->hw.conf.dynamic_ps_timeout));
                        return;
                }
+
+               /*
+                * transmission can be stopped by others which leads to
+                * dynamic_ps_timer expiry. Postpone the ps timer if it
+                * is not the actual idle state.
+                */
+               spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
+               for (q = 0; q < local->hw.queues; q++) {
+                       if (local->queue_stop_reasons[q]) {
+                               spin_unlock_irqrestore(&local->queue_stop_reason_lock,
+                                                      flags);
+                               mod_timer(&local->dynamic_ps_timer, jiffies +
+                                         msecs_to_jiffies(
+                                         local->hw.conf.dynamic_ps_timeout));
+                               return;
+                       }
+               }
+               spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
        }
-       spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 
        if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
            (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) {
                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
        }
 
-       netif_tx_wake_all_queues(sdata->dev);
+       if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
+               netif_tx_wake_all_queues(sdata->dev);
 }
 
 void ieee80211_dynamic_ps_timer(unsigned long data)