aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-12 02:29:09 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-12 05:39:45 -0500
commitec3d5c521af86e53690c8850def2d2f6a35e7756 (patch)
tree3c5e1e80a0292ecedc318244e15876fd63c3282e /drivers/net/wireless
parentcf365b117388a50902d56988e69dd6f70b7662fc (diff)
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
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/base.c8
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/core.c9
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/pci.c14
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/ps.c36
4 files changed, 27 insertions, 40 deletions
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 4ac928bf1f8e..264466f59c57 100644
--- 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);
1303 1303
1304static void setup_arp_tx(struct rtl_priv *rtlpriv, struct rtl_ps_ctl *ppsc) 1304static void setup_arp_tx(struct rtl_priv *rtlpriv, struct rtl_ps_ctl *ppsc)
1305{ 1305{
1306 struct ieee80211_hw *hw = rtlpriv->hw;
1307
1308 rtlpriv->ra.is_special_data = true; 1306 rtlpriv->ra.is_special_data = true;
1309 if (rtlpriv->cfg->ops->get_btc_status()) 1307 if (rtlpriv->cfg->ops->get_btc_status())
1310 rtlpriv->btcoexist.btc_ops->btc_special_packet_notify( 1308 rtlpriv->btcoexist.btc_ops->btc_special_packet_notify(
1311 rtlpriv, 1); 1309 rtlpriv, 1);
1312 rtl_lps_leave(hw); 1310 rtlpriv->enter_ps = false;
1311 schedule_work(&rtlpriv->works.lps_change_work);
1313 ppsc->last_delaylps_stamp_jiffies = jiffies; 1312 ppsc->last_delaylps_stamp_jiffies = jiffies;
1314} 1313}
1315 1314
@@ -1382,7 +1381,8 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
1382 1381
1383 if (is_tx) { 1382 if (is_tx) {
1384 rtlpriv->ra.is_special_data = true; 1383 rtlpriv->ra.is_special_data = true;
1385 rtl_lps_leave(hw); 1384 rtlpriv->enter_ps = false;
1385 schedule_work(&rtlpriv->works.lps_change_work);
1386 ppsc->last_delaylps_stamp_jiffies = jiffies; 1386 ppsc->last_delaylps_stamp_jiffies = jiffies;
1387 } 1387 }
1388 1388
diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c
index 4da4e458142c..8e7f23c11680 100644
--- 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(struct ieee80211_hw *hw,
1150 } else { 1150 } else {
1151 mstatus = RT_MEDIA_DISCONNECT; 1151 mstatus = RT_MEDIA_DISCONNECT;
1152 1152
1153 if (mac->link_state == MAC80211_LINKED) 1153 if (mac->link_state == MAC80211_LINKED) {
1154 rtl_lps_leave(hw); 1154 rtlpriv->enter_ps = false;
1155 schedule_work(&rtlpriv->works.lps_change_work);
1156 }
1155 if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE) 1157 if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE)
1156 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE); 1158 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
1157 mac->link_state = MAC80211_NOLINK; 1159 mac->link_state = MAC80211_NOLINK;
@@ -1429,7 +1431,8 @@ static void rtl_op_sw_scan_start(struct ieee80211_hw *hw,
1429 } 1431 }
1430 1432
1431 if (mac->link_state == MAC80211_LINKED) { 1433 if (mac->link_state == MAC80211_LINKED) {
1432 rtl_lps_leave(hw); 1434 rtlpriv->enter_ps = false;
1435 schedule_work(&rtlpriv->works.lps_change_work);
1433 mac->link_state = MAC80211_LINKED_SCANNING; 1436 mac->link_state = MAC80211_LINKED_SCANNING;
1434 } else { 1437 } else {
1435 rtl_ips_nic_on(hw); 1438 rtl_ips_nic_on(hw);
diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c
index 5be4fc96002d..0dfa9eac3926 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
@@ -663,9 +663,11 @@ tx_status_ok:
663 } 663 }
664 664
665 if (((rtlpriv->link_info.num_rx_inperiod + 665 if (((rtlpriv->link_info.num_rx_inperiod +
666 rtlpriv->link_info.num_tx_inperiod) > 8) || 666 rtlpriv->link_info.num_tx_inperiod) > 8) ||
667 (rtlpriv->link_info.num_rx_inperiod > 2)) 667 (rtlpriv->link_info.num_rx_inperiod > 2)) {
668 rtl_lps_leave(hw); 668 rtlpriv->enter_ps = false;
669 schedule_work(&rtlpriv->works.lps_change_work);
670 }
669} 671}
670 672
671static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw, 673static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
@@ -916,8 +918,10 @@ new_trx_end:
916 } 918 }
917 if (((rtlpriv->link_info.num_rx_inperiod + 919 if (((rtlpriv->link_info.num_rx_inperiod +
918 rtlpriv->link_info.num_tx_inperiod) > 8) || 920 rtlpriv->link_info.num_tx_inperiod) > 8) ||
919 (rtlpriv->link_info.num_rx_inperiod > 2)) 921 (rtlpriv->link_info.num_rx_inperiod > 2)) {
920 rtl_lps_leave(hw); 922 rtlpriv->enter_ps = false;
923 schedule_work(&rtlpriv->works.lps_change_work);
924 }
921 skb = new_skb; 925 skb = new_skb;
922no_new: 926no_new:
923 if (rtlpriv->use_new_trx_flow) { 927 if (rtlpriv->use_new_trx_flow) {
diff --git a/drivers/net/wireless/realtek/rtlwifi/ps.c b/drivers/net/wireless/realtek/rtlwifi/ps.c
index d0ffc4d508cf..18d979affc18 100644
--- 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_hw *hw, u8 rt_psmode)
407 } 407 }
408} 408}
409 409
410/* Interrupt safe routine to enter the leisure power save mode.*/ 410/*Enter the leisure power save mode.*/
411static void rtl_lps_enter_core(struct ieee80211_hw *hw) 411void rtl_lps_enter(struct ieee80211_hw *hw)
412{ 412{
413 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 413 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
414 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 414 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
@@ -444,9 +444,10 @@ static void rtl_lps_enter_core(struct ieee80211_hw *hw)
444 444
445 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); 445 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
446} 446}
447EXPORT_SYMBOL(rtl_lps_enter);
447 448
448/* Interrupt safe routine to leave the leisure power save mode.*/ 449/*Leave the leisure power save mode.*/
449static void rtl_lps_leave_core(struct ieee80211_hw *hw) 450void rtl_lps_leave(struct ieee80211_hw *hw)
450{ 451{
451 struct rtl_priv *rtlpriv = rtl_priv(hw); 452 struct rtl_priv *rtlpriv = rtl_priv(hw);
452 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 453 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
@@ -476,6 +477,7 @@ static void rtl_lps_leave_core(struct ieee80211_hw *hw)
476 } 477 }
477 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); 478 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
478} 479}
480EXPORT_SYMBOL(rtl_lps_leave);
479 481
480/* For sw LPS*/ 482/* For sw LPS*/
481void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len) 483void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
@@ -668,34 +670,12 @@ void rtl_lps_change_work_callback(struct work_struct *work)
668 struct rtl_priv *rtlpriv = rtl_priv(hw); 670 struct rtl_priv *rtlpriv = rtl_priv(hw);
669 671
670 if (rtlpriv->enter_ps) 672 if (rtlpriv->enter_ps)
671 rtl_lps_enter_core(hw); 673 rtl_lps_enter(hw);
672 else 674 else
673 rtl_lps_leave_core(hw); 675 rtl_lps_leave(hw);
674} 676}
675EXPORT_SYMBOL_GPL(rtl_lps_change_work_callback); 677EXPORT_SYMBOL_GPL(rtl_lps_change_work_callback);
676 678
677void rtl_lps_enter(struct ieee80211_hw *hw)
678{
679 struct rtl_priv *rtlpriv = rtl_priv(hw);
680
681 if (!in_interrupt())
682 return rtl_lps_enter_core(hw);
683 rtlpriv->enter_ps = true;
684 schedule_work(&rtlpriv->works.lps_change_work);
685}
686EXPORT_SYMBOL_GPL(rtl_lps_enter);
687
688void rtl_lps_leave(struct ieee80211_hw *hw)
689{
690 struct rtl_priv *rtlpriv = rtl_priv(hw);
691
692 if (!in_interrupt())
693 return rtl_lps_leave_core(hw);
694 rtlpriv->enter_ps = false;
695 schedule_work(&rtlpriv->works.lps_change_work);
696}
697EXPORT_SYMBOL_GPL(rtl_lps_leave);
698
699void rtl_swlps_wq_callback(void *data) 679void rtl_swlps_wq_callback(void *data)
700{ 680{
701 struct rtl_works *rtlworks = container_of_dwork_rtl(data, 681 struct rtl_works *rtlworks = container_of_dwork_rtl(data,