On 27.09.2013 19:55, Bing Zhao wrote: > From: Amitkumar Karwar <akarwar@xxxxxxxxxxx> > > 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 Actually, just out of pure curiosity, I would be interested whether the issue is also as easily reproducible on other platform like Chromebooks. Could anyone give that a try maybe? Thanks, Daniel > > 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. > > Cc: <stable@xxxxxxxxxxxxxxx> # 3.7+ > Reported-by: Sven Neumann <s.neumann@xxxxxxxxxxxx> > Reported-by: Andreas Fenkart <andreas.fenkart@xxxxxxxxxxxxxxxxxxx> > Tested-by: Daniel Mack <zonque@xxxxxxxxx> > Reviewed-by: Dylan Reid <dgreid@xxxxxxxxxxxx> > Signed-off-by: Amitkumar Karwar <akarwar@xxxxxxxxxxx> > Signed-off-by: Bing Zhao <bzhao@xxxxxxxxxxx> > Signed-off-by: Paul Stewart <pstew@xxxxxxxxxxxx> > --- > 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); > > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html