From: Greg Kroah-Hartman Date: Thu, 12 Jan 2017 07:30:57 +0000 (+0100) Subject: 4.9-stable patches X-Git-Tag: v4.4.42~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=90fc8ab4bf7eda9e2883848b577aca0e3bdc3482;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: revert-rtlwifi-fix-enter-exit-power_save.patch --- 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 index 00000000000..a73a4657e77 --- /dev/null +++ b/queue-4.9/revert-rtlwifi-fix-enter-exit-power_save.patch @@ -0,0 +1,176 @@ +From 1fe201c24ae3d5a4a1b21093df183513f03e3c47 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman +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 +Cc: Ping-Ke Shih +Cc: Larry Finger +Cc: Kalle Valo +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, diff --git a/queue-4.9/series b/queue-4.9/series index c30f6b0aef7..4c197597bd6 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -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