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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.