欢迎访问 OSPlay www.osplay.org
23 return −ENOMEM ;
24 }
25 SET MODULE OWNER ( dev ) ;
26 SET NETDEV DEV ( dev , &pdev−>dev ) ;
27
28 tp = netdev priv ( dev ) ;
29 tp−>pci d e v = pdev ;
30
31 /∗ enable device ( incl . PCI PM wakeup and hotplug
setup ) ∗/
32 /∗ 启用设备的 memory/Io 译码,如果设备处于休眠状态,则唤醒
设备。在启用设备之前,虽然设备的基址寄存器中设置了值,但
是当总线有主设备对该地址进行寻址的时候,设备是不会响应
的。具体启用操作由总线驱动程序封装,这里通过调用 pci 总线
驱动程序提供的函数来完成该任务,在 windows 中某些写操作
由功能驱动向下层的总线驱动发送 IRP 完成同样的任务。 ∗/
33 rc = p c i e n abl e dev i ce ( pdev ) ;
34 if ( rc )
35 goto err out ;
36
37 /∗ ⼤多数设备上有自⼰的板载存储空间,其中包括 memory 空间
和 IO 空间,在 X86 这样的 IO 与 Memory 分立编址的系统
上,他们的区别就在于独立的 IO 访问指令,独立的地址译码,
在多数统⼀编址的系统上 memeor 空间和 IO 空间没有本质区
别。 CPU 给出的指令中的地址落在哪里,设备在电路级别会访问
到对应地址的板载存储空间。 PCI 总线驱动程序已经为设备分配
地址空间,并配置了基址寄存器,通常 BIOS 已经为这些设备配
置了互不冲突的地址,系统的 PCI 总线驱动程序可以直接扫
描 PCI 设备,并从基址寄存器中读出各个设备的基地址,也可以
推倒从新统⼀分配。这里功能驱动程序需要知道自⼰如何访问到
目标设备,所以从总线物理设备对象中读取基址信息。 ∗/
38 pio start = pci r e s ourc e s tart ( pdev , 0) ;
39 pio end = p c i re s our c e en d ( pdev , 0 ) ;
40 p io flags = pc i res o u rce fla g s ( pdev , 0 ) ;
41 p i o len = pci r es o ur c e l e n ( pdev , 0 ) ;
7