aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/realtek/rtlwifi/base.c
diff options
context:
space:
mode:
authorPing-Ke Shih <pkshih@realtek.com>2018-01-17 01:15:21 -0500
committerKalle Valo <kvalo@codeaurora.org>2018-01-17 10:09:10 -0500
commita3fa3669d18c959c265eda2048b998c0062a61ce (patch)
tree50aac2c73bb59847acc8bc536ce567b6218905a8 /drivers/net/wireless/realtek/rtlwifi/base.c
parent98051872fd25077d3b106ab3d2b945fa7025c1ef (diff)
rtlwifi: Use mutex to replace spin_lock to protect IPS and LPS
Enter/leavel IPS and LPS are large critical section, and they can't use sleep function because running in atomic-context, which own a spin_lock. In commit ba9f93f82aba ("rtlwifi: Fix enter/exit power_save"), it moves LPS functions to thread-context, so this commit can simply change LPS's spin lock to mutex. Considering IPS functions, rtl_ips_nic_on() may be called by TX tasklet (softirq-context) that check whether packet is auth frame. Fortunately, current mac80211 will ask driver to leave IPS using op_config with changed flag IEEE80211_CONF_CHANGE_IDLE, before issuing auth frame, so IPS functions can run in thread-context and use mutex to protect critical section, too. Also, this commit removes some useless spin locks. Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/realtek/rtlwifi/base.c')
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/base.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 0ba9c0cc95e1..89ec318598ea 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -551,7 +551,8 @@ int rtl_init_core(struct ieee80211_hw *hw)
551 551
552 /* <4> locks */ 552 /* <4> locks */
553 mutex_init(&rtlpriv->locks.conf_mutex); 553 mutex_init(&rtlpriv->locks.conf_mutex);
554 spin_lock_init(&rtlpriv->locks.ips_lock); 554 mutex_init(&rtlpriv->locks.ips_mutex);
555 mutex_init(&rtlpriv->locks.lps_mutex);
555 spin_lock_init(&rtlpriv->locks.irq_th_lock); 556 spin_lock_init(&rtlpriv->locks.irq_th_lock);
556 spin_lock_init(&rtlpriv->locks.h2c_lock); 557 spin_lock_init(&rtlpriv->locks.h2c_lock);
557 spin_lock_init(&rtlpriv->locks.rf_ps_lock); 558 spin_lock_init(&rtlpriv->locks.rf_ps_lock);
@@ -561,9 +562,7 @@ int rtl_init_core(struct ieee80211_hw *hw)
561 spin_lock_init(&rtlpriv->locks.c2hcmd_lock); 562 spin_lock_init(&rtlpriv->locks.c2hcmd_lock);
562 spin_lock_init(&rtlpriv->locks.scan_list_lock); 563 spin_lock_init(&rtlpriv->locks.scan_list_lock);
563 spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock); 564 spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock);
564 spin_lock_init(&rtlpriv->locks.check_sendpkt_lock);
565 spin_lock_init(&rtlpriv->locks.fw_ps_lock); 565 spin_lock_init(&rtlpriv->locks.fw_ps_lock);
566 spin_lock_init(&rtlpriv->locks.lps_lock);
567 spin_lock_init(&rtlpriv->locks.iqk_lock); 566 spin_lock_init(&rtlpriv->locks.iqk_lock);
568 /* <5> init list */ 567 /* <5> init list */
569 INIT_LIST_HEAD(&rtlpriv->entry_list); 568 INIT_LIST_HEAD(&rtlpriv->entry_list);
@@ -1229,7 +1228,6 @@ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
1229 } 1228 }
1230 if (ieee80211_is_auth(fc)) { 1229 if (ieee80211_is_auth(fc)) {
1231 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "MAC80211_LINKING\n"); 1230 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "MAC80211_LINKING\n");
1232 rtl_ips_nic_on(hw);
1233 1231
1234 mac->link_state = MAC80211_LINKING; 1232 mac->link_state = MAC80211_LINKING;
1235 /* Dul mac */ 1233 /* Dul mac */