Libertas/SDIO deep sleep mode

Daniel Mack daniel at caiaq.de
Fri Jun 4 08:12:45 EDT 2010


Hi,

I read about the recently added features in the libertas driver to send
the chip to its deep-sleep mode when the system suspends, so the wakeup
phase is shortened.

I tried this with a recent 2.6.35-rc1 kernel on a PXA300 based design,
and this is what I get:


[    0.721643] Freezing user space processes ... (elapsed 0.01 seconds) done.
[    0.740588] Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
[    0.760687] Suspending console(s) (use no_console_suspend to debug)
[    0.879657] libertas: 00:19:88:3a:cb:ac, fw 9.70.3p36, cap 0x00000303
[    0.880567] ------------[ cut here ]------------
[    0.880622] WARNING: at drivers/base/power/main.c:101 device_pm_add+0x94/0xd8()
[    0.880639] Device: ieee80211
[    0.880646] Parentless device registered during a PM transaction (phy1)
[    0.880660] Modules linked in: eeti_ts libertas_sdio libertas pxamci ds2760_battery w1_ds2760 wire
[    0.880754] [<c00493a0>] (unwind_backtrace+0x0/0xec) from [<c0056db0>] (warn_slowpath_common+0x4c/0x7c)
[    0.880793] [<c0056db0>] (warn_slowpath_common+0x4c/0x7c) from [<c0056e74>] (warn_slowpath_fmt+0x30/0x40)
[    0.880829] [<c0056e74>] (warn_slowpath_fmt+0x30/0x40) from [<c01d4cc8>] (device_pm_add+0x94/0xd8)
[    0.880875] [<c01d4cc8>] (device_pm_add+0x94/0xd8) from [<c01ce4dc>] (device_add+0x350/0x510)
[    0.880910] [<c01ce4dc>] (device_add+0x350/0x510) from [<c032d500>] (wiphy_register+0x1ac/0x298)
[    0.881033] [<c032d500>] (wiphy_register+0x1ac/0x298) from [<bf0285dc>] (lbs_cfg_register+0x54/0x9c [libertas])
[    0.881142] [<bf0285dc>] (lbs_cfg_register+0x54/0x9c [libertas]) from [<bf02c228>] (lbs_start_card+0xa0/0x130 [libertas])
[    0.881226] [<bf02c228>] (lbs_start_card+0xa0/0x130 [libertas]) from [<bf040b94>] (if_sdio_probe+0x84c/0x954 [libertas_sdio])
[    0.881276] [<bf040b94>] (if_sdio_probe+0x84c/0x954 [libertas_sdio]) from [<c024fd98>] (sdio_bus_probe+0xcc/0xe8)
[    0.881322] [<c024fd98>] (sdio_bus_probe+0xcc/0xe8) from [<c01d069c>] (driver_probe_device+0xb4/0x198)
[    0.881359] [<c01d069c>] (driver_probe_device+0xb4/0x198) from [<c01cfc08>] (bus_for_each_drv+0x4c/0x8c)
[    0.881396] [<c01cfc08>] (bus_for_each_drv+0x4c/0x8c) from [<c01d08d4>] (device_attach+0x54/0x70)
[    0.881430] [<c01d08d4>] (device_attach+0x54/0x70) from [<c01cfa2c>] (bus_probe_device+0x28/0x50)
[    0.881464] [<c01cfa2c>] (bus_probe_device+0x28/0x50) from [<c01ce510>] (device_add+0x384/0x510)
[    0.881496] [<c01ce510>] (device_add+0x384/0x510) from [<c024fbd4>] (sdio_add_func+0x38/0x54)
[    0.881527] [<c024fbd4>] (sdio_add_func+0x38/0x54) from [<c024f28c>] (mmc_attach_sdio+0x21c/0x2a8)
[    0.881581] [<c024f28c>] (mmc_attach_sdio+0x21c/0x2a8) from [<c024b97c>] (mmc_rescan+0x1ec/0x28c)
[    0.881624] [<c024b97c>] (mmc_rescan+0x1ec/0x28c) from [<c0067a60>] (worker_thread+0x168/0x1f0)
[    0.881667] [<c0067a60>] (worker_thread+0x168/0x1f0) from [<c006abd8>] (kthread+0x78/0x80)
[    0.881720] [<c006abd8>] (kthread+0x78/0x80) from [<c00458bc>] (kernel_thread_exit+0x0/0x8)
[    0.881742] ---[ end trace 919a8d4b06013c07 ]---
[    0.884319] libertas: wlan0: Marvell WLAN 802.11 adapter
[    1.138756] mmc0: card 0001 removed
[    1.139448] PM: suspend of devices complete after 255.035 msecs
[    1.140076] PM: late suspend of devices complete after 0.598 msecs
[    0.000943] PM: early resume of devices complete after 0.634 msecs
[    0.060955] usb usb1: root hub lost power or was reset
[    0.136987] mmc0: new SDIO card at address 0001
[    0.137101] mmc mmc0:0001: parent mmc0 should not be sleeping
[    0.298199] PM: resume of devices complete after 297.118 msecs
[    0.571350] Restarting tasks ... 
[    0.768454] done.
[    1.179764] libertas: 00:19:88:3a:cb:ac, fw 9.70.3p36, cap 0x00000303
[    1.198354] libertas: wlan0: Marvell WLAN 802.11 adapter


Also, the 8686's supply voltage (which is controlled via a regulator in
the pxamci code) drops to zero during the suspend phase.

Here are some questions that I have about this:

* The "Parentless device registered during a PM transaction" looks like
  a bug to me. Note that I added kobject_name(&dev->kobj) to the output
  to get a clue about what's going on.

* The firmware survives the suspend/resume transition and works fine
  after that. I just wonder why, as the voltage was switched off?

* I believe that if we need to keep the power switched on, there should
  be a call to sdio_set_host_pm_flags(MMC_PM_KEEP_POWER) somewhere in
  the libertas_sdio layer, right? How should the pxamci core get to
  know it shouldn't switch off its regulator?

* Should the message about mmc0 which should not be sleeping go away
  once the other issues are solved?


Thanks,
Daniel




More information about the linux-arm-kernel mailing list