- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PCI
PCI
第六章:PPCCII子系统与网卡
由于PCI设备在x86架构以及其他架构的系统中都很流行,所以我们会花一些篇幅描述内
核如何管理这些设备,重点描述网络设备。这一章的内容会帮助你理解第八章中有关设备注
册的内容。你也会了解到PCI是如何完成诸如设备探测,电源管理等功能。如果想要更深入
了解PCI,比如有关PCI设备的设计,实现等细节,你可以参考LinuxDeviceDrivers和
UnderstandingtheLinuxKernel或者是PCI规范。
PCI子系统(也可以称作PCI层)提供了内核中不同PCI设备所公用的函数。这个子系统
减轻了不同设备驱动程序员的工作负担,使得PCI驱动可以被组织成一致的风格。当然,这
也使得内核收集和管理设备的信息变得容易了,这些信息包括审计信息和一些计数器。
在本章中,我们将讨论一些在PCI子系统中使用的关键数据结构,以及这些数据结构在一
个典型的PCI设备驱动中如何初始化的。我也会简单的描述一下PCI电源管理以及Wake-
On-LAN功能。
6.1
6.1
66..11 本章所要描述的数据结构
下面是一些在PCI子系统中会用到的数据结构。当然,内核中有许多PCI相关的数据结
构,但是下面这些对理解本书中的内容是必须的。第一个数据结构是在
include/linux/mod_devicetable.h中定义的,其他两个在include/linux/pci.h中定义。
pci_device_id
设备标识号。这不是Linux 中定义的ID,而是在PCI标准中定义的ID。在下一节“注册PCI
网卡“中会描述这个ID 的定义,在后面的“注册PCI设备的例子“一节中会展示一个例子。
pci_dev
每个PCI设备都会分配一个pci_dev 实例,就像每个网络设备都会分配一个net_device实
例。内核使用这个数据结构来引用一个PCI设备。
pci_driver
这个数据结构定义了PCI子系统和PCI设备之间的接口。这个数据结构中有很多函数指
针。所有的PCI设备都会用到这个结构。在“ 注册PCI设备的例子”一节中会看到它的定
义,以及它如何初始化的例子。
pci_driver结构定义了一个PCI设备驱动。下面描述了它的主要成员变量,重点是网络设备
相关的变量。相关的函数指针在不同的设备驱动中初始化成相应的函数。
char*name
设备的名称
conststructpci_device_id *id_table
内核用这个ID 数组关联相应的设备。在“ 注册PCI设备的例子”一节中会看到相应的例
子。
int(*probe)(structpci_dev *dev,conststructpci_device_id *id)
当PCI子系统通过PCIId 数组找到相应的PCI设备驱动时会调用这个函数。这个函数使
能相应的硬件,分配net_device结构,初始化并且注册新设备。在驱动中还会分配其他一些
数据结构(比如发送和接收网络报的缓冲区),这些数据结构在设备中会用到。
[*] 第八章会描述网络设备注册。
void(*remove)(structpci_dev *dev)
当从系统中删除一个设备或者热插扒设备被拔下时,PCI子系统会调用这个函数。这个函
数与probe函数相对应,在这个函数中会释放相应的数据结构。
网络设备驱动调用这个函数释放设备初始化时分配的I/O 端口和I/O 内存,释放
net_device结构以及辅助的一些数据结构,这些数据结构通常是在probe函数中分配的。
int(*suspend)(struct pci_dev *dev,pm_message_tstate)
int(*resume)(structpci_dev*dev)
这个函数在设备在休眠状态和激活状态之间切换时调用。请参考后面的“电源管理和
Wake-On-LAN”一节的内容。
int(*enable_wake)(struct pci_dev*dev,u32state,intenable)
通过这个函数,设备驱动可以生成电源管理信号来激活或者关闭系统。请参考“电源管理
和Wake-on-LAN“一节。
structpci_dynids dynids
动态id,请看下一节。
在下一节中,有一个pci_driver初始化的例子。
原创力文档


文档评论(0)