is_tx ? "Tx" : "Rx");
 
                                if (is_tx) {
+                                       rtlpriv->enter_ps = false;
                                        schedule_work(&rtlpriv->
-                                                     works.lps_leave_work);
+                                                     works.lps_change_work);
                                        ppsc->last_delaylps_stamp_jiffies =
                                            jiffies;
                                }
                }
        } else if (ETH_P_ARP == ether_type) {
                if (is_tx) {
-                       schedule_work(&rtlpriv->works.lps_leave_work);
+                       rtlpriv->enter_ps = false;
+                       schedule_work(&rtlpriv->works.lps_change_work);
                        ppsc->last_delaylps_stamp_jiffies = jiffies;
                }
 
                         "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
 
                if (is_tx) {
-                       schedule_work(&rtlpriv->works.lps_leave_work);
+                       rtlpriv->enter_ps = false;
+                       schedule_work(&rtlpriv->works.lps_change_work);
                        ppsc->last_delaylps_stamp_jiffies = jiffies;
                }
 
        u32 aver_tx_cnt_inperiod = 0;
        u32 aver_tidtx_inperiod[MAX_TID_COUNT] = {0};
        u32 tidtx_inp4eriod[MAX_TID_COUNT] = {0};
-       bool enter_ps = false;
 
        if (is_hal_stop(rtlhal))
                return;
                if (((rtlpriv->link_info.num_rx_inperiod +
                      rtlpriv->link_info.num_tx_inperiod) > 8) ||
                    (rtlpriv->link_info.num_rx_inperiod > 2))
-                       enter_ps = false;
+                       rtlpriv->enter_ps = true;
                else
-                       enter_ps = true;
+                       rtlpriv->enter_ps = false;
 
                /* LeisurePS only work in infra mode. */
-               if (enter_ps)
-                       rtl_lps_enter(hw);
-               else
-                       schedule_work(&rtlpriv->works.lps_leave_work);
+               schedule_work(&rtlpriv->works.lps_change_work);
        }
 
        rtlpriv->link_info.num_rx_inperiod = 0;
 
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
                                 "BSS_CHANGED_ASSOC\n");
                } else {
-                       if (mac->link_state == MAC80211_LINKED)
-                               schedule_work(&rtlpriv->works.lps_leave_work);
+                       if (mac->link_state == MAC80211_LINKED) {
+                               rtlpriv->enter_ps = false;
+                               schedule_work(&rtlpriv->works.lps_change_work);
+                       }
 
                        if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE)
                                rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
                        rtlpriv->cfg->ops->chk_switch_dmdp(hw);
        }
        if (mac->link_state == MAC80211_LINKED) {
-               schedule_work(&rtlpriv->works.lps_leave_work);
+               rtlpriv->enter_ps = false;
+               schedule_work(&rtlpriv->works.lps_change_work);
                mac->link_state = MAC80211_LINKED_SCANNING;
        } else {
                rtl_ips_nic_on(hw);
 
        if (((rtlpriv->link_info.num_rx_inperiod +
                rtlpriv->link_info.num_tx_inperiod) > 8) ||
                (rtlpriv->link_info.num_rx_inperiod > 2)) {
-               schedule_work(&rtlpriv->works.lps_leave_work);
+               rtlpriv->enter_ps = false;
+               schedule_work(&rtlpriv->works.lps_change_work);
        }
 }
 
                _rtl_receive_one(hw, skb, rx_status);
 
                if (((rtlpriv->link_info.num_rx_inperiod +
-                       rtlpriv->link_info.num_tx_inperiod) > 8) ||
-                       (rtlpriv->link_info.num_rx_inperiod > 2)) {
-                       schedule_work(&rtlpriv->works.lps_leave_work);
+                     rtlpriv->link_info.num_tx_inperiod) > 8) ||
+                     (rtlpriv->link_info.num_rx_inperiod > 2)) {
+                       rtlpriv->enter_ps = false;
+                       schedule_work(&rtlpriv->works.lps_change_work);
                }
 
                dev_kfree_skb_any(skb);
        return;
 }
 
-static void rtl_lps_leave_work_callback(struct work_struct *work)
+static void rtl_lps_change_work_callback(struct work_struct *work)
 {
        struct rtl_works *rtlworks =
-           container_of(work, struct rtl_works, lps_leave_work);
+           container_of(work, struct rtl_works, lps_change_work);
        struct ieee80211_hw *hw = rtlworks->hw;
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
 
-       rtl_lps_leave(hw);
+       if (rtlpriv->enter_ps)
+               rtl_lps_enter(hw);
+       else
+               rtl_lps_leave(hw);
 }
 
 static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
        tasklet_init(&rtlpriv->works.irq_prepare_bcn_tasklet,
                     (void (*)(unsigned long))_rtl_pci_prepare_bcn_tasklet,
                     (unsigned long)hw);
-       INIT_WORK(&rtlpriv->works.lps_leave_work, rtl_lps_leave_work_callback);
+       INIT_WORK(&rtlpriv->works.lps_change_work,
+                 rtl_lps_change_work_callback);
 }
 
 static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,
 
        synchronize_irq(rtlpci->pdev->irq);
        tasklet_kill(&rtlpriv->works.irq_tasklet);
-       cancel_work_sync(&rtlpriv->works.lps_leave_work);
+       cancel_work_sync(&rtlpriv->works.lps_change_work);
 
        flush_workqueue(rtlpriv->works.rtl_wq);
        destroy_workqueue(rtlpriv->works.rtl_wq);
        set_hal_stop(rtlhal);
 
        rtlpriv->cfg->ops->disable_interrupt(hw);
-       cancel_work_sync(&rtlpriv->works.lps_leave_work);
+       cancel_work_sync(&rtlpriv->works.lps_change_work);
 
        spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flags);
        while (ppsc->rfchange_inprogress) {