​Linux kernel 驱动中,有不少驱动会引用到 EPROBE_DEFER 这个错误号。比如下面这个例子,对 devm_gpiod_get 的返回值进行判断,如果有错误且错误号不是 -EPRBOE_DEFER,才输出error log。

那么 EPRBOE_DEFER 有什么特别之处吗,需要驱动程序这样特意处理?这个与 kernel 设计的 driver-deferred-probe 机制有关。

kernel 下有多个独立的驱动,每个驱动或多或少地会引用到其他驱动提供的资源,比如某个外设驱动需要使用 gpio 资源,就会通过 gpio 驱动提供的函数接口去申请 gpio;但是当A驱动引用B驱动提供的资源时,B驱动可能还没有工作起来,为了解决驱动之间的这种依赖关系,kernel 设计了 driver-deferred-probe 机制:某个驱动在 probe 过程中,如果遇到依赖的资源还没有准备好,那么就返回 -EPRBOE_DEFER,kernel 检测到该驱动返回的是  -EPRBOE_DEFER,就会在过一段时间后让该驱动再次 probe。

driver-deferred-probe 流程如下图所示,有三条可能的路径

  • 生成新的 device 时

  • 注册新的 driver 时

  • later_initcall 主动再次触发

driver-deferred-probe 机制的核心数据结构与函数是:

  • deferred_probe_pending_list,用来记录哪些驱动被 deferred probe,并提供函数接口 driver_deferred_probe_add。

  • deferred_probe_work,用来调度相应的 work func 来执行 deferred probe 动作,并提供函数接口 driver_deferred_probe_trigger。

有了 driver-deferred-probe 机制后,编写驱动程序时,除了某些驱动有严格的执行次序,需要特意去定义 initcall 等级之外,一般的驱动则无需太过关心驱动间的依赖,从而在一定程度上简化了驱动开发。

以上就是对 EPRBOE_DEFER 的简要介绍。


作者:bigfish99

博客:https://www.cnblogs.com/bigfish0506/

公众号:大鱼嵌入式

Linux驱动中的EPROBE_DEFER是个啥的更多相关文章

  1. linux驱动中printk的使用注意事项

    今天在按键驱动中增加printk(KERN_INFO "gpio_keys_gpio_isr()\n");在驱动加载阶段可以输出调试信息,但驱动加载起来后的信息,在串口端看不到输出 ...

  2. Linux驱动中completion接口浅析(wait_for_complete例子,很好)【转】

    转自:http://blog.csdn.net/batoom/article/details/6298267 completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成.可以利用 ...

  3. Linux驱动中completion接口浅析(wait_for_complete例子,很好)

    completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成.可以利用下面的宏静态创建completion:                          DECLARE_CO ...

  4. 为什么linux驱动中变量或者函数都用static修饰?(知乎问题)

    static定义的全局变量 或函数也只能作用于当前的文件. 世界硬件厂商太多,定义static为了防止变量或 函数 重名,定义成static, 就算不同硬件驱动中的 变更 或函数重名了也没关系 .

  5. Linux驱动中常用的宏

    .module_i2c_driver(adxl34x_driver)展开为 static int __int adxl34x_driver_init(void) { return i2c_regist ...

  6. Linux驱动中的platform总线分析

    copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...

  7. Linux驱动中获取系统时间

    最近在做VoIP方面的驱动,总共有16个FXS口和FXO口依次初始化,耗用的时间较多.准备将其改为多线程,首先需要确定哪个环节消耗的时间多,这就需要获取系统时间. #include <linux ...

  8. linux内核驱动中对字符串的操作【转】

    转自:http://www.360doc.com/content/12/1224/10/3478092_255969530.shtml Linux内核中关于字符串的相关操作,首先包含头文件: #inc ...

  9. Linux 驱动框架---linux 设备

    Linux 设备 Linux驱动中的三大主要基础成员主要是设备,总线和驱动.今天先来从设备开始分析先把设备相关的数据结构放到这里方便后面看到来查,其中有些进行了简单的注释. struct device ...

随机推荐

  1. Asp.NetCore Web开发之初始文件解析

    在写代码之前,有必要了解一下.net帮我们生成的文件都是干什么用的,在开发过程中他们都负责那些地方(下面以MVC模板举例). 先简单介绍一下什么是MVC,MVC(model-view-controll ...

  2. C++ primer plus读书笔记——第8章 函数探幽

    第8章 函数探幽 1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来.因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存. 2. 要使用内 ...

  3. [xml模块、hashlib模块、subprocess模块、os与sys模块、configparser模块]

    [xml模块.hashlib模块.subprocess模块.os与sys模块.configparser模块] xml模块 XML:全称 可扩展标记语言,为了能够在不同的平台间继续数据的交换,使交换的数 ...

  4. volatile关键字的作用-respect

    volatile关键字的含义? volatile定义的变量可能会意外的改变,改变它的情况有很多(例如:操作系统,硬件,线程),编译就不会去假设这个值,也就是说每次访问这个变量时,系统就会小心翼翼的去从 ...

  5. jmeter自动停止监听--AutoStop Listener

    如下图:

  6. Debian 16.04 配置双网卡绑定bond

    Debian 16.04 配置双网卡绑定bond Debian 16.04 bonding多网卡配置 安装负载均衡软件 fenslave root@ubuntu:~# apt-get install ...

  7. Windows10查看电脑的USB接口是2.0还是3.0

    Windows10查看电脑的USB接口是2.0还是3.0原创小晓酱手记 最后发布于2019-08-22 16:09:48 阅读数 3662 收藏展开 同事要拷贝资料给我,问我电脑的USB接口是2.0还 ...

  8. dmidecode -t1 | egrep "Manufacturer|Product Name"

    # dmidecode -t1 | egrep "Manufacturer|Product Name" Manufacturer: Loongson Product Name: L ...

  9. REST 架构风格详解

    什么是 REST 架构风格 REST(Representational State Transfer)是表述性状态转移.分布式超媒体软件的一种架构风格,它基于使用 HTTP.URI 等现有的广泛流行的 ...

  10. TB6560步进电机驱动板

    极客工坊比较好的帖子: 关于驱动板的共阴极和共阳极接法 http://www.geek-workshop.com/thread-12695-1-1.html