linux下 usb 和pci设备的reset

  • 1. 什么是设备的reset
    • 设备的寄存器
    • 设备的结构体
  • usb device reset
  • pci device reset
    • pci 设备的function, slot, bus
    • pci function reset

1. 什么是设备的reset

设备的reset是为了让设备的寄存器恢复初始状态

设备的寄存器

设备的寄存器分为两种,一种是不可改变的,静态寄存器;一种是可改变的,动态寄存器。
静态寄存器的恢复初始状态只能通过完全断电来完成
动态寄存器的恢复初始状态可以通过向reset寄存器写值,来完成动态寄存器的恢复。
上面两种reset 分别叫做cold reset 和 hot reset。

设备的结构体

reset和设备的新发现是完全不一样的,其本质在于reset会保持为这个设备分配的资源不变,包含为这个设备生成的一系列结构体和分配的内存空间等,只是重置动态寄存器。

usb device reset

开门见山, usb 设备的reset是通过对usb设备所连接的hub 的port 重新init来完成的,重新枚举了一次usb设备。
函数调用顺序:usb_reset_device->usb_reset_and_verify_device->hub_port_init->hub_port_reset

pci device reset

pci 设备的reset 比较复杂,主要是因为pci device 有很多不同层次的reset,它会一个个尝试,程度从浅到深,哪个层次的reset成功就直接返回,不会执行更深层次的reset。

pci 设备的function, slot, bus

pci设备可以是个复合设备,比如usb2.0 主机控制器,就是一个usb1.1 主机控制器和一个usb2.0 主机控制器集成在一起,成了一个复合设备。每个主控是一个function,合在一起成了一个device,对与linux内核来说,就是两个设备。
因此对pci设备的复位,其实对pci function的复位。对整个device reset,就需要复位这个device所在pci插槽进行复位,即对slot进行复位。
如果一个pci设备是一个pci bridge,那么对这个设备的复位,必然会导致对连在这个bridge(bus)上所有设备reset。

pci function reset

函数的调用堆栈是
pci_reset_function->__pci_reset_function_locked

__pci_reset_function_locked 是重点

int __pci_reset_function_locked(struct pci_dev *dev)
{int rc;might_sleep();/*   * A reset method returns -ENOTTY if it doesn't support this device* and we should try the next method.** If it returns 0 (success), we're finished.  If it returns any* other error, we're also finished: this indicates that further* reset mechanisms might be broken on the device.*/rc = pci_dev_specific_reset(dev, 0);if (rc != -ENOTTY)return rc;if (pcie_has_flr(dev)) {rc = pcie_flr(dev);if (rc != -ENOTTY)return rc;}    rc = pci_af_flr(dev, 0);if (rc != -ENOTTY)return rc;rc = pci_pm_reset(dev, 0);if (rc != -ENOTTY)return rc;rc = pci_dev_reset_slot_function(dev, 0);if (rc != -ENOTTY)return rc;return pci_parent_bus_reset(dev, 0);
}
EXPORT_SYMBOL_GPL(__pci_reset_function_locked);

pci_dev_specific_reset
pcie_flr
pci_af_flr
pci_pm_reset
pci_dev_reset_slot_function
pci_parent_bus_reset
上面的都是function的重置函数,只要满足一个就可以直接返回,其程度逐渐加深

pci_dev_specific_reset 是驱动工程师为这款设备,写的特定的reset方式
pcie_has_flr 设备是否与FLR 能力,就是读取Function Level Reset Capability
pci_pm_reset 让设备进入D3 hot 再返回D0
pci_dev_reset_slot_function 调用pci_reset_hotplug_slot,重置slot,该函数会重置整个pci device,而不只pci function
pci_parent_bus_reset 调用 pci_bridge_secondary_bus_reset,会修改该pci device 所连接的pci briage的配置空间,让他reset下游的pci device。

linux下 usb 和pci设备的reset相关推荐

  1. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...

    解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点 2018-09-19 http://blog.sina.com.cn/s/blog_8b58097f0102wx ...

  2. usb设备检测linux,Linux下USB设备检测全教程(转)

    Linux下USB设备检测全教程(转)[@more@] USB设备检测也是通过/proc目录下的USB文件系统进行的.为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块.在检测开始 ...

  3. 嵌入式linux查看usb设备驱动程序,嵌入式Linux下USB驱动程序的设计

    嵌入式Linux下USB驱动程序的设计 usb概念:  USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不 ...

  4. linux配置usb主从_一种Linux下USB设备主从切换的实现

    龙源期刊网 http://www.qikan.com.cn 一种 Linux 下 USB 设备主从切换的实现 作者:侯景昆 来源:<电子技术与软件工程> 2013 年第 22 期 摘 要 ...

  5. linux查看电脑硬件信息,怎么在linux下查看电脑硬件设备属性和各种信息

    如何在linux下查看电脑硬件设备属性 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuin ...

  6. linux下usb驱动编写

    linux下usb驱动编写(内核2.4)--2.6与此接口有区别2006-09-15 14:57我们知道了在Linux下如何去使用一些最常见的USB设备.但对于做系统设计的程序员来说,这是远远不够的, ...

  7. Linux下USB suspend/resume源码分析【转】

    转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...

  8. usb linux 内核,Linux下USB内核之学习笔记

    Linux下USB子系统软件结构为 USB 内核(USB驱动,USBD )处于系统的中心,对于它进行研究是能够进行USB驱动开发(包括客户驱动和主机驱动)的第一步.它为客户端驱动和主机控制器驱动提供了 ...

  9. linux下无法umount移动设备

    linux下无法umount移动设备,提示:device is busy,那可以试试这个指令fuser 列出占用设备的进程 fuser -m -v /usb/ 杀掉占用设备的进程,-i是每个进程询问一 ...

最新文章

  1. 搭建Java ME 开发环境
  2. Servlet/jsp和Action/jsp传值
  3. mysql 显示前三项_详解MySQL三项实用开发知识
  4. 大话数据结构11:队列 链表结构
  5. lambda qt 参数 槽函数_C++中的lambda表达式用法
  6. 【codevs1869】硬币购物,背包+神奇的容斥原理
  7. csp2020 j2民间数据下载_摊开母婴市场数据集看一看
  8. 写python的笔记本_python笔记本:更改写入的fi
  9. 基于RV1126平台imx291分析 --- 总结
  10. win10下使用mklink命令给C盘软件搬家
  11. 电脑模拟收银机_模拟超市的收银系统
  12. Apple有史以来屏幕最大的手机iPhone 12最新超详细揭秘
  13. MySQL 的主从复制(高级篇)
  14. 成为CTO的关键技能是什么?
  15. vi新建一个shell脚本_编写第一个Shell脚本
  16. Python_内置函数之round的幺蛾子
  17. 从业务数字化到数字化业务,重新定义CIO|2021全球数字价值峰会
  18. a标签 rel=“external nofollow“ 用法
  19. 给你的工艺品署个名吧
  20. 我理解的面向接口编程

热门文章

  1. SIGIR 2021 | FSCD-PreRank:面向效率和效果更加均衡的交互式粗排模型
  2. 开店星简直就是国内优秀的开源商城系统天花板
  3. 在线Excel绝配:SpreadJS 16.1.1+GcExcel 6.1.1 Crack
  4. 实锤!阿里集团将剥离阿里云 100% 股权
  5. HTML实现简单注册登录页面
  6. Python3卸载不掉怎么办?
  7. 疯狂Java讲义-泛型
  8. 测试员与程序员如何相处
  9. 强推Windows资源管理器软件Clover,类似谷歌 Chrome 浏览器的多标签页
  10. html页面证书过期,网页上的完全证书过期过失效怎么处理