Commit de26859d authored by Larry Finger's avatar Larry Finger Committed by Kalle Valo

rtlwifi: Fix scheduling while atomic error from commit 49f86ec2

Commit 49f86ec2 ("rtlwifi: Change long delays to sleeps") was correct
for most cases; however, driver rtl8192ce calls the affected routines while
in atomic context. The kernel bug output is as follows:

BUG: scheduling while atomic: wpa_supplicant/627/0x00000002
[...]
  [<ffffffff815c2b39>] __schedule+0x899/0xad0
  [<ffffffff815c2dac>] schedule+0x3c/0x90
  [<ffffffff815c5bb2>] schedule_hrtimeout_range_clock+0xa2/0x120
  [<ffffffff810e8b80>] ? hrtimer_init+0x120/0x120
  [<ffffffff815c5ba6>] ? schedule_hrtimeout_range_clock+0x96/0x120
  [<ffffffff815c5c43>] schedule_hrtimeout_range+0x13/0x20
  [<ffffffff815c568f>] usleep_range+0x4f/0x70
  [<ffffffffa0667218>] rtl_rfreg_delay+0x38/0x50 [rtlwifi]
  [<ffffffffa06dd0e7>] rtl92c_phy_config_rf_with_headerfile+0xc7/0xe0 [rtl8192ce]

To fix this bug, three of the changes from delay to sleep are reverted.
Unfortunately, one of the changes involves a delay of 50 msec. The calling
code will be modified so that this long delay can be avoided; however,
this change is being pushed now to fix the problem in kernel 4.6.0.

Fixes: 49f86ec2 ("rtlwifi: Change long delays to sleeps")
Reported-by: default avatarJames Feeney <james@nurealm.net>
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: James Feeney <james@nurealm.net>
Cc: Stable <stable@vger.kernel.org> [4.6+]
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 94abd778
...@@ -54,7 +54,7 @@ EXPORT_SYMBOL(channel5g_80m); ...@@ -54,7 +54,7 @@ EXPORT_SYMBOL(channel5g_80m);
void rtl_addr_delay(u32 addr) void rtl_addr_delay(u32 addr)
{ {
if (addr == 0xfe) if (addr == 0xfe)
msleep(50); mdelay(50);
else if (addr == 0xfd) else if (addr == 0xfd)
msleep(5); msleep(5);
else if (addr == 0xfc) else if (addr == 0xfc)
...@@ -75,7 +75,7 @@ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr, ...@@ -75,7 +75,7 @@ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
rtl_addr_delay(addr); rtl_addr_delay(addr);
} else { } else {
rtl_set_rfreg(hw, rfpath, addr, mask, data); rtl_set_rfreg(hw, rfpath, addr, mask, data);
usleep_range(1, 2); udelay(1);
} }
} }
EXPORT_SYMBOL(rtl_rfreg_delay); EXPORT_SYMBOL(rtl_rfreg_delay);
...@@ -86,7 +86,7 @@ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data) ...@@ -86,7 +86,7 @@ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data)
rtl_addr_delay(addr); rtl_addr_delay(addr);
} else { } else {
rtl_set_bbreg(hw, addr, MASKDWORD, data); rtl_set_bbreg(hw, addr, MASKDWORD, data);
usleep_range(1, 2); udelay(1);
} }
} }
EXPORT_SYMBOL(rtl_bb_delay); EXPORT_SYMBOL(rtl_bb_delay);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment