Commit 312d5479dcfaca2b8aa451201b5388fdb8c8684a

Authored by Mike McCormack
Committed by John W. Linville
1 parent 67fc6052a4

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));