Re: [PATCH 3.12] mwifiex: fix SDIO interrupt lost issue
From: Daniel Mack <zonque@gmail.com>
Date: 2013-10-15 10:39:01
On 27.09.2013 19:55, Bing Zhao wrote:
From: Amitkumar Karwar <redacted> 601216e "mwifiex: process RX packets in SDIO IRQ thread directly" introduced a command timeout issue which can be reproduced easily on an AM33xx platform using a test application written by Daniel Mack: https://gist.github.com/zonque/6579314 mwifiex_main_process() is called from both the SDIO handler and the workqueue. In case an interrupt occurs right after the int_status check, but before updating the mwifiex_processing flag, this interrupt gets lost, resulting in a command timeout and consequently a card reset. Let main_proc_lock protect both int_status and mwifiex_processing flag. This fixes the interrupt lost issue.
John, could you take this patch trough your tree? Thanks, Daniel
quoted hunk ↗ jump to hunk
Cc: <redacted> # 3.7+ Reported-by: Sven Neumann <redacted> Reported-by: Andreas Fenkart <redacted> Tested-by: Daniel Mack <zonque@gmail.com> Reviewed-by: Dylan Reid <redacted> Signed-off-by: Amitkumar Karwar <redacted> Signed-off-by: Bing Zhao <redacted> Signed-off-by: Paul Stewart <redacted> --- drivers/net/wireless/mwifiex/main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c index fd77833..c2b91f5 100644 --- a/drivers/net/wireless/mwifiex/main.c +++ b/drivers/net/wireless/mwifiex/main.c@@ -358,10 +358,12 @@ process_start: } } while (true); - if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter)) + spin_lock_irqsave(&adapter->main_proc_lock, flags); + if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter)) { + spin_unlock_irqrestore(&adapter->main_proc_lock, flags); goto process_start; + } - spin_lock_irqsave(&adapter->main_proc_lock, flags); adapter->mwifiex_processing = false; spin_unlock_irqrestore(&adapter->main_proc_lock, flags);