* @set_ringparam: Set tx and rx ring sizes.
  *
  * @get_ringparam: Get tx and rx ring current and maximum sizes.
+ *
+ * @tx_frames_pending: Check if there is any pending frame in the hardware
+ *     queues before entering power save.
  */
 struct ieee80211_ops {
        void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
        int (*set_ringparam)(struct ieee80211_hw *hw, u32 tx, u32 rx);
        void (*get_ringparam)(struct ieee80211_hw *hw,
                              u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
+       bool (*tx_frames_pending)(struct ieee80211_hw *hw);
 };
 
 /**
 
        trace_drv_return_void(local);
 }
 
+static inline bool drv_tx_frames_pending(struct ieee80211_local *local)
+{
+       bool ret = false;
+
+       might_sleep();
+
+       trace_drv_tx_frames_pending(local);
+       if (local->ops->tx_frames_pending)
+               ret = local->ops->tx_frames_pending(&local->hw);
+       trace_drv_return_bool(local, ret);
+
+       return ret;
+}
 #endif /* __MAC80211_DRIVER_OPS */
 
        TP_printk(LOCAL_PR_FMT " - %d", LOCAL_PR_ARG, __entry->ret)
 );
 
+TRACE_EVENT(drv_return_bool,
+       TP_PROTO(struct ieee80211_local *local, bool ret),
+       TP_ARGS(local, ret),
+       TP_STRUCT__entry(
+               LOCAL_ENTRY
+               __field(bool, ret)
+       ),
+       TP_fast_assign(
+               LOCAL_ASSIGN;
+               __entry->ret = ret;
+       ),
+       TP_printk(LOCAL_PR_FMT " - %s", LOCAL_PR_ARG, (__entry->ret) ?
+                 "true" : "false")
+);
+
 TRACE_EVENT(drv_return_u64,
        TP_PROTO(struct ieee80211_local *local, u64 ret),
        TP_ARGS(local, ret),
        )
 );
 
+DEFINE_EVENT(local_only_evt, drv_tx_frames_pending,
+       TP_PROTO(struct ieee80211_local *local),
+       TP_ARGS(local)
+);
+
 DEFINE_EVENT(local_only_evt, drv_offchannel_tx_cancel_wait,
        TP_PROTO(struct ieee80211_local *local),
        TP_ARGS(local)
 
        if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
            (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) {
                netif_tx_stop_all_queues(sdata->dev);
-               /*
-                * Flush all the frames queued in the driver before
-                * going to power save
-                */
-               drv_flush(local, false);
-               ieee80211_send_nullfunc(local, sdata, 1);
 
-               /* Flush once again to get the tx status of nullfunc frame */
-               drv_flush(local, false);
+               if (drv_tx_frames_pending(local))
+                       mod_timer(&local->dynamic_ps_timer, jiffies +
+                                 msecs_to_jiffies(
+                                 local->hw.conf.dynamic_ps_timeout));
+               else {
+                       ieee80211_send_nullfunc(local, sdata, 1);
+                       /* Flush to get the tx status of nullfunc frame */
+                       drv_flush(local, false);
+               }
        }
 
        if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) &&