PCI网卡驱动程序结构与初始化分析.pdfVIP

  • 1
  • 0
  • 约5.63千字
  • 约 8页
  • 2026-02-07 发布于北京
  • 举报

PCI网卡驱动程序分析

(国嵌)

1.概述

该分析报告针对GNIC-II的千兆以太网卡,源程序

文件:drivers/net/hamachi.c,由于该分析报告旨在

对介绍PCI驱动程序结构,所以程序中关于硬件操作

的具体部分不作介绍。

2.初始化

staticint__inithamachi_init(void)

{

if(pci_register_driver(hamachi_driver)0)

return0;

pci_unregister_driver(hamachi_driver);

return-ENODEV;

}

在模块初始化时采用pci_register_driverpci驱动程

序。

staticstructpci_driverhamachi_driver={

name:DRV_NAME,

id_table:hamachi_pci_tbl,

probe:hamachi_init_one,

remove:

__devexit_p(hamachi_remove_one),

};

staticstructpci_device_idhamachi_pci_tbl[]__initdata=

{

{0x1318,0x0911,PCI_ANY_ID,PCI_ANY_ID,},

}

该表记录的是该驱动能够支持的PCI设备,分别是厂商

号,设备号,子厂商号,子设备号,其中子厂商号,子设

备号为PCI_ANY_ID,表示支持各类型。该表到底有

什么实际用处?(通过分析函数pci_register_driver得出

结论)

probe:hamachi_init_one(该函数的调用时机可通过分析

pci_register_driver得出)

staticint__inithamachi_init_one(structpci_dev*pdev,

conststructpci_device_id*ent)

{

/*使能PCI设备*/

if(pci_enable_device(pdev)){

ret=-EIO;

gotoerr_out;

}

/*获取址*/

ioaddr=pci_resource_start(pdev,0);

/*申请将要使用的地址空间*/

i=pci_request_regions(pdev,DRV_NAME);

if(i)returni;

/*获取中断号*/

irq=pdev-irq;

/*思考为什么这里要使用ioremap?*/

ioaddr=(long)ioremap(ioaddr,0x400);

if(!ioaddr)

gotoerr_out_release;

dev=alloc_etherdev(sizeof(structhamachi_private));

if(!dev)

gotoerr_out_iounmap;

SET_MODULE_OWNE

文档评论(0)

1亿VIP精品文档

相关文档