diff options
| author | Larry Finger <Larry.Finger@lwfinger.net> | 2016-06-25 14:37:47 -0400 |
|---|---|---|
| committer | Kalle Valo <kvalo@codeaurora.org> | 2016-07-05 10:31:44 -0400 |
| commit | 300c32ca84f5006ccbbf37f5207b6311aeccc5c8 (patch) | |
| tree | 8bbead7d251e22cbd8c66707a3bcc8e7aeaef7d4 /drivers/net/wireless/realtek/rtlwifi | |
| parent | 4f29b348bdc08e6a30242f0d14d6672019ffd1bb (diff) | |
rtlwifi: rtl8821ae: Fix potential race condition
Flag rfchange_inprogress in struct rtl_ps_ctl is protected by a spinlock
in most routines but not in rtl8821ae_dm_watchdog() which could
lead to a race condition. The necessary locking to prevent this condition
is added.
Reported-by: Pavel Andrianov <andrianov@ispras.ru>
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Cc: Pavel Andrianov <andrianov@ispras.ru>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/realtek/rtlwifi')
| -rw-r--r-- | drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c index 69de8353d0fe..03e08cb74184 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c | |||
| @@ -2949,6 +2949,7 @@ void rtl8821ae_dm_watchdog(struct ieee80211_hw *hw) | |||
| 2949 | if (ppsc->p2p_ps_info.p2p_ps_mode) | 2949 | if (ppsc->p2p_ps_info.p2p_ps_mode) |
| 2950 | fw_ps_awake = false; | 2950 | fw_ps_awake = false; |
| 2951 | 2951 | ||
| 2952 | spin_lock(&rtlpriv->locks.rf_ps_lock); | ||
| 2952 | if ((ppsc->rfpwr_state == ERFON) && | 2953 | if ((ppsc->rfpwr_state == ERFON) && |
| 2953 | ((!fw_current_inpsmode) && fw_ps_awake) && | 2954 | ((!fw_current_inpsmode) && fw_ps_awake) && |
| 2954 | (!ppsc->rfchange_inprogress)) { | 2955 | (!ppsc->rfchange_inprogress)) { |
| @@ -2967,6 +2968,7 @@ void rtl8821ae_dm_watchdog(struct ieee80211_hw *hw) | |||
| 2967 | rtl8821ae_dm_check_txpower_tracking_thermalmeter(hw); | 2968 | rtl8821ae_dm_check_txpower_tracking_thermalmeter(hw); |
| 2968 | rtl8821ae_dm_iq_calibrate(hw); | 2969 | rtl8821ae_dm_iq_calibrate(hw); |
| 2969 | } | 2970 | } |
| 2971 | spin_unlock(&rtlpriv->locks.rf_ps_lock); | ||
| 2970 | 2972 | ||
| 2971 | rtlpriv->dm.dbginfo.num_qry_beacon_pkt = 0; | 2973 | rtlpriv->dm.dbginfo.num_qry_beacon_pkt = 0; |
| 2972 | RT_TRACE(rtlpriv, COMP_DIG, DBG_DMESG, "\n"); | 2974 | RT_TRACE(rtlpriv, COMP_DIG, DBG_DMESG, "\n"); |
