2016-05-21 16:50:41

by Larry Finger

[permalink] [raw]
Subject: [PATCH] rtlwifi: Fix scheduling while atomic error from commit 49f86ec21c01

Commit 49f86ec21c01 ("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: 49f86ec21c01 ("rtlwifi: Change long delays to sleeps")
Reported-by: James Feeney <[email protected]>
Signed-off-by: Larry Finger <[email protected]>
Cc: James Feeney <[email protected]>
Cc: Stable <[email protected]> [4.6+]
---
drivers/net/wireless/realtek/rtlwifi/core.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c
index 0f48048..3a0faa8 100644
--- a/drivers/net/wireless/realtek/rtlwifi/core.c
+++ b/drivers/net/wireless/realtek/rtlwifi/core.c
@@ -54,7 +54,7 @@ EXPORT_SYMBOL(channel5g_80m);
void rtl_addr_delay(u32 addr)
{
if (addr == 0xfe)
- msleep(50);
+ mdelay(50);
else if (addr == 0xfd)
msleep(5);
else if (addr == 0xfc)
@@ -75,7 +75,7 @@ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
rtl_addr_delay(addr);
} else {
rtl_set_rfreg(hw, rfpath, addr, mask, data);
- usleep_range(1, 2);
+ udelay(1);
}
}
EXPORT_SYMBOL(rtl_rfreg_delay);
@@ -86,7 +86,7 @@ void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data)
rtl_addr_delay(addr);
} else {
rtl_set_bbreg(hw, addr, MASKDWORD, data);
- usleep_range(1, 2);
+ udelay(1);
}
}
EXPORT_SYMBOL(rtl_bb_delay);
--
2.1.4



2016-05-27 17:53:48

by Kalle Valo

[permalink] [raw]
Subject: Re: rtlwifi: Fix scheduling while atomic error from commit 49f86ec21c01

Larry Finger <[email protected]> wrote:
> Commit 49f86ec21c01 ("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: 49f86ec21c01 ("rtlwifi: Change long delays to sleeps")
> Reported-by: James Feeney <[email protected]>
> Signed-off-by: Larry Finger <[email protected]>
> Cc: James Feeney <[email protected]>
> Cc: Stable <[email protected]> [4.6+]

Thanks, 1 patch applied to wireless-drivers.git:

de26859dcf36 rtlwifi: Fix scheduling while atomic error from commit 49f86ec21c01

--
Sent by pwcli
https://patchwork.kernel.org/patch/9130617/


2016-05-22 14:46:40

by Larry Finger

[permalink] [raw]
Subject: Re: [PATCH] rtlwifi: Fix scheduling while atomic error from commit 49f86ec21c01

On 05/22/2016 12:53 AM, Kalle Valo wrote:
> Larry Finger <[email protected]> writes:
>
>> Commit 49f86ec21c01 ("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: 49f86ec21c01 ("rtlwifi: Change long delays to sleeps")
>> Reported-by: James Feeney <[email protected]>
>> Signed-off-by: Larry Finger <[email protected]>
>> Cc: James Feeney <[email protected]>
>> Cc: Stable <[email protected]> [4.6+]
>
> I'm planning to queue this to 4.7.

That will be good as it will be ported to 4.6 quickly after that.

Larry



2016-05-22 05:53:29

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH] rtlwifi: Fix scheduling while atomic error from commit 49f86ec21c01

Larry Finger <[email protected]> writes:

> Commit 49f86ec21c01 ("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: 49f86ec21c01 ("rtlwifi: Change long delays to sleeps")
> Reported-by: James Feeney <[email protected]>
> Signed-off-by: Larry Finger <[email protected]>
> Cc: James Feeney <[email protected]>
> Cc: Stable <[email protected]> [4.6+]

I'm planning to queue this to 4.7.

--
Kalle Valo