aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorMike McCormack <mikem@ring3k.org>2011-05-30 19:49:36 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-06-03 15:01:05 -0400
commit312d5479dcfaca2b8aa451201b5388fdb8c8684a (patch)
tree2ffcf163f8d3ec1103e99263dd78b7ecaa8cc31f /drivers/net
parent67fc6052a49b781efbcfc138f3b68fe79ddd0c2f (diff)
rtlwifi: Don't block interrupts in spinlocks
Now power state transitions are not called from an interrupt context, there's no need to block interrupts. This code appears to block interrupts for too long, causing my trackpad to lose sync occasionally. Signed-off-by: Mike McCormack <mikem@ring3k.org> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/rtlwifi/ps.c44
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/phy.c10
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/phy.c10
3 files changed, 26 insertions, 38 deletions
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c
index fd3b04f0843f..d14c13d02177 100644
--- a/drivers/net/wireless/rtlwifi/ps.c
+++ b/drivers/net/wireless/rtlwifi/ps.c
@@ -85,7 +85,6 @@ bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
85 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 85 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
86 bool actionallowed = false; 86 bool actionallowed = false;
87 u16 rfwait_cnt = 0; 87 u16 rfwait_cnt = 0;
88 unsigned long flag;
89 88
90 /*protect_or_not = true; */ 89 /*protect_or_not = true; */
91 90
@@ -98,10 +97,9 @@ bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
98 *should wait to be executed. 97 *should wait to be executed.
99 */ 98 */
100 while (true) { 99 while (true) {
101 spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); 100 spin_lock(&rtlpriv->locks.rf_ps_lock);
102 if (ppsc->rfchange_inprogress) { 101 if (ppsc->rfchange_inprogress) {
103 spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, 102 spin_unlock(&rtlpriv->locks.rf_ps_lock);
104 flag);
105 103
106 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 104 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
107 ("RF Change in progress!" 105 ("RF Change in progress!"
@@ -122,8 +120,7 @@ bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
122 } 120 }
123 } else { 121 } else {
124 ppsc->rfchange_inprogress = true; 122 ppsc->rfchange_inprogress = true;
125 spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, 123 spin_unlock(&rtlpriv->locks.rf_ps_lock);
126 flag);
127 break; 124 break;
128 } 125 }
129 } 126 }
@@ -171,9 +168,9 @@ no_protect:
171 rtlpriv->cfg->ops->set_rf_power_state(hw, state_toset); 168 rtlpriv->cfg->ops->set_rf_power_state(hw, state_toset);
172 169
173 if (!protect_or_not) { 170 if (!protect_or_not) {
174 spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); 171 spin_lock(&rtlpriv->locks.rf_ps_lock);
175 ppsc->rfchange_inprogress = false; 172 ppsc->rfchange_inprogress = false;
176 spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag); 173 spin_unlock(&rtlpriv->locks.rf_ps_lock);
177 } 174 }
178 175
179 return actionallowed; 176 return actionallowed;
@@ -287,12 +284,11 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
287 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 284 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
288 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 285 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
289 enum rf_pwrstate rtstate; 286 enum rf_pwrstate rtstate;
290 unsigned long flags;
291 287
292 if (mac->opmode != NL80211_IFTYPE_STATION) 288 if (mac->opmode != NL80211_IFTYPE_STATION)
293 return; 289 return;
294 290
295 spin_lock_irqsave(&rtlpriv->locks.ips_lock, flags); 291 spin_lock(&rtlpriv->locks.ips_lock);
296 292
297 if (ppsc->inactiveps) { 293 if (ppsc->inactiveps) {
298 rtstate = ppsc->rfpwr_state; 294 rtstate = ppsc->rfpwr_state;
@@ -308,7 +304,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
308 } 304 }
309 } 305 }
310 306
311 spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags); 307 spin_unlock(&rtlpriv->locks.ips_lock);
312} 308}
313 309
314/*for FW LPS*/ 310/*for FW LPS*/
@@ -426,7 +422,6 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
426 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 422 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
427 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 423 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
428 struct rtl_priv *rtlpriv = rtl_priv(hw); 424 struct rtl_priv *rtlpriv = rtl_priv(hw);
429 unsigned long flag;
430 425
431 if (!ppsc->fwctrl_lps) 426 if (!ppsc->fwctrl_lps)
432 return; 427 return;
@@ -447,7 +442,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
447 if (mac->link_state != MAC80211_LINKED) 442 if (mac->link_state != MAC80211_LINKED)
448 return; 443 return;
449 444
450 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); 445 spin_lock(&rtlpriv->locks.lps_lock);
451 446
452 /* Idle for a while if we connect to AP a while ago. */ 447 /* Idle for a while if we connect to AP a while ago. */
453 if (mac->cnt_after_linked >= 2) { 448 if (mac->cnt_after_linked >= 2) {
@@ -459,7 +454,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
459 } 454 }
460 } 455 }
461 456
462 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); 457 spin_unlock(&rtlpriv->locks.lps_lock);
463} 458}
464 459
465/*Leave the leisure power save mode.*/ 460/*Leave the leisure power save mode.*/
@@ -468,9 +463,8 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
468 struct rtl_priv *rtlpriv = rtl_priv(hw); 463 struct rtl_priv *rtlpriv = rtl_priv(hw);
469 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 464 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
470 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 465 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
471 unsigned long flag;
472 466
473 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); 467 spin_lock(&rtlpriv->locks.lps_lock);
474 468
475 if (ppsc->fwctrl_lps) { 469 if (ppsc->fwctrl_lps) {
476 if (ppsc->dot11_psmode != EACTIVE) { 470 if (ppsc->dot11_psmode != EACTIVE) {
@@ -491,7 +485,7 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
491 rtl_lps_set_psmode(hw, EACTIVE); 485 rtl_lps_set_psmode(hw, EACTIVE);
492 } 486 }
493 } 487 }
494 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); 488 spin_unlock(&rtlpriv->locks.lps_lock);
495} 489}
496 490
497/* For sw LPS*/ 491/* For sw LPS*/
@@ -580,7 +574,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
580 struct rtl_priv *rtlpriv = rtl_priv(hw); 574 struct rtl_priv *rtlpriv = rtl_priv(hw);
581 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 575 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
582 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 576 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
583 unsigned long flag;
584 577
585 if (!rtlpriv->psc.swctrl_lps) 578 if (!rtlpriv->psc.swctrl_lps)
586 return; 579 return;
@@ -593,9 +586,9 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
593 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM); 586 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
594 } 587 }
595 588
596 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); 589 spin_lock(&rtlpriv->locks.lps_lock);
597 rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS, false); 590 rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS, false);
598 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); 591 spin_unlock(&rtlpriv->locks.lps_lock);
599} 592}
600 593
601void rtl_swlps_rfon_wq_callback(void *data) 594void rtl_swlps_rfon_wq_callback(void *data)
@@ -612,7 +605,6 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
612 struct rtl_priv *rtlpriv = rtl_priv(hw); 605 struct rtl_priv *rtlpriv = rtl_priv(hw);
613 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 606 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
614 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 607 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
615 unsigned long flag;
616 u8 sleep_intv; 608 u8 sleep_intv;
617 609
618 if (!rtlpriv->psc.sw_ps_enabled) 610 if (!rtlpriv->psc.sw_ps_enabled)
@@ -629,16 +621,16 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
629 if (rtlpriv->link_info.busytraffic) 621 if (rtlpriv->link_info.busytraffic)
630 return; 622 return;
631 623
632 spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); 624 spin_lock(&rtlpriv->locks.rf_ps_lock);
633 if (rtlpriv->psc.rfchange_inprogress) { 625 if (rtlpriv->psc.rfchange_inprogress) {
634 spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag); 626 spin_unlock(&rtlpriv->locks.rf_ps_lock);
635 return; 627 return;
636 } 628 }
637 spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag); 629 spin_unlock(&rtlpriv->locks.rf_ps_lock);
638 630
639 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); 631 spin_lock(&rtlpriv->locks.lps_lock);
640 rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS, false); 632 rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS, false);
641 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag); 633 spin_unlock(&rtlpriv->locks.lps_lock);
642 634
643 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM && 635 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM &&
644 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) { 636 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
index dde619e2994f..592a10ac5929 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
@@ -46,13 +46,12 @@ u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
46 struct rtl_priv *rtlpriv = rtl_priv(hw); 46 struct rtl_priv *rtlpriv = rtl_priv(hw);
47 u32 original_value, readback_value, bitshift; 47 u32 original_value, readback_value, bitshift;
48 struct rtl_phy *rtlphy = &(rtlpriv->phy); 48 struct rtl_phy *rtlphy = &(rtlpriv->phy);
49 unsigned long flags;
50 49
51 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), " 50 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
52 "rfpath(%#x), bitmask(%#x)\n", 51 "rfpath(%#x), bitmask(%#x)\n",
53 regaddr, rfpath, bitmask)); 52 regaddr, rfpath, bitmask));
54 53
55 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 54 spin_lock(&rtlpriv->locks.rf_lock);
56 55
57 if (rtlphy->rf_mode != RF_OP_BY_FW) { 56 if (rtlphy->rf_mode != RF_OP_BY_FW) {
58 original_value = _rtl92c_phy_rf_serial_read(hw, 57 original_value = _rtl92c_phy_rf_serial_read(hw,
@@ -65,7 +64,7 @@ u32 rtl92c_phy_query_rf_reg(struct ieee80211_hw *hw,
65 bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 64 bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
66 readback_value = (original_value & bitmask) >> bitshift; 65 readback_value = (original_value & bitmask) >> bitshift;
67 66
68 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 67 spin_unlock(&rtlpriv->locks.rf_lock);
69 68
70 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 69 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
71 ("regaddr(%#x), rfpath(%#x), " 70 ("regaddr(%#x), rfpath(%#x), "
@@ -120,13 +119,12 @@ void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw,
120 struct rtl_priv *rtlpriv = rtl_priv(hw); 119 struct rtl_priv *rtlpriv = rtl_priv(hw);
121 struct rtl_phy *rtlphy = &(rtlpriv->phy); 120 struct rtl_phy *rtlphy = &(rtlpriv->phy);
122 u32 original_value, bitshift; 121 u32 original_value, bitshift;
123 unsigned long flags;
124 122
125 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 123 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
126 ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 124 ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
127 regaddr, bitmask, data, rfpath)); 125 regaddr, bitmask, data, rfpath));
128 126
129 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 127 spin_lock(&rtlpriv->locks.rf_lock);
130 128
131 if (rtlphy->rf_mode != RF_OP_BY_FW) { 129 if (rtlphy->rf_mode != RF_OP_BY_FW) {
132 if (bitmask != RFREG_OFFSET_MASK) { 130 if (bitmask != RFREG_OFFSET_MASK) {
@@ -153,7 +151,7 @@ void rtl92ce_phy_set_rf_reg(struct ieee80211_hw *hw,
153 _rtl92c_phy_fw_rf_serial_write(hw, rfpath, regaddr, data); 151 _rtl92c_phy_fw_rf_serial_write(hw, rfpath, regaddr, data);
154 } 152 }
155 153
156 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 154 spin_unlock(&rtlpriv->locks.rf_lock);
157 155
158 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), " 156 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
159 "bitmask(%#x), data(%#x), " 157 "bitmask(%#x), data(%#x), "
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
index fd969fd0e5cd..7ee2daccd7d5 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c
@@ -180,19 +180,18 @@ u32 rtl92s_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
180{ 180{
181 struct rtl_priv *rtlpriv = rtl_priv(hw); 181 struct rtl_priv *rtlpriv = rtl_priv(hw);
182 u32 original_value, readback_value, bitshift; 182 u32 original_value, readback_value, bitshift;
183 unsigned long flags;
184 183
185 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), " 184 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), "
186 "bitmask(%#x)\n", regaddr, rfpath, bitmask)); 185 "bitmask(%#x)\n", regaddr, rfpath, bitmask));
187 186
188 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 187 spin_lock(&rtlpriv->locks.rf_lock);
189 188
190 original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, regaddr); 189 original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, regaddr);
191 190
192 bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); 191 bitshift = _rtl92s_phy_calculate_bit_shift(bitmask);
193 readback_value = (original_value & bitmask) >> bitshift; 192 readback_value = (original_value & bitmask) >> bitshift;
194 193
195 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 194 spin_unlock(&rtlpriv->locks.rf_lock);
196 195
197 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), " 196 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), "
198 "bitmask(%#x), original_value(%#x)\n", regaddr, rfpath, 197 "bitmask(%#x), original_value(%#x)\n", regaddr, rfpath,
@@ -207,7 +206,6 @@ void rtl92s_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
207 struct rtl_priv *rtlpriv = rtl_priv(hw); 206 struct rtl_priv *rtlpriv = rtl_priv(hw);
208 struct rtl_phy *rtlphy = &(rtlpriv->phy); 207 struct rtl_phy *rtlphy = &(rtlpriv->phy);
209 u32 original_value, bitshift; 208 u32 original_value, bitshift;
210 unsigned long flags;
211 209
212 if (!((rtlphy->rf_pathmap >> rfpath) & 0x1)) 210 if (!((rtlphy->rf_pathmap >> rfpath) & 0x1))
213 return; 211 return;
@@ -215,7 +213,7 @@ void rtl92s_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
215 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x)," 213 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
216 " data(%#x), rfpath(%#x)\n", regaddr, bitmask, data, rfpath)); 214 " data(%#x), rfpath(%#x)\n", regaddr, bitmask, data, rfpath));
217 215
218 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 216 spin_lock(&rtlpriv->locks.rf_lock);
219 217
220 if (bitmask != RFREG_OFFSET_MASK) { 218 if (bitmask != RFREG_OFFSET_MASK) {
221 original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, 219 original_value = _rtl92s_phy_rf_serial_read(hw, rfpath,
@@ -226,7 +224,7 @@ void rtl92s_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
226 224
227 _rtl92s_phy_rf_serial_write(hw, rfpath, regaddr, data); 225 _rtl92s_phy_rf_serial_write(hw, rfpath, regaddr, data);
228 226
229 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 227 spin_unlock(&rtlpriv->locks.rf_lock);
230 228
231 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x), " 229 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x), "
232 "data(%#x), rfpath(%#x)\n", regaddr, bitmask, data, rfpath)); 230 "data(%#x), rfpath(%#x)\n", regaddr, bitmask, data, rfpath));