--- /dev/null
+From 1fe201c24ae3d5a4a1b21093df183513f03e3c47 Mon Sep 17 00:00:00 2001
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Date: Thu, 12 Jan 2017 08:29:09 +0100
+Subject: [PATCH] Revert "rtlwifi: Fix enter/exit power_save"
+
+This reverts commit 98068574928f499b30f136ff57ef9a03cc575a36, which is
+commit ba9f93f82abafe2552eac942ebb11c2df4f8dd7f upstream as it causes
+problems.
+
+Reported-by: Dmitry Osipenko <digetx@gmail.com>
+Cc: Ping-Ke Shih <pkshih@realtek.com>
+Cc: Larry Finger <Larry.Finger@lwfinger.net>
+Cc: Kalle Valo <kvalo@codeaurora.org>
+Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org
+
+---
+ drivers/net/wireless/realtek/rtlwifi/base.c | 8 +++---
+ drivers/net/wireless/realtek/rtlwifi/core.c | 9 ++++---
+ drivers/net/wireless/realtek/rtlwifi/pci.c | 14 +++++++---
+ drivers/net/wireless/realtek/rtlwifi/ps.c | 36 ++++++----------------------
+ 4 files changed, 27 insertions(+), 40 deletions(-)
+
+--- a/drivers/net/wireless/realtek/rtlwifi/base.c
++++ b/drivers/net/wireless/realtek/rtlwifi/base.c
+@@ -1303,13 +1303,12 @@ EXPORT_SYMBOL_GPL(rtl_action_proc);
+
+ static void setup_arp_tx(struct rtl_priv *rtlpriv, struct rtl_ps_ctl *ppsc)
+ {
+- struct ieee80211_hw *hw = rtlpriv->hw;
+-
+ rtlpriv->ra.is_special_data = true;
+ if (rtlpriv->cfg->ops->get_btc_status())
+ rtlpriv->btcoexist.btc_ops->btc_special_packet_notify(
+ rtlpriv, 1);
+- rtl_lps_leave(hw);
++ rtlpriv->enter_ps = false;
++ schedule_work(&rtlpriv->works.lps_change_work);
+ ppsc->last_delaylps_stamp_jiffies = jiffies;
+ }
+
+@@ -1382,7 +1381,8 @@ u8 rtl_is_special_data(struct ieee80211_
+
+ if (is_tx) {
+ rtlpriv->ra.is_special_data = true;
+- rtl_lps_leave(hw);
++ rtlpriv->enter_ps = false;
++ schedule_work(&rtlpriv->works.lps_change_work);
+ ppsc->last_delaylps_stamp_jiffies = jiffies;
+ }
+
+--- a/drivers/net/wireless/realtek/rtlwifi/core.c
++++ b/drivers/net/wireless/realtek/rtlwifi/core.c
+@@ -1150,8 +1150,10 @@ static void rtl_op_bss_info_changed(stru
+ } else {
+ mstatus = RT_MEDIA_DISCONNECT;
+
+- if (mac->link_state == MAC80211_LINKED)
+- rtl_lps_leave(hw);
++ 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);
+ mac->link_state = MAC80211_NOLINK;
+@@ -1429,7 +1431,8 @@ static void rtl_op_sw_scan_start(struct
+ }
+
+ if (mac->link_state == MAC80211_LINKED) {
+- rtl_lps_leave(hw);
++ rtlpriv->enter_ps = false;
++ schedule_work(&rtlpriv->works.lps_change_work);
+ mac->link_state = MAC80211_LINKED_SCANNING;
+ } else {
+ rtl_ips_nic_on(hw);
+--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
++++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
+@@ -663,9 +663,11 @@ tx_status_ok:
+ }
+
+ if (((rtlpriv->link_info.num_rx_inperiod +
+- rtlpriv->link_info.num_tx_inperiod) > 8) ||
+- (rtlpriv->link_info.num_rx_inperiod > 2))
+- rtl_lps_leave(hw);
++ 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);
++ }
+ }
+
+ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
+@@ -916,8 +918,10 @@ new_trx_end:
+ }
+ if (((rtlpriv->link_info.num_rx_inperiod +
+ rtlpriv->link_info.num_tx_inperiod) > 8) ||
+- (rtlpriv->link_info.num_rx_inperiod > 2))
+- rtl_lps_leave(hw);
++ (rtlpriv->link_info.num_rx_inperiod > 2)) {
++ rtlpriv->enter_ps = false;
++ schedule_work(&rtlpriv->works.lps_change_work);
++ }
+ skb = new_skb;
+ no_new:
+ if (rtlpriv->use_new_trx_flow) {
+--- a/drivers/net/wireless/realtek/rtlwifi/ps.c
++++ b/drivers/net/wireless/realtek/rtlwifi/ps.c
+@@ -407,8 +407,8 @@ void rtl_lps_set_psmode(struct ieee80211
+ }
+ }
+
+-/* Interrupt safe routine to enter the leisure power save mode.*/
+-static void rtl_lps_enter_core(struct ieee80211_hw *hw)
++/*Enter the leisure power save mode.*/
++void rtl_lps_enter(struct ieee80211_hw *hw)
+ {
+ struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
+ struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
+@@ -444,9 +444,10 @@ static void rtl_lps_enter_core(struct ie
+
+ spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
+ }
++EXPORT_SYMBOL(rtl_lps_enter);
+
+-/* Interrupt safe routine to leave the leisure power save mode.*/
+-static void rtl_lps_leave_core(struct ieee80211_hw *hw)
++/*Leave the leisure power save mode.*/
++void rtl_lps_leave(struct ieee80211_hw *hw)
+ {
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
+ struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
+@@ -476,6 +477,7 @@ static void rtl_lps_leave_core(struct ie
+ }
+ spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
+ }
++EXPORT_SYMBOL(rtl_lps_leave);
+
+ /* For sw LPS*/
+ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
+@@ -668,34 +670,12 @@ void rtl_lps_change_work_callback(struct
+ struct rtl_priv *rtlpriv = rtl_priv(hw);
+
+ if (rtlpriv->enter_ps)
+- rtl_lps_enter_core(hw);
++ rtl_lps_enter(hw);
+ else
+- rtl_lps_leave_core(hw);
++ rtl_lps_leave(hw);
+ }
+ EXPORT_SYMBOL_GPL(rtl_lps_change_work_callback);
+
+-void rtl_lps_enter(struct ieee80211_hw *hw)
+-{
+- struct rtl_priv *rtlpriv = rtl_priv(hw);
+-
+- if (!in_interrupt())
+- return rtl_lps_enter_core(hw);
+- rtlpriv->enter_ps = true;
+- schedule_work(&rtlpriv->works.lps_change_work);
+-}
+-EXPORT_SYMBOL_GPL(rtl_lps_enter);
+-
+-void rtl_lps_leave(struct ieee80211_hw *hw)
+-{
+- struct rtl_priv *rtlpriv = rtl_priv(hw);
+-
+- if (!in_interrupt())
+- return rtl_lps_leave_core(hw);
+- rtlpriv->enter_ps = false;
+- schedule_work(&rtlpriv->works.lps_change_work);
+-}
+-EXPORT_SYMBOL_GPL(rtl_lps_leave);
+-
+ void rtl_swlps_wq_callback(void *data)
+ {
+ struct rtl_works *rtlworks = container_of_dwork_rtl(data,