]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2017 07:30:57 +0000 (08:30 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2017 07:30:57 +0000 (08:30 +0100)
added patches:
revert-rtlwifi-fix-enter-exit-power_save.patch

queue-4.9/revert-rtlwifi-fix-enter-exit-power_save.patch [new file with mode: 0644]
queue-4.9/series

diff --git a/queue-4.9/revert-rtlwifi-fix-enter-exit-power_save.patch b/queue-4.9/revert-rtlwifi-fix-enter-exit-power_save.patch
new file mode 100644 (file)
index 0000000..a73a465
--- /dev/null
@@ -0,0 +1,176 @@
+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,
index c30f6b0aef7b9e74578b53a26d6630a2a899d3cc..4c197597bd62b0d19d645e40948ae333f6fa7f93 100644 (file)
@@ -204,3 +204,4 @@ xfs-fix-crash-and-data-corruption-due-to-removal-of-busy-cow-extents.patch
 xfs-fix-max_retries-_show-and-_store-functions.patch
 clocksource-dummy_timer-move-hotplug-callback-after-the-real-timers.patch
 tick-broadcast-prevent-null-pointer-dereference.patch
+revert-rtlwifi-fix-enter-exit-power_save.patch