如何停止Linux 4.19内核中eMMC的CQE恢复?
解决方案
你的方案可行性分析
- MMC_CQE_RECOVERY_TIMEOUT 参数:该值是内核编译时定义的宏,并非可动态配置的内核命令行参数,预编译内核无法通过启动参数修改,此方案不可行。
- 用户态调用
mmc_cqe_request_done:mmc_cqe_request_done是内核态专属函数,用户态程序无法直接获取内核中的struct mmc_host和struct mmc_request结构体指针,mknod仅能创建设备文件,无法提供这些内核对象的访问入口,此方案也不可行。
无需修改内核源码的可行方法
方法1:通过内核命令行禁用CQE功能
Linux 4.19的MMC子系统支持通过内核启动参数全局禁用CQE,避免触发恢复流程:
- 在启动配置(如GRUB、U-Boot的
bootargs)中添加参数:mmc.cqe_disable=1 - 若需针对特定MMC主机禁用,可使用:
mmc_host.<host_num>.cqe_disable=1(将<host_num>替换为实际主机编号,如mmc_host.0.cqe_disable=1) - 重启系统后生效,此时eMMC将使用传统的非CQE路径,不会出现"running CQE recovery"提示。
方法2:运行时通过sysfs动态禁用CQE
无需重启,可在系统运行时通过sysfs节点调整:
- 找到对应eMMC主机的sysfs目录,通常位于
/sys/class/mmc_host/mmcX/(X为主机编号,可通过ls /sys/class/mmc_host/查看) - 检查目录下是否存在
cqe_disable或cqhci_enable文件:- 若存在
cqe_disable,执行:echo 1 > /sys/class/mmc_host/mmcX/cqe_disable - 若存在
cqhci_enable,执行:echo 0 > /sys/class/mmc_host/mmcX/cqhci_enable
- 若存在
- 执行上述命令后,重新以读写模式挂载分区即可。
内容的提问来源于stack exchange,提问作者Bret Joseph
相关产品推荐
相关产品推荐

