mmc rescan是mmc host的detect work的功能函数,该函数用于探测目标卡的类型并且根据mmc/sd/sdio协议进行comm的初始化。

void mmc_rescan(struct work_struct *work)
{static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };struct mmc_host *host =container_of(work, struct mmc_host, detect.work);int i;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);//这里所做的事情:当我们进入delay work时,我们首先要检查一下,目标卡是否依然存在,如果仍然存在而且目标卡是可插拔的,那么我们需要先将该卡在内核留下的一些痕迹清除,重新探测该卡。所以一般如果是目标卡复位的话,一般是调用内核提供的专用的复位接口(如sdio_reset_comm等),而不是调度host的这个delay work,host->detect_change = 0;/* If the card was removed the bus will be marked* as dead - extend the wakelock so userspace* can respond */if (host->bus_dead)extend_wakelock = 1;/** Let mmc_bus_put() free the bus/bus_ops if we've found that* the card is no longer present.*/mmc_bus_put(host);mmc_bus_get(host);/* if there still is a card present, stop here */if (host->bus_ops != NULL) { //判断是否bus的引用计数是否为0,如果不为0 ,说明bus仍然被引用,不能再继续下面的探测了。mmc_bus_put(host);goto out;}/** Only we can add a new handler, so it's safe to* release the lock here.*/mmc_bus_put(host);if (host->ops->get_cd && host->ops->get_cd(host) == 0)goto out;mmc_claim_host(host);for (i = 0; i < ARRAY_SIZE(freqs); i++) {if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min))) {extend_wakelock = true;break;}if (freqs[i] <= host->f_min)break;}mmc_release_host(host);out:if (extend_wakelock)wake_lock_timeout(&host->detect_wake_lock, HZ / 2);elsewake_unlock(&host->detect_wake_lock);if (host->caps & MMC_CAP_NEEDS_POLL) {wake_lock(&host->detect_wake_lock);mmc_schedule_delayed_work(&host->detect, HZ);}
}

mmc rescan简析相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  3. 基于libmad库的MP3解码简析

    基于libmad库的MP3解码简析  MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...

  4. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  5. Python源码学习:内建类型简析并简析int对象

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇文章中已经大致分析了下,Python的启动执行流程,现在我们分析一下Pytho ...

  6. Python源码学习:启动流程简析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> Python简介: python主要是动态语言,虽然Python语言也有编译,生成中 ...

  7. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想 http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇 ...

  8. ceph存储原理_Ceph存储引擎BlueStore简析

    前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...

  9. Android Jetpack组件App Startup简析

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  10. Webpack模块化原理简析

    webpack模块化原理简析 1.webpack的核心原理 一切皆模块:在webpack中,css,html.js,静态资源文件等都可以视作模块:便于管理,利于重复利用: 按需加载:进行代码分割,实现 ...

最新文章

  1. 浏览器及时感知服务端数据变化的方式
  2. double free or corruption (fasttop)
  3. Reactive Streams
  4. 科沃斯机器人双十一全渠道成交额超7亿 两大爆款单品携手破亿
  5. 程序员面试题精选100题(43)-n个骰子的点数[算法]
  6. Rancher upgrade webhook之CI/CD
  7. 前沿分享|阿里云数据库解决方案资深专家 李圣陶:云原生数据库解决方案 加速企业国产化升级
  8. java servlet 输出_JavaWeb中servlet读取配置文件的方式
  9. 使用log4j2打印mybatis的sql执行日志
  10. Address already in use: JVM_Bindnull:8080
  11. Android实现计算器布局(相对布局)
  12. 多媒体计算机教室的使用与管理,焦作师范高等专科学校多媒体教室使用管理规定...
  13. AndroidStudio一键国际化方案
  14. HTML5 Canvas API详解
  15. 【期刊会议】机器学习深度学习 + 计算机视觉(To be continued..)
  16. 01.【设计模式】工厂模式
  17. Linux Capability探索实验
  18. 计算机网络实训报告总结,学习计算机网络的实训总结
  19. 实践材料1(感谢刘望的翻译)
  20. 快速查询出中通快运物流信息,将信息导出EXCEL表格

热门文章

  1. 利用openFrameWork、ofxFaceTrack制作的虚拟眼镜加载系统
  2. android adb安装 apk,adb 安装并运行 apk
  3. python截图并识别文字
  4. 从iRedMail 创建web服务学习Nginx
  5. 大文件上传插件webupload插件
  6. 手把手教你php调用短信接口(smsapi)实现发送短信验证码
  7. 【第三方互联】2、创建腾讯QQ互联应用
  8. python语言的多行注释以什么开头_python实现多行注释的方法
  9. 用这本书《现在,发现你的优势》,识别了自己的典型优势
  10. rs485的1:n计算机连接和n:n的主从plc通讯,富士人机界面与GE90-70 PLC N:1通讯在轧钢生产线的应用...