diff options
author | Ping-Ke Shih <pkshih@realtek.com> | 2018-01-17 01:15:21 -0500 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2018-01-17 10:09:10 -0500 |
commit | a3fa3669d18c959c265eda2048b998c0062a61ce (patch) | |
tree | 50aac2c73bb59847acc8bc536ce567b6218905a8 /drivers/net/wireless/realtek/rtlwifi/base.c | |
parent | 98051872fd25077d3b106ab3d2b945fa7025c1ef (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.c | 6 |
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 */ |