From daniel at zonque.org  Wed Aug 20 06:41:48 2014
From: daniel at zonque.org (Daniel Mack)
Date: Wed, 20 Aug 2014 15:41:48 +0200
Subject: libertas_sdio and pxamci suspend issue
Message-ID: <53F4A59C.60403@zonque.org>

Hi,

I'm currently updating the kernel of a PXA3xx platform that used to be
bases on 3.0. On that, a libertas is connected to the PXA mci controller
via SDIO.

The card itself works fine on both the old version and 3.16, but on
3.16, I see the following error when trying to put the system to suspend:

[   13.459502] mmc0: new SDIO card at address 0001
[   15.103333] libertas_sdio: Libertas SDIO driver
[   15.107864] libertas_sdio: Copyright Pierre Ossman
[   15.660291] libertas_sdio mmc0:0001:1 (unregistered net_device):
00:19:88:21:f6:22, fw 9.70.20p0, cap 0x00000303
[   15.675960] libertas_sdio mmc0:0001:1 wlan0: Marvell WLAN 802.11 adapter
[   15.684075] cfg80211: Calling CRDA to update world regulatory domain

# echo mem >/sys/power/state
[   18.617456] PM: Syncing filesystems ... done.
[   18.634231] Freezing user space processes ... (elapsed 0.000 seconds)
done.
[   18.641312] Freezing remaining freezable tasks ... (elapsed 0.007
seconds) done.
[   18.658322] dpm_run_callback(): pm_generic_suspend+0x0/0x38 returns -38
[   18.665136] PM: Device mmc0:0001:1 failed to suspend: error -38
[   18.671035] PM: Some devices failed to suspend, or early wake event
detected


The problem is caused by libertas' if_sdio_suspend() returning -ENOSYS here:

       /* If we're powered off anyway, just let the mmc layer remove the
         * card. */
        if (!lbs_iface_active(card->priv))
                return -ENOSYS;


According to the comment, the code assumes the function is called from
the mmc layer, which isn't the case - the stack trace leading to this
function looks like this:

[   15.767603] [<bf019048>] (if_sdio_suspend [libertas_sdio]) from
[<c0285980>] (pm_generic_suspend+0x2c/0x38)
[   15.779843] [<c0285980>] (pm_generic_suspend) from [<c0286c1c>]
(dpm_run_callback.isra.21+0x18/0x44)
[   15.790863] [<c0286c1c>] (dpm_run_callback.isra.21) from [<c0287cdc>]
(__device_suspend+0x148/0x220)
[   15.800039] [<c0287cdc>] (__device_suspend) from [<c0288478>]
(dpm_suspend+0xa8/0x204)
[   15.808464] [<c0288478>] (dpm_suspend) from [<c00410c8>]
(suspend_devices_and_enter+0x3c/0x300)
[   15.817858] [<c00410c8>] (suspend_devices_and_enter) from
[<c0041458>] (pm_suspend+0xcc/0x1b0)
[   15.827037] [<c0041458>] (pm_suspend) from [<c0040360>]
(state_store+0xb8/0xdc)
[   15.834678] [<c0040360>] (state_store) from [<c022891c>]
(kobj_attr_store+0x14/0x20)
[   15.842664] [<c022891c>] (kobj_attr_store) from [<c00ebcc0>]
(sysfs_kf_write+0x3c/0x48)
[   15.851209] [<c00ebcc0>] (sysfs_kf_write) from [<c00eaed8>]
(kernfs_fop_write+0x100/0x158)
[   15.860039] [<c00eaed8>] (kernfs_fop_write) from [<c009766c>]
(vfs_write+0xb4/0x188)
[   15.868335] [<c009766c>] (vfs_write) from [<c0097bec>]
(SyS_write+0x3c/0x7c)
[   15.875949] [<c0097bec>] (SyS_write) from [<c00092e0>]
(ret_fast_syscall+0x0/0x2c)


Bisecting is tricky due to other details unfortunately.

Any ideas?


Thanks,
Daniel


From ulf.hansson at linaro.org  Wed Aug 20 06:57:49 2014
From: ulf.hansson at linaro.org (Ulf Hansson)
Date: Wed, 20 Aug 2014 15:57:49 +0200
Subject: libertas_sdio and pxamci suspend issue
In-Reply-To: <53F4A59C.60403@zonque.org>
References: <53F4A59C.60403@zonque.org>
Message-ID: <CAPDyKFoEDg7H5uMrw-hVCbKcY6LHBdKJq9uwSLz1F3C1f3u0=w@mail.gmail.com>

On 20 August 2014 15:41, Daniel Mack <daniel at zonque.org> wrote:
> Hi,
>
> I'm currently updating the kernel of a PXA3xx platform that used to be
> bases on 3.0. On that, a libertas is connected to the PXA mci controller
> via SDIO.
>
> The card itself works fine on both the old version and 3.16, but on
> 3.16, I see the following error when trying to put the system to suspend:
>
> [   13.459502] mmc0: new SDIO card at address 0001
> [   15.103333] libertas_sdio: Libertas SDIO driver
> [   15.107864] libertas_sdio: Copyright Pierre Ossman
> [   15.660291] libertas_sdio mmc0:0001:1 (unregistered net_device):
> 00:19:88:21:f6:22, fw 9.70.20p0, cap 0x00000303
> [   15.675960] libertas_sdio mmc0:0001:1 wlan0: Marvell WLAN 802.11 adapter
> [   15.684075] cfg80211: Calling CRDA to update world regulatory domain
>
> # echo mem >/sys/power/state
> [   18.617456] PM: Syncing filesystems ... done.
> [   18.634231] Freezing user space processes ... (elapsed 0.000 seconds)
> done.
> [   18.641312] Freezing remaining freezable tasks ... (elapsed 0.007
> seconds) done.
> [   18.658322] dpm_run_callback(): pm_generic_suspend+0x0/0x38 returns -38
> [   18.665136] PM: Device mmc0:0001:1 failed to suspend: error -38
> [   18.671035] PM: Some devices failed to suspend, or early wake event
> detected
>
>
> The problem is caused by libertas' if_sdio_suspend() returning -ENOSYS here:
>
>        /* If we're powered off anyway, just let the mmc layer remove the
>          * card. */
>         if (!lbs_iface_active(card->priv))
>                 return -ENOSYS;

This has changed. All sdio func driver's must not return an error code
from it's ->suspend callback, unless it actually found an error and
thus want to prevent suspend.

What's important for sdio func drivers is to flush any outstanding
requests and prevent further request from being sent using the SDIO
API. At resume, those shall start to allow requests again.

I thought I sent a patches for the few affected sdio drivers that
needed to adopt, but it seems like I missed it, sorry!

I will have a look at it the next few days, appreciate if you are able
to help out testing, I don't have any HW using libertas_sdio.

Kind regards
Uffe

>
>
> According to the comment, the code assumes the function is called from
> the mmc layer, which isn't the case - the stack trace leading to this
> function looks like this:
>
> [   15.767603] [<bf019048>] (if_sdio_suspend [libertas_sdio]) from
> [<c0285980>] (pm_generic_suspend+0x2c/0x38)
> [   15.779843] [<c0285980>] (pm_generic_suspend) from [<c0286c1c>]
> (dpm_run_callback.isra.21+0x18/0x44)
> [   15.790863] [<c0286c1c>] (dpm_run_callback.isra.21) from [<c0287cdc>]
> (__device_suspend+0x148/0x220)
> [   15.800039] [<c0287cdc>] (__device_suspend) from [<c0288478>]
> (dpm_suspend+0xa8/0x204)
> [   15.808464] [<c0288478>] (dpm_suspend) from [<c00410c8>]
> (suspend_devices_and_enter+0x3c/0x300)
> [   15.817858] [<c00410c8>] (suspend_devices_and_enter) from
> [<c0041458>] (pm_suspend+0xcc/0x1b0)
> [   15.827037] [<c0041458>] (pm_suspend) from [<c0040360>]
> (state_store+0xb8/0xdc)
> [   15.834678] [<c0040360>] (state_store) from [<c022891c>]
> (kobj_attr_store+0x14/0x20)
> [   15.842664] [<c022891c>] (kobj_attr_store) from [<c00ebcc0>]
> (sysfs_kf_write+0x3c/0x48)
> [   15.851209] [<c00ebcc0>] (sysfs_kf_write) from [<c00eaed8>]
> (kernfs_fop_write+0x100/0x158)
> [   15.860039] [<c00eaed8>] (kernfs_fop_write) from [<c009766c>]
> (vfs_write+0xb4/0x188)
> [   15.868335] [<c009766c>] (vfs_write) from [<c0097bec>]
> (SyS_write+0x3c/0x7c)
> [   15.875949] [<c0097bec>] (SyS_write) from [<c00092e0>]
> (ret_fast_syscall+0x0/0x2c)
>
>
> Bisecting is tricky due to other details unfortunately.
>
> Any ideas?
>
>
> Thanks,
> Daniel
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


