Skip to contentSkip to conversation

[Regression: mmc: sdhci-esdhc-imx: add runtime pm support]

Regression: mmc: sdhci-esdhc-imx: add runtime pm support Martin Fuzzey 5 participants 8 messages Feb 6, 2014 – Jul 1, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hello all,

since

commit 89d7e5c131228a8f0d8b0cb48b459c62152bf620

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:29 2013 +0800

mmc: sdhci-esdhc-imx: add runtime pm support

My SDIO wifi module (WiiBear n modue based on Marvel 8787 chipset) using mainline mwifiex driver is no longer working:

[   33.465577] mwifiex_sdio mmc2:0001:1: mwifiex_cmd_timeout_func: Timeout cmd id (7242618.212205) = 0xa9, act = 0x0
[   33.475944] mwifiex_sdio mmc2:0001:1: num_data_h2c_failure = 0
[   33.481793] mwifiex_sdio mmc2:0001:1: num_cmd_h2c_failure = 0
[   33.487599] mwifiex_sdio mmc2:0001:1: num_cmd_timeout = 1
[   33.493010] mwifiex_sdio mmc2:0001:1: num_tx_timeout = 0
[   33.498371] mwifiex_sdio mmc2:0001:1: last_cmd_index = 1
[   33.503693] mwifiex_sdio mmc2:0001:1: last_cmd_id: 00 00 a9 00 00 00 00 00 00 00
[   33.511137] mwifiex_sdio mmc2:0001:1: last_cmd_act: 00 00 00 00 00 00 00 00 00 00
[   33.518660] mwifiex_sdio mmc2:0001:1: last_cmd_resp_index = 0
[   33.524417] mwifiex_sdio mmc2:0001:1: last_cmd_resp_id: 00 00 00 00 00 00 00 00 00 00
[   33.532301] mwifiex_sdio mmc2:0001:1: last_event_index = 0
[   33.537825] mwifiex_sdio mmc2:0001:1: last_event: 00 00 00 00 00 00 00 00 00 00
[   33.545164] mwifiex_sdio mmc2:0001:1: data_sent=1 cmd_sent=1
[   33.550863] mwifiex_sdio mmc2:0001:1: ps_mode=0 ps_state=0
[   33.556425] mwifiex_sdio mmc2:0001:1: cmd timeout
[   33.572375] mwifiex_sdio: Resetting card...
[   33.728913] mmc2: card 0001 removed

Increasing the autosuspend delay from 50ms to 500ms fixes the problem.

This is using an i.MX53 SOC

This is on 3.13 cherrypicking from mainline this patch and these two supporting patches:

commit d433dc63182825538b85de6a85e2ea3fad7f2917

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:25 2013 +0800

mmc: sdhci-pltfm: export pltfm suspend/resume api

commit ce090a4eb9626272bfd2529520f2f16351029640

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:28 2013 +0800

mmc: sdhci-esdhc-imx: fix runtime pm unbalance issue

Cheers,

Martin

#1 lore raw

Hi Martin,

Quoted 5 lines · Martin Fuzzey

Hello all,

since

commit 89d7e5c131228a8f0d8b0cb48b459c62152bf620

Quoted 9 lines
Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:29 2013 +0800

mmc: sdhci-esdhc-imx: add runtime pm support

My SDIO wifi module (WiiBear n modue based on Marvel 8787 chipset) using mainline mwifiex driver is no longer working:

Some SDIO cards may not be able to work well without clock.

Can you try the following patch to see if it works?

commit d9d062627407f714ba326fa8dd6e8aa20199fdbe

Author: Dong Aisheng <[email protected]>
Date:   Fri Nov 15 17:54:36 2013 +0800

mmc: sdhci: get runtime pm when sdio irq is enabled

SDIO cards may need clock to send the card interrupt to host. Thus, we get runtime pm when sdio irq is enabled to prevent the clock resource is released and put it when sdio irq is disabled.

drivers/mmc/host/sdhci.c +0 -0
index 9ddef47..f892757 100644
@@ -1734,9 +1734,15 @@ static void sdhci_enable_sdio_irq(struct

mmc_host *mmc, int enable)

        struct sdhci_host *host = mmc_priv(mmc);
        unsigned long flags;

+ if (enable)
+ sdhci_runtime_pm_get(host);
+

        spin_lock_irqsave(&host->lock, flags);
        sdhci_enable_sdio_irq_nolock(host, enable);
        spin_unlock_irqrestore(&host->lock, flags);

+
+ if (!enable)
+ sdhci_runtime_pm_put(host);
}

static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host,

Regards
Dong Aisheng

Quoted 54 lines
[   33.465577] mwifiex_sdio mmc2:0001:1: mwifiex_cmd_timeout_func: Timeout
cmd id (7242618.212205) = 0xa9, act = 0x0
[   33.475944] mwifiex_sdio mmc2:0001:1: num_data_h2c_failure = 0
[   33.481793] mwifiex_sdio mmc2:0001:1: num_cmd_h2c_failure = 0
[   33.487599] mwifiex_sdio mmc2:0001:1: num_cmd_timeout = 1
[   33.493010] mwifiex_sdio mmc2:0001:1: num_tx_timeout = 0
[   33.498371] mwifiex_sdio mmc2:0001:1: last_cmd_index = 1
[   33.503693] mwifiex_sdio mmc2:0001:1: last_cmd_id: 00 00 a9 00 00 00 00
00 00 00
[   33.511137] mwifiex_sdio mmc2:0001:1: last_cmd_act: 00 00 00 00 00 00 00
00 00 00
[   33.518660] mwifiex_sdio mmc2:0001:1: last_cmd_resp_index = 0
[   33.524417] mwifiex_sdio mmc2:0001:1: last_cmd_resp_id: 00 00 00 00 00 00
00 00 00 00
[   33.532301] mwifiex_sdio mmc2:0001:1: last_event_index = 0
[   33.537825] mwifiex_sdio mmc2:0001:1: last_event: 00 00 00 00 00 00 00 00
00 00
[   33.545164] mwifiex_sdio mmc2:0001:1: data_sent=1 cmd_sent=1
[   33.550863] mwifiex_sdio mmc2:0001:1: ps_mode=0 ps_state=0
[   33.556425] mwifiex_sdio mmc2:0001:1: cmd timeout
[   33.572375] mwifiex_sdio: Resetting card...
[   33.728913] mmc2: card 0001 removed

Increasing the autosuspend delay from 50ms to 500ms fixes the problem.

This is using an i.MX53 SOC

This is on 3.13 cherrypicking from mainline this patch and these two supporting patches:

commit d433dc63182825538b85de6a85e2ea3fad7f2917

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:25 2013 +0800

mmc: sdhci-pltfm: export pltfm suspend/resume api

commit ce090a4eb9626272bfd2529520f2f16351029640

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:28 2013 +0800

mmc: sdhci-esdhc-imx: fix runtime pm unbalance issue

Cheers,

Martin

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw
Quoted 11 lines · Dong Aisheng

Hi Martin,

Quoted 8 lines · Martin Fuzzey

Hello all,

since

commit 89d7e5c131228a8f0d8b0cb48b459c62152bf620

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:29 2013 +0800
Quoted 9 lines
Quoted 6 lines

mmc: sdhci-esdhc-imx: add runtime pm support

My SDIO wifi module (WiiBear n modue based on Marvel 8787 chipset) using mainline mwifiex driver is no longer working:

Some SDIO cards may not be able to work well without clock.

Originally it is handled by the mmc clock gate framework.
See:
static bool mmc_host_may_gate_card(struct mmc_card *card)
{
/* If there is no card we may gate it */
if (!card)
return true;
/*
* Don't gate SDIO cards! These need to be clocked at all times
* since they may be independent systems generating interrupts
* and other events. The clock requests counter from the core will
* go down to zero since the core does not need it, but we will not
* gate the clock, because there is somebody out there that may still
* be using it.
*/
return !(card->quirks & MMC_QUIRK_BROKEN_CLK_GATING);
}
But Ulf proposed to remove clock gate framework since no one used it anymore and the patch was already sent in the mail list a few weeks ago. Then this may need to be handled by the host driver after adding rpm.

Regards
Dong Aisheng

Quoted 94 lines

Can you try the following patch to see if it works?

commit d9d062627407f714ba326fa8dd6e8aa20199fdbe

Author: Dong Aisheng <[email protected]>
Date:   Fri Nov 15 17:54:36 2013 +0800

mmc: sdhci: get runtime pm when sdio irq is enabled

SDIO cards may need clock to send the card interrupt to host. Thus, we get runtime pm when sdio irq is enabled to prevent the clock resource is released and put it when sdio irq is disabled.

drivers/mmc/host/sdhci.c +6 -0
index 9ddef47..f892757 100644
@@ -1734,9 +1734,15 @@ static void sdhci_enable_sdio_irq(struct
 mmc_host *mmc, int enable)
        struct sdhci_host *host = mmc_priv(mmc);
        unsigned long flags;
 
+       if (enable)
+               sdhci_runtime_pm_get(host);
+
        spin_lock_irqsave(&host->lock, flags);
        sdhci_enable_sdio_irq_nolock(host, enable);
        spin_unlock_irqrestore(&host->lock, flags);
+
+       if (!enable)
+               sdhci_runtime_pm_put(host);
 }
 

static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host,

Regards
Dong Aisheng

Quoted 54 lines
[   33.465577] mwifiex_sdio mmc2:0001:1: mwifiex_cmd_timeout_func: Timeout
cmd id (7242618.212205) = 0xa9, act = 0x0
[   33.475944] mwifiex_sdio mmc2:0001:1: num_data_h2c_failure = 0
[   33.481793] mwifiex_sdio mmc2:0001:1: num_cmd_h2c_failure = 0
[   33.487599] mwifiex_sdio mmc2:0001:1: num_cmd_timeout = 1
[   33.493010] mwifiex_sdio mmc2:0001:1: num_tx_timeout = 0
[   33.498371] mwifiex_sdio mmc2:0001:1: last_cmd_index = 1
[   33.503693] mwifiex_sdio mmc2:0001:1: last_cmd_id: 00 00 a9 00 00 00 00
00 00 00
[   33.511137] mwifiex_sdio mmc2:0001:1: last_cmd_act: 00 00 00 00 00 00 00
00 00 00
[   33.518660] mwifiex_sdio mmc2:0001:1: last_cmd_resp_index = 0
[   33.524417] mwifiex_sdio mmc2:0001:1: last_cmd_resp_id: 00 00 00 00 00 00
00 00 00 00
[   33.532301] mwifiex_sdio mmc2:0001:1: last_event_index = 0
[   33.537825] mwifiex_sdio mmc2:0001:1: last_event: 00 00 00 00 00 00 00 00
00 00
[   33.545164] mwifiex_sdio mmc2:0001:1: data_sent=1 cmd_sent=1
[   33.550863] mwifiex_sdio mmc2:0001:1: ps_mode=0 ps_state=0
[   33.556425] mwifiex_sdio mmc2:0001:1: cmd timeout
[   33.572375] mwifiex_sdio: Resetting card...
[   33.728913] mmc2: card 0001 removed

Increasing the autosuspend delay from 50ms to 500ms fixes the problem.

This is using an i.MX53 SOC

This is on 3.13 cherrypicking from mainline this patch and these two supporting patches:

commit d433dc63182825538b85de6a85e2ea3fad7f2917

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:25 2013 +0800

mmc: sdhci-pltfm: export pltfm suspend/resume api

commit ce090a4eb9626272bfd2529520f2f16351029640

Author: Dong Aisheng <[email protected]>
Date:   Mon Nov 4 16:38:28 2013 +0800

mmc: sdhci-esdhc-imx: fix runtime pm unbalance issue

Cheers,

Martin

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#3 lore raw

Hi Dong,

thank you for your rapid response.

Quoted 14 lines · Dong Aisheng

Some SDIO cards may not be able to work well without clock.

Originally it is handled by the mmc clock gate framework.
See:
static bool mmc_host_may_gate_card(struct mmc_card *card)
{
/* If there is no card we may gate it */
if (!card)
return true;
/*
* Don't gate SDIO cards! These need to be clocked at all times
* since they may be independent systems generating interrupts
* and other events. The clock requests counter from the core will
* go down to zero since the core does not need it, but we will not

Quoted 8 lines

* gate the clock, because there is somebody out there that may still
* be using it.
*/
return !(card->quirks & MMC_QUIRK_BROKEN_CLK_GATING);
}
But Ulf proposed to remove clock gate framework since no one used it anymore and the patch was already sent in the mail list a few weeks ago. Then this may need to be handled by the host driver after adding rpm.

Yes indeed the above code does nothing for the rpm case and it looks like it's on the way out anyway.

Quoted 34 lines
Quoted 34 lines

Can you try the following patch to see if it works?

commit d9d062627407f714ba326fa8dd6e8aa20199fdbe

Author: Dong Aisheng <[email protected]>
Date:   Fri Nov 15 17:54:36 2013 +0800

mmc: sdhci: get runtime pm when sdio irq is enabled

SDIO cards may need clock to send the card interrupt to host. Thus, we get runtime pm when sdio irq is enabled to prevent the clock resource is released and put it when sdio irq is disabled.

drivers/mmc/host/sdhci.c +6 -0
index 9ddef47..f892757 100644
@@ -1734,9 +1734,15 @@ static void sdhci_enable_sdio_irq(struct
 mmc_host *mmc, int enable)
         struct sdhci_host *host = mmc_priv(mmc);
         unsigned long flags;
 
+       if (enable)
+               sdhci_runtime_pm_get(host);
+
         spin_lock_irqsave(&host->lock, flags);
         sdhci_enable_sdio_irq_nolock(host, enable);
         spin_unlock_irqrestore(&host->lock, flags);
+
+       if (!enable)
+               sdhci_runtime_pm_put(host);
  }
 
Quoted 2 lines
Quoted 2 lines

static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host,

Yes that works fine for me thank you.

What is the status of this patch?

I see you wrote it in November but I can't find it in git or on the mailing list anywhere

Regards,

Martin

#4 lore raw

Hi Martin,

Quoted 78 lines · Martin Fuzzey

Hi Dong,

thank you for your rapid response.

Quoted 19 lines · Dong Aisheng

Some SDIO cards may not be able to work well without clock.

Originally it is handled by the mmc clock gate framework. See:
static bool mmc_host_may_gate_card(struct mmc_card *card)

{
         /* If there is no card we may gate it */
         if (!card)
                 return true;
         /*
          * Don't gate SDIO cards! These need to be clocked at all times
          * since they may be independent systems generating interrupts
          * and other events. The clock requests counter from the core

will
* go down to zero since the core does not need it, but we will
not
* gate the clock, because there is somebody out there that may
still

Quoted 8 lines
          * be using it.
          */
         return !(card->quirks & MMC_QUIRK_BROKEN_CLK_GATING);
}

But Ulf proposed to remove clock gate framework since no one used it anymore
and the patch was already sent in the mail list a few weeks ago. Then this may need to be handled by the host driver after adding rpm.

Yes indeed the above code does nothing for the rpm case and it looks like it's on the way out anyway.

Quoted 35 lines
Quoted 35 lines

Can you try the following patch to see if it works?

commit d9d062627407f714ba326fa8dd6e8aa20199fdbe

Author: Dong Aisheng <[email protected]>
Date:   Fri Nov 15 17:54:36 2013 +0800

mmc: sdhci: get runtime pm when sdio irq is enabled

SDIO cards may need clock to send the card interrupt to host. Thus, we get runtime pm when sdio irq is enabled to prevent the
clock
resource is released and put it when sdio irq is disabled.

drivers/mmc/host/sdhci.c +6 -0
index 9ddef47..f892757 100644
@@ -1734,9 +1734,15 @@ static void sdhci_enable_sdio_irq(struct
 mmc_host *mmc, int enable)
         struct sdhci_host *host = mmc_priv(mmc);
         unsigned long flags;
 
+       if (enable)
+               sdhci_runtime_pm_get(host);
+
         spin_lock_irqsave(&host->lock, flags);
         sdhci_enable_sdio_irq_nolock(host, enable);
         spin_unlock_irqrestore(&host->lock, flags);
+
+       if (!enable)
+               sdhci_runtime_pm_put(host);
  }
 
Quoted 3 lines
Quoted 3 lines

static int sdhci_do_start_signal_voltage_switch(struct sdhci_host
*host,

Yes that works fine for me thank you.

Quoted 5 lines

What is the status of this patch?

I see you wrote it in November but I can't find it in git or on the mailing list anywhere

Yes, i used it for freescale internal tree and still not upstreamed it yet. BTW, esdhc/usdhc also could not handle SDIO interrupts without clock currently. I will send out a formal patch with stable tree CCed in case others need it.

Regards
Dong Aisheng

Quoted 4 lines

Regards,

Martin

#5 lore raw
In reply to Dong Aisheng

Hey Dong,
<snip>

Quoted 1 line

Some SDIO cards may not be able to work well without clock.

I've been needing to use this particular patch on a BayTrail tablet with a Realtek 8723BS SDIO Wi-Fi chip to get Wi-Fi to be stable. This is using the most recent upstream Linus kernels as well. Is there any reason this particular patch did not get sent for merging?

Cheers

#6 lore raw
Quoted 6 lines · Bastien Nocera

Hey Dong,
<snip>

Quoted 1 line

Some SDIO cards may not be able to work well without clock.

I've been needing to use this particular patch on a BayTrail tablet with a Realtek 8723BS SDIO Wi-Fi chip to get Wi-Fi to be stable. This is using

I've got a Toshiba Click Mini which has that same WiFi. Whilst the driver works when build with kernel 4.1-release, it seems to make the system unstable.

#7 lore raw
In reply to Bastien Nocera
Quoted 6 lines · Bastien Nocera

Hey Dong,
<snip>

Quoted 1 line

Some SDIO cards may not be able to work well without clock.

I've been needing to use this particular patch on a BayTrail tablet with a Realtek 8723BS SDIO Wi-Fi chip to get Wi-Fi to be stable. This is using

I've got a Toshiba Click Mini which has that same WiFi. Whilst the driver works when build with kernel 4.1-release, it seems to make the system unstable.