From: James Cameron <quozl@laptop.org>
To: Bing Zhao <bzhao@marvell.com>
Cc: "linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>
Subject: Re: [RFC] mwifiex: block work queue while suspended
Date: Thu, 29 May 2014 11:22:33 +1000 [thread overview]
Message-ID: <20140529012233.GC10000@us.netrek.org> (raw)
In-Reply-To: <477F20668A386D41ADCC57781B1F70430F70F5E39F@SC-VEXCH1.marvell.com>
On Tue, May 27, 2014 at 04:39:07PM -0700, Bing Zhao wrote:
> [...]
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.340430] after resume
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.372814] PM: noirq resume of devices complete after 0.098 msecs
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.391862] PM: early resume of devices complete after 18.934 msecs
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.391873] [galcore] enter gpu_resume
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.396056] [galcore] exit gpu_resume, return 0
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.396056] sdhci_wakeup_irq
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.396070] sdhci_wakeup_irq
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.396072] sdhci_wakeup_irq
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 188.396074] sdhci_wakeup_irq
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 198.341764] mmc0: Timeout waiting for hardware interrupt.
> > May 26 07:44:33 xo-96-6d-f4 kernel: [ 198.341784] mwifiex_sdio mmc0:0001:1: read mp_regs failed
>
> I was expecting that mwifiex_sdio_resume handler is called before
> the SDIO interrupt function is called.
This does not happen. The SDIO interrupt function is always called
before the mwifiex_sdio_resume handler.
Method to test:
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -712,6 +712,9 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
u32 sdio_ireg;
unsigned long flags;
+ if (adapter->is_suspended)
+ dev_warn(adapter->dev, "interrupt while adapter is suspended\n");
+
if (mwifiex_read_data_sync(adapter, card->mp_regs, MAX_MP_REGS,
REG_PORT | MWIFIEX_SDIO_BYTE_MODE_MASK,
0)) {
# grep -c "after resume" /var/log/messages
630
# grep -c "interrupt while adapter" /var/log/messages
630
Also, sometimes mwifiex_sdio_suspend runs while an SDIO register
operation is in progress, because of an interrupt. I can reduce the
frequency of the "mmc0: Timeout..." if I delay suspend until the
register option is completed.
This occurs roughly 3 out of 630 suspends.
The platform is not SMP, even though it is mmp3. So I made an
unpleasant hack:
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -54,6 +54,8 @@ static DEFINE_RATELIMIT_STATE(noskb_rs,
120 * HZ,
1);
+volatile static bool in_progress;
+
/*
* SDIO probe.
*
@@ -206,6 +208,22 @@ static int mwifiex_sdio_suspend(struct device *dev)
struct mwifiex_adapter *adapter;
mmc_pm_flag_t pm_flag = 0;
int ret = 0;
+ int i;
+
+ /* an attempt to avoid suspend for a short time while sdio i/o is in progress */
+ if (in_progress) {
+ pr_err("suspend: sdio i/o is in_progress, delaying\n");
+ WARN_ON_ONCE(1);
+
+ i = 50;
+ while (in_progress && i-- > 0) msleep(10);
+
+ if (in_progress) {
+ pr_err("suspend: sdio i/o was in_progress\n");
+ WARN_ON_ONCE(1);
+ return -EFAULT;
+ }
+ }
if (mwifiex_always_poweroff_on_sleep)
return -ENOSYS;
@@ -291,7 +309,9 @@ static int
mwifiex_write_reg_locked(struct sdio_func *func, u32 reg, u8 data)
{
int ret = -1;
+ in_progress = true;
sdio_writeb(func, data, reg, &ret);
+ in_progress = false;
return ret;
}
@@ -321,9 +341,11 @@ mwifiex_read_reg(struct mwifiex_adapter *adapter, u32 reg, u32 *data)
int ret = -1;
u8 val;
+ in_progress = true;
sdio_claim_host(card->func);
val = sdio_readb(card->func, reg, &ret);
sdio_release_host(card->func);
+ in_progress = false;
*data = val;
@@ -356,6 +378,8 @@ mwifiex_write_data_sync(struct mwifiex_adapter *adapter,
return -1;
}
+ in_progress = true;
+
sdio_claim_host(card->func);
if (!sdio_writesb(card->func, ioport, buffer, blk_cnt * blk_size))
@@ -363,6 +387,8 @@ mwifiex_write_data_sync(struct mwifiex_adapter *adapter,
sdio_release_host(card->func);
+ in_progress = false;
+
return ret;
}
@@ -381,6 +407,8 @@ static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter, u8 *buffer,
: len;
u32 ioport = (port & MWIFIEX_SDIO_IO_PORT_MASK);
+ in_progress = true;
+
if (claim)
sdio_claim_host(card->func);
@@ -390,6 +418,8 @@ static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter, u8 *buffer,
if (claim)
sdio_release_host(card->func);
+ in_progress = false;
+
return ret;
}
@@ -1889,6 +1919,7 @@ mwifiex_sdio_init_module(void)
/* Clear the flag in case user removes the card. */
user_rmmod = 0;
+ in_progress = false;
return sdio_register_driver(&mwifiex_sdio);
}
--
James Cameron
http://quozl.linux.org.au/
next prev parent reply other threads:[~2014-05-29 1:22 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-16 1:24 [RFC] mwifiex: block work queue while suspended James Cameron
2014-05-22 3:50 ` Bing Zhao
2014-05-22 5:46 ` James Cameron
2014-05-23 4:12 ` Bing Zhao
2014-05-26 8:01 ` James Cameron
2014-05-27 23:39 ` Bing Zhao
2014-05-28 2:01 ` James Cameron
2014-05-28 4:35 ` Bing Zhao
2014-05-28 4:49 ` James Cameron
2014-05-28 5:04 ` Bing Zhao
2014-05-29 1:22 ` James Cameron [this message]
2014-05-29 2:10 ` Bing Zhao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140529012233.GC10000@us.netrek.org \
--to=quozl@laptop.org \
--cc=bzhao@marvell.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).