Commit 312d5479dcfaca2b8aa451201b5388fdb8c8684a
Committed by
John W. Linville
1 parent
67fc6052a4
Exists in
master
and in
38 other branches
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>
Showing 3 changed files with 26 additions and 38 deletions Side-by-side Diff
drivers/net/wireless/rtlwifi/ps.c
... | ... | @@ -85,7 +85,6 @@ |
85 | 85 | struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); |
86 | 86 | bool actionallowed = false; |
87 | 87 | u16 rfwait_cnt = 0; |
88 | - unsigned long flag; | |
89 | 88 | |
90 | 89 | /*protect_or_not = true; */ |
91 | 90 | |
92 | 91 | |
... | ... | @@ -98,10 +97,9 @@ |
98 | 97 | *should wait to be executed. |
99 | 98 | */ |
100 | 99 | while (true) { |
101 | - spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); | |
100 | + spin_lock(&rtlpriv->locks.rf_ps_lock); | |
102 | 101 | if (ppsc->rfchange_inprogress) { |
103 | - spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, | |
104 | - flag); | |
102 | + spin_unlock(&rtlpriv->locks.rf_ps_lock); | |
105 | 103 | |
106 | 104 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, |
107 | 105 | ("RF Change in progress!" |
... | ... | @@ -122,8 +120,7 @@ |
122 | 120 | } |
123 | 121 | } else { |
124 | 122 | ppsc->rfchange_inprogress = true; |
125 | - spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, | |
126 | - flag); | |
123 | + spin_unlock(&rtlpriv->locks.rf_ps_lock); | |
127 | 124 | break; |
128 | 125 | } |
129 | 126 | } |
130 | 127 | |
... | ... | @@ -171,9 +168,9 @@ |
171 | 168 | rtlpriv->cfg->ops->set_rf_power_state(hw, state_toset); |
172 | 169 | |
173 | 170 | if (!protect_or_not) { |
174 | - spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); | |
171 | + spin_lock(&rtlpriv->locks.rf_ps_lock); | |
175 | 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 | 176 | return actionallowed; |
180 | 177 | |
... | ... | @@ -287,12 +284,11 @@ |
287 | 284 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
288 | 285 | struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); |
289 | 286 | enum rf_pwrstate rtstate; |
290 | - unsigned long flags; | |
291 | 287 | |
292 | 288 | if (mac->opmode != NL80211_IFTYPE_STATION) |
293 | 289 | return; |
294 | 290 | |
295 | - spin_lock_irqsave(&rtlpriv->locks.ips_lock, flags); | |
291 | + spin_lock(&rtlpriv->locks.ips_lock); | |
296 | 292 | |
297 | 293 | if (ppsc->inactiveps) { |
298 | 294 | rtstate = ppsc->rfpwr_state; |
... | ... | @@ -308,7 +304,7 @@ |
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 | 310 | /*for FW LPS*/ |
... | ... | @@ -426,7 +422,6 @@ |
426 | 422 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
427 | 423 | struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); |
428 | 424 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
429 | - unsigned long flag; | |
430 | 425 | |
431 | 426 | if (!ppsc->fwctrl_lps) |
432 | 427 | return; |
... | ... | @@ -447,7 +442,7 @@ |
447 | 442 | if (mac->link_state != MAC80211_LINKED) |
448 | 443 | return; |
449 | 444 | |
450 | - spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag); | |
445 | + spin_lock(&rtlpriv->locks.lps_lock); | |
451 | 446 | |
452 | 447 | /* Idle for a while if we connect to AP a while ago. */ |
453 | 448 | if (mac->cnt_after_linked >= 2) { |
... | ... | @@ -459,7 +454,7 @@ |
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 | 460 | /*Leave the leisure power save mode.*/ |
466 | 461 | |
... | ... | @@ -468,9 +463,8 @@ |
468 | 463 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
469 | 464 | struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); |
470 | 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 | 469 | if (ppsc->fwctrl_lps) { |
476 | 470 | if (ppsc->dot11_psmode != EACTIVE) { |
... | ... | @@ -491,7 +485,7 @@ |
491 | 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 | 491 | /* For sw LPS*/ |
... | ... | @@ -580,7 +574,6 @@ |
580 | 574 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
581 | 575 | struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); |
582 | 576 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
583 | - unsigned long flag; | |
584 | 577 | |
585 | 578 | if (!rtlpriv->psc.swctrl_lps) |
586 | 579 | return; |
587 | 580 | |
... | ... | @@ -593,9 +586,9 @@ |
593 | 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 | 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 | |
601 | 594 | void rtl_swlps_rfon_wq_callback(void *data) |
... | ... | @@ -612,7 +605,6 @@ |
612 | 605 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
613 | 606 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
614 | 607 | struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); |
615 | - unsigned long flag; | |
616 | 608 | u8 sleep_intv; |
617 | 609 | |
618 | 610 | if (!rtlpriv->psc.sw_ps_enabled) |
619 | 611 | |
620 | 612 | |
621 | 613 | |
622 | 614 | |
... | ... | @@ -629,16 +621,16 @@ |
629 | 621 | if (rtlpriv->link_info.busytraffic) |
630 | 622 | return; |
631 | 623 | |
632 | - spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag); | |
624 | + spin_lock(&rtlpriv->locks.rf_ps_lock); | |
633 | 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 | 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 | 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 | 635 | if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM && |
644 | 636 | !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) { |
drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
... | ... | @@ -46,13 +46,12 @@ |
46 | 46 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
47 | 47 | u32 original_value, readback_value, bitshift; |
48 | 48 | struct rtl_phy *rtlphy = &(rtlpriv->phy); |
49 | - unsigned long flags; | |
50 | 49 | |
51 | 50 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), " |
52 | 51 | "rfpath(%#x), bitmask(%#x)\n", |
53 | 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 | 56 | if (rtlphy->rf_mode != RF_OP_BY_FW) { |
58 | 57 | original_value = _rtl92c_phy_rf_serial_read(hw, |
... | ... | @@ -65,7 +64,7 @@ |
65 | 64 | bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); |
66 | 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 | 69 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, |
71 | 70 | ("regaddr(%#x), rfpath(%#x), " |
72 | 71 | |
... | ... | @@ -120,13 +119,12 @@ |
120 | 119 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
121 | 120 | struct rtl_phy *rtlphy = &(rtlpriv->phy); |
122 | 121 | u32 original_value, bitshift; |
123 | - unsigned long flags; | |
124 | 122 | |
125 | 123 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, |
126 | 124 | ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", |
127 | 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 | 129 | if (rtlphy->rf_mode != RF_OP_BY_FW) { |
132 | 130 | if (bitmask != RFREG_OFFSET_MASK) { |
... | ... | @@ -153,7 +151,7 @@ |
153 | 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 | 156 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), " |
159 | 157 | "bitmask(%#x), data(%#x), " |
drivers/net/wireless/rtlwifi/rtl8192se/phy.c
... | ... | @@ -180,19 +180,18 @@ |
180 | 180 | { |
181 | 181 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
182 | 182 | u32 original_value, readback_value, bitshift; |
183 | - unsigned long flags; | |
184 | 183 | |
185 | 184 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), " |
186 | 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 | 189 | original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, regaddr); |
191 | 190 | |
192 | 191 | bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); |
193 | 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 | 196 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), " |
198 | 197 | "bitmask(%#x), original_value(%#x)\n", regaddr, rfpath, |
... | ... | @@ -207,7 +206,6 @@ |
207 | 206 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
208 | 207 | struct rtl_phy *rtlphy = &(rtlpriv->phy); |
209 | 208 | u32 original_value, bitshift; |
210 | - unsigned long flags; | |
211 | 209 | |
212 | 210 | if (!((rtlphy->rf_pathmap >> rfpath) & 0x1)) |
213 | 211 | return; |
... | ... | @@ -215,7 +213,7 @@ |
215 | 213 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x)," |
216 | 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 | 218 | if (bitmask != RFREG_OFFSET_MASK) { |
221 | 219 | original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, |
... | ... | @@ -226,7 +224,7 @@ |
226 | 224 | |
227 | 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 | 229 | RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x), " |
232 | 230 | "data(%#x), rfpath(%#x)\n", regaddr, bitmask, data, rfpath)); |