sdio card休眠处理 sdio card removed解决办法

最近调试几款sdio card suspend时都会出现sdio card removed,之后

要么死机要么模块不能正常工作,根本原因也就是休眠没有处理好。

昨天在博通网卡上终于找到了解决方法。

1:host端需要设置nonremovable,软件设置:mmc->caps |=

MMC_CAP_NONREMOVABLE;

2:host端需要设置keep power,在sdio card suspend时 软件设

置:host->pm_flags | = MMC_PM_KEEP_POWER;

目前我所接触到的4g网卡,博通网卡,sdio加密t卡等都会出现card

removed问题。

关于2补充下需要在sdio card pm中置host keep power:

static int XXX_suspend(struct device *pdev)

{

struct sdio_func *func = dev_to_sdio_func(pdev);

/* keep power while host suspended */

ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);

if (ret) {

sd_err(("%s: error while trying to keep power\n", __FUNCTION__));

return ret;

}

return 0;

}

static const struct dev_pm_ops XXX_pm_ops = {

.suspend    = XXX_suspend,

.resume        = XXX_resume,

};

今天花了点时间理清了card removed的原因。

出现1错误的原因是在resume 时pm_notify调用到了msm_rescan,如果没

有置nonremovable,将会跑进detect,而进去就会detect出了card removed,

进而进行了移除操作。

void mmc_rescan(struct work_struct *work)

{

struct mmc_host *host =

container_of(work, struct mmc_host, detect.work);

bool extend_wakelock = false;

if (host->rescan_disable)

return;

mmc_bus_get(host);

/*

* if there is a _removable_ card registered, check whether it is

* still present

*/

if (host->bus_ops && host->bus_ops->detect && !host->bus_dead

&& !(host->caps & MMC_CAP_NONREMOVABLE))

host->bus_ops->detect(host);

---------

}

下面是dump_stack()打印的调用信息:

<4>[   48.709320] [<c0013d4c>] (unwind_backtrace+0x0/0x11c) from

[<bf011d74>] (dhdsdio_disconnect+0xc/0x10c [bcmdhd])

<4>[   48.720214] [<bf011d74>] (dhdsdio_disconnect+0xc/0x10c [bcmdhd])

from [<bf01f9a8>] (bcmsdh_remove+0x1c/0x98 [bcmdhd])

<4>[   48.730041] [<bf01f9a8>] (bcmsdh_remove+0x1c/0x98 [bcmdhd]) from

[<bf001a00>] (bcmsdh_sdmmc_remove+0x28/0x70 [bcmdhd])

<4>[   48.740600] [<bf001a00>] (bcmsdh_sdmmc_remove+0x28/0x70 [bcmdhd])

from [<c05855e0>] (sdio_bus_remove+0x38/0xf0)

<4>[   48.753021] [<c05855e0>] (sdio_bus_remove+0x38/0xf0) from

[<c03a26c8>] (__device_release_driver+0x9c/0xe0)

<4>[   48.762725] [<c03a26c8>] (__device_release_driver+0x9c/0xe0) from

[<c03a2728>] (device_release_driver+0x1c/0x28)

<4>[   48.771881] [<c03a2728>] (device_release_driver+0x1c/0x28) from

[<c03a21f8>] (bus_remove_device+0x124/0x140)

<4>[   48.781829] [<c03a21f8>] (bus_remove_device+0x124/0x140) from

[<c039fe30>] (device_del+0x108/0x16c)

<4>[   48.790802] [<c039fe30>] (device_del+0x108/0x16c) from

[<c058596c>] (sdio_remove_func+0x1c/0x28)

<4>[   48.799560] [<c058596c>] (sdio_remove_func+0x1c/0x28) from

[<c0584bfc>] (mmc_sdio_remove+0x3c/0x68)

<4>[   48.808593] [<c0584bfc>] (mmc_sdio_remove+0x3c/0x68) from

[<c0584cb4>] (mmc_sdio_detect+0x8c/0xb4)

<4>[   48.817565] [<c0584cb4>] (mmc_sdio_detect+0x8c/0xb4) from

[<c057e0c8>] (mmc_rescan+0x7c/0x2d8)

<4>[   48.826141] [<c057e0c8>] (mmc_rescan+0x7c/0x2d8) from [<c0099dd8>]

(process_one_work+0x27c/0x484)

<4>[   48.834991] [<c0099dd8>] (process_one_work+0x27c/0x484) from

[<c009a1f0>] (worker_thread+0x210/0x3b0)

<4>[   48.844177] [<c009a1f0>] (worker_thread+0x210/0x3b0) from

[<c009e08c>] (kthread+0x80/0x8c)

<4>[   48.852355] [<c009e08c>] (kthread+0x80/0x8c) from [<c000eaa8>]

(kernel_thread_exit+0x0/0x8)

<6>[   49.083587] mmc2: card 0001 removed

出现2错误的原因是在sdio resume时,如果没有设置keep power就会

跑sdio reset与go idle(CMD 0)后进入init_card第一个CMD就不会响应了,也就是

这2个操作后card异常了。

static int mmc_sdio_resume(struct mmc_host *host)

{

int i, err = 0;

BUG_ON(!host);

BUG_ON(!host->card);

/* Basic card reinitialization. */

mmc_claim_host(host);

/* No need to reinitialize powered-resumed nonremovable cards */

if (mmc_card_is_removable(host) || !mmc_card_keep_power(host)) {

sdio_reset(host);

mmc_go_idle(host);

err = mmc_sdio_init_card(host, host->ocr, host->card,

mmc_card_keep_power(host));

---------

}

以下是dump_stack()打印信息:

<4>[   55.269378] [<c0013d4c>] (unwind_backtrace+0x0/0x11c) from

[<c057d650>] (mmc_resume_host+0xec/0x15c)

<4>[   55.269439] [<c057d650>] (mmc_resume_host+0xec/0x15c) from

[<c058bfdc>] (msmsdcc_runtime_resume+0xb8/0x17c)

<4>[   55.269500] [<c058bfdc>] (msmsdcc_runtime_resume+0xb8/0x17c) from

[<c058c2ac>] (msmsdcc_pm_resume+0x44/0xa8)

<4>[   55.269561] [<c058c2ac>] (msmsdcc_pm_resume+0x44/0xa8) from

[<c03a4074>] (platform_pm_resume+0x40/0x54)

<4>[   55.269653] [<c03a4074>] (platform_pm_resume+0x40/0x54) from

[<c03a8160>] (dpm_run_callback+0x44/0x7c)

<4>[   55.269683] [<c03a8160>] (dpm_run_callback+0x44/0x7c) from

[<c03a8c18>] (device_resume+0x140/0x184)

<4>[   55.269744] [<c03a8c18>] (device_resume+0x140/0x184) from

[<c03a94ec>] (dpm_resume+0xfc/0x234)

<4>[   55.269805] [<c03a94ec>] (dpm_resume+0xfc/0x234) from [<c03a97f0>]

(dpm_resume_end+0xc/0x18)

<4>[   55.269866] [<c03a97f0>] (dpm_resume_end+0xc/0x18) from

[<c00b63bc>] (suspend_devices_and_enter+0x240/0x314)

<4>[   55.269927] [<c00b63bc>] (suspend_devices_and_enter+0x240/0x314)

from [<c00b65b0>] (pm_suspend+0x120/0x200)

<4>[   55.269958] [<c00b65b0>] (pm_suspend+0x120/0x200) from

[<c00b7508>] (suspend+0x68/0x180)

<4>[   55.270019] [<c00b7508>] (suspend+0x68/0x180) from [<c0099dd8>]

(process_one_work+0x27c/0x484)

<4>[   55.270080] [<c0099dd8>] (process_one_work+0x27c/0x484) from

[<c009a1f0>] (worker_thread+0x210/0x3b0)

<4>[   55.270141] [<c009a1f0>] (worker_thread+0x210/0x3b0) from

[<c009e08c>] (kthread+0x80/0x8c)

<4>[   55.270202] [<c009e08c>] (kthread+0x80/0x8c) from [<c000eaa8>]

(kernel_thread_exit+0x0/0x8)

<4>[   55.270233] mmc2: error -110 during resume (card was removed?)

时间: 2024-12-13 10:14:22

sdio card休眠处理 sdio card removed解决办法的相关文章

liunx系统环境下,爆出该错误&quot;org.eclipse.wst.validation&quot; has been removed解决办法

导出maven工程遇到的问题,"org.eclipse.wst.validation" has been removed,还以为是工程本身的问题,后来发现是eclipse的问题. 解决办法:你项目的存放文件夹(工作空间)下的隐藏文件.metadata 把D:\kaola\kaolaWorkSpace\.metadata\.plugins\org.eclipse.core.runtime\.settings 下的org.eclipse.wst.validation.prefs 删除就可以

win10电脑休眠后无法唤醒的解决办法

电脑的休眠功能,为长时间不用的电脑进行了关闭显示.硬盘停转的深度节能模式,不仅节约能源,还保护设备. 但有些时候也会出现一些问题,如休眠后无法唤醒,无法移动鼠标,敲击键盘都无效,最后只能长按电源键来强制关机!!! 当你也遇到无法唤醒的问题时,可以尝试以下方法来解决. 电脑休眠后无法唤醒的因素一般有两个: 第一是系统硬件不兼容.不支持: 第二是系统设置原因导致. 第三是没有设置混合唤醒造成的. 我们先看看第一种系统硬件原因. 方式一: 在开始菜单[运行]对话框中输入cmd,进入命令提示符对话框 在

Ubuntu 18.04 休眠后无法唤醒的解决办法

1.检查是否安装了grep laptop-mode-tools 工具包 $ dpkg -l | grep laptop-mode-tools 如果执行命令无结果输出,表示未安装(如果已安装,忽略第2步) 2.安装laptop-mode 执行命令:$ sudo apt-get install laptop-mode-tools 安装完成后查看结果 3.判断Laptop是否启用了laptop_mode模式 如果显示结果为0,则表示未启动,如果为非0的数字则表示启动了 4.启动laptop_mode

php常见错误和解决办法

常见错误 --------- 1.错误提示:Call-time pass-by-reference has been removed 解决办法:php.ini 修改为allow_call_time_pass_reference=True --------- 解决办法二:修改代码 原因是因为 高版本php(5.4以上)不能通过fn1(&$a)这种方式传参调用函数.  正确应该是在定义是使用 &$var function fn1(& $var) { //other code} ----

DELL inspiron&#183;1420 装Win10系统休眠后再启动无法连Wifi解决办法

此页面禁止转载,违者必究!!! 解决办法: 打开电脑左下角Wifi和蓝牙的开关 将以下代码保存为“检查修复网络.bat文件”,双击运行,会出现一个管理员权限提示,点<是(Y)> 随便按一个键继续…… 会出现一行字“” 等待一会,出现“断网已重启,等待延时8秒...”后关闭窗口并打开系统右下角WLAN的开关==> 即可连接wifi @echo off pushd "%~dp0" >nul 2>&1 "%SYSTEMROOT%\system3

关于ubuntu16无线网卡RTL8723BE频繁掉线及信号不足的解决办法

最近在新电脑上装了ubuntu16,结果wifi经常连不上,连上了过段时间就掉线,路由器就在电脑的旁边,而且信号非常的若. 但是windows系统没有任何问题,所以就在网上找解决办法,也按照网上的方法试了,结果好多方法都是没用的. 最后从askubuntu上找到了解决方法. 首先要查看本机的无线网卡型号: 1 [email protected]:~$ lspci 2 00:00.0 Host bridge: Intel Corporation Broadwell-U Host Bridge -O

Windows Server+AMD GPU+HDMI时_黑边_不铺满问题的解决办法

HDMI接显示器或电视,有黑边或者被放大了是个很常见的问题,显卡设置界面里改下Scale或者Overscan/Underscan就行,可问题是WindowsServer版的CCC没有控制颜色对比度和缩放的那个界面. 不怕,直接改注册表就好. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{Your Card GUID}\0000]"TVEnableOverscan"=dword:00000000"Digi

在IntelliJ中运行Spark Demo时遇到的问题及解决办法

这一阶段主要是在学习Scala,知乎上说推荐先学习一下Haskell再学习Scala,但我觉得不一定要曲线救国.不过在学习过程中遇到的困难的确不少,好歹Scala是公认的其特性的复杂程度是要超过C++的嘛:-) 我学习Scala的主要动机是想研究Spark,尽管Python和Java等都可以用来开发Spark应用,但是Spark本身就是一个Scala项目,而且Spark也不能算是一个成熟的产品,也许在我遇到问题的时候用Scala可以更加高效的解决问题 今天初步看了部分Spark的官方文档,在In

DotNetCore.1.0.1-VS2015Tools.Preview2.0.2 安装错误分析及解决办法(so far)

折腾了这么多天总算弄完了,真恶心.为了让其他童靴避免掉进我遇到的坑里,我决定把最近遇到问题及其解决办法总结一下,希望对大家有帮助. 1.对于2016年8月份以前安装VS用户来说,可能不会那么迫切安装这个补丁,只要你不想玩dotnet core.但是对于最近刚刚重新安装了VS甚至OS的用户来说,这个补丁可以帮你解决IIS Express无法正常启动的问题. 2.其实这个安装包是一个在线安装工具,虽然只有几百KB,完整的内容却有500MB.而且因为最近微软网站存在证书问题,https协议下的所有内容