瀏覽代碼

rtlwifi: Fix use of mutex in interrupt code

A previous conversion from semaphoreto mutexes missed the fact that one
of the semaphores was used in interrupt code. Fixed by changing to
a spinlock.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Larry Finger 14 年之前
父節點
當前提交
d704300fa5
共有 3 個文件被更改,包括 6 次插入5 次删除
  1. 1 1
      drivers/net/wireless/rtlwifi/base.c
  2. 3 2
      drivers/net/wireless/rtlwifi/ps.c
  3. 2 2
      drivers/net/wireless/rtlwifi/wifi.h

+ 1 - 1
drivers/net/wireless/rtlwifi/base.c

@@ -309,8 +309,8 @@ int rtl_init_core(struct ieee80211_hw *hw)
 	}
 
 	/* <4> locks */
-	mutex_init(&rtlpriv->locks.ips_mutex);
 	mutex_init(&rtlpriv->locks.conf_mutex);
+	spin_lock_init(&rtlpriv->locks.ips_lock);
 	spin_lock_init(&rtlpriv->locks.irq_th_lock);
 	spin_lock_init(&rtlpriv->locks.h2c_lock);
 	spin_lock_init(&rtlpriv->locks.rf_ps_lock);

+ 3 - 2
drivers/net/wireless/rtlwifi/ps.c

@@ -286,8 +286,9 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
 	enum rf_pwrstate rtstate;
+	unsigned long flags;
 
-	mutex_lock(&rtlpriv->locks.ips_mutex);
+	spin_lock_irqsave(&rtlpriv->locks.ips_lock, flags);
 
 	if (ppsc->b_inactiveps) {
 		rtstate = ppsc->rfpwr_state;
@@ -303,7 +304,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
 		}
 	}
 
-	mutex_unlock(&rtlpriv->locks.ips_mutex);
+	spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags);
 }
 
 /*for FW LPS*/

+ 2 - 2
drivers/net/wireless/rtlwifi/wifi.h

@@ -1192,11 +1192,11 @@ struct rtl_hal_cfg {
 };
 
 struct rtl_locks {
-	/*sem */
-	struct mutex ips_mutex;
+	/* mutex */
 	struct mutex conf_mutex;
 
 	/*spin lock */
+	spinlock_t ips_lock;
 	spinlock_t irq_th_lock;
 	spinlock_t h2c_lock;
 	spinlock_t rf_ps_lock;