Search Linux Wireless

RE: [RFC] mwifiex: block work queue while suspended

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi James,

> The work queue may execute after the device is suspended, leading to
> SDIO register I/O over a suspend and resume of the system.  With a
> WARN_ON in mwifiex_write_data_to_card we see:
> 
> [ 2115.351137] PM: suspend of devices complete after 15.989 msecs
> [ 2115.366047] mwifiex_sdio mmc0:0001:1: mwifiex_write_data_sync: not allowed while suspended
> [ 2115.366067] mwifiex_sdio mmc0:0001:1: host_to_card, write iomem (1) failed: -1
> [ 2115.386023] PM: late suspend of devices complete after 34.845 msecs
> [ 2115.386303] PM: noirq suspend of devices complete after 0.272 msecs
> [ 2115.386388] before suspend
> [ 2115.387824] after resume
> [ 2115.388618] PM: noirq resume of devices complete after 0.745 msecs
> [ 2115.407641] PM: early resume of devices complete after 18.849 msecs
> [ 2125.397532] mmc0: Timeout waiting for hardware interrupt.
> [ 2125.397559] mwifiex_sdio mmc0:0001:1: write CFG reg failed
> [ 2125.397575] ------------[ cut here ]------------
> [ 2125.397575] WARNING: at drivers/net/wireless/mwifiex/sdio.c:485
> mwifiex_write_data_to_card+0x98/0xc4 [mwifiex_sdio]()
> [ 2125.397746] [<bf0eb34c>] (mwifiex_host_to_card_mp_aggr+0x354/0x46c [mwifiex_sdio])
> [ 2125.397746] [<bf0eb5f4>] (mwifiex_sdio_host_to_card+0x190/0x234 [mwifiex_sdio])
> [ 2125.397788] [<bf0bed00>] (mwifiex_process_tx+0x90/0x1a0 [mwifiex])
> [ 2125.397823] [<bf0bf8a0>] (mwifiex_send_single_packet+0x134/0x2b0 [mwifiex])
> [ 2125.397857] [<bf0c074c>] (mwifiex_wmm_process_tx+0x76c/0x800 [mwifiex])
> [ 2125.397887] [<bf0ba3f8>] (mwifiex_main_process+0x344/0x504 [mwifiex])
> [ 2125.397913] [<bf0ba5e0>] (mwifiex_main_work_queue+0x28/0x2c [mwifiex])
> [ 2125.397949] [<c00409fc>] (process_one_work+0x260/0x488)
> [ 2125.397949] [<c0040e40>] (worker_thread+0x1e0/0x32c)
> [ 2125.397979] [<c00464d0>] (kthread+0x9c/0xac)
> [ 2125.397979] ---[ end trace 86d7b628a6c8ddd0 ]---
> ---
> 
> Test environment is an OLPC XO-4 doing one sleep every few seconds,
> with the device configured to wake the system, with constant ping by
> another host.  Kernel is 3.5 with many backported mwifiex patches.
> 
> We also see that an SDIO interrupt from the device may occur after all
> devices are suspended, leading to a similar symptom:

To understand what is happening here could you apply attached debug patch to generate logs, or enable dynamic_debug for that?

> 
> [ 1292.887221] PM: suspend of devices complete after 21.990 msecs
> [ 1292.922632] PM: late suspend of devices complete after 35.403 msecs
> [ 1292.922901] PM: noirq suspend of devices complete after 0.001 msecs
>                <-- here an mmc register read begins in sdio_irq_thread
> [ 1292.923020] before suspend
> [ 1292.953311] after resume
> [ 1292.954106] PM: noirq resume of devices complete after 0.099 msecs
> [ 1292.973124] PM: early resume of devices complete after 18.814 msecs
> [ 1302.923009] mmc0: Timeout waiting for hardware interrupt.
> [ 1302.923050] ------------[ cut here ]------------
> [ 1302.923075] WARNING: at drivers/net/wireless/mwifiex/sdio.c:688 mwifiex_sdio_interrupt+0xcc/0x21c
> [mwifiex_sdio]()
> [ 1302.923204] [<bf0c089c>] (mwifiex_sdio_interrupt+0xcc/0x21c [mwifiex_sdio])
> [ 1302.923218] [<c0302be4>] (sdio_irq_thread+0x178/0x2f0)
> [ 1302.923218] [<c00464d0>] (kthread+0x9c/0xac)
> [ 1302.923235] ---[ end trace 7e9f40af36cc200c ]---
> [ 1302.923240] mwifiex_sdio mmc0:0001:1: read mp_regs failed, will retry ...
> [ 1302.923291] mwifiex_sdio mmc0:0001:1: read mp_regs worked on retry

I guess the driver and firmware are out of sync here. If firmware is sleeping we will get this failure.

> [ 1303.554228] PM: resume of devices complete after 10581.100 msecs
>                ^-- note how resume was delayed by mmc0 timeout
> [ 1303.745395] Restarting tasks ... done.
> [ 1312.943035] mwifiex_sdio mmc0:0001:1: mwifiex_cmd_timeout_func: Timeout cmd id (1400141716.779991)
> = 0xe5, act = 0x1
> 
> I don't know how to fix this one yet; I don't know why the SDHCI
> transaction fails, given the clocks remain running.

Are you able to get an SDIO Bus Analyzer capture?

> 
>  drivers/net/wireless/mwifiex/main.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
> index 9c771b3..512ccd6 100644
> --- a/drivers/net/wireless/mwifiex/main.c
> +++ b/drivers/net/wireless/mwifiex/main.c
> @@ -833,6 +833,8 @@ static void mwifiex_main_work_queue(struct work_struct *work)
> 
>  	if (adapter->surprise_removed)
>  		return;
> +	if (adapter->is_suspended)
> +		return;

If we can find the root cause and fix it, this change won't be necessary.

Thanks,
Bing

>  	mwifiex_main_process(adapter);
>  }
> 

Attachment: mwifiex_debug_cmd_sequence_in_suspend.patch
Description: mwifiex_debug_cmd_sequence_in_suspend.patch


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux