欢迎来到天天文库
浏览记录
ID:37514884
大小:143.50 KB
页数:12页
时间:2019-05-24
《Linux网络设备驱动_PCI网卡》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、nLinux网络设备驱动结构nstructpci_driver如果网络设备(包括wireless)是PCI规范的,则先是向内核注册该PCI设备(pci_register_driver),然后由pci_driver数据结构中的probe函数指针所指向的侦测函数来初始化该PCI设备,并且同时注册和初始化该网络设备。如果网络设备(包括wireless)是PCMCIA规范的,则先是向内核注册该PCMCIA设备(register_pccard_driver),然后driver_info_t数据结构中的attac
2、h函数指针所指向的侦测函数来初始化该PCMCIA设备,并且同时注册和初始化该网络设备。1.申明为PCI设备: staticstructpci_drivertg3_driver={.name=DRV_MODULE_NAME,//此驱动所支持的网卡系列,vendor_id,device_id .id_table=tg3_pci_tbl,//初始化网络设备的回调函数 .probe=tg3_init_one,//注销网络设备的回调函数 .remove=__devexit_p(tg3_remove_on
3、e),//设备挂起函数 .suspend=tg3_suspend,//设备恢复函数 .resume=tg3_resume };2.驱动模块的加载和卸载 staticint__inittg3_init(void) {//先注册成PCI设备,并初始化,如果是其他的ESIA,PCMCIA,用其他函数returnpci_module_init(&tg3_driver); } staticvoid__exittg3_cleanup(void) { pci_unregister_driver(&
4、tg3_driver);//注销PCI设备 } module_init(tg3_init);//驱动模块的加载 module_exit(tg3_cleanup);//驱动模块的卸载3.PCI设备探测函数probe,初始化网络设备主要工作:申请并设置pci资源(内存),申请并设置net_device网络设备结构,IO映射,注册网络设备 staticint__devinittg3_init_one(structpci_dev*pdev,conststructpci_device_id*ent)
5、{ //初始化设备,使I/O,memory可用,唤醒设备 pci_enable_device(pdev); //申请内存空间,配置网卡的I/O,memory资源 pci_request_regions(pdev,DRV_MODULE_NAME); pci_set_master(pdev); //设置DMA属性 pci_set_dma_mask(pdev,(u64)0xffffffffffffffff); //网卡I/O,memory资源的启始地址 tg3reg_base=pci_re
6、source_start(pdev,0); //网卡I/O,memory资源的大小 tg3reg_len=pci_resource_len(pdev,0); //分配并设置网络设备 dev=alloc_etherdev(sizeof(*tp)); //申明为内核设备模块 SET_MODULE_OWNER(dev); //初始化私有结构中的各成员值 tp=dev->priv; tp->pdev=pdev; tp->dev=dev; …… //锁的初始化 spin_lock_in
7、it(&tp->lock); //映射I/O,memory地址到私有域中的寄存器结构 tp->regs=(unsignedlong)ioremap(tg3reg_base,tg3reg_len); dev->irq=pdev->irq; //网络设备回调函数赋值 dev->open=tg3_open; dev->stop=tg3_close; dev->get_stats=tg3_get_stats; dev->set_multicast_list=tg3_set_rx_mode;
8、dev->set_mac_aDDRess=tg3_set_mac_addr; dev->do_ioctl=tg3_ioctl; dev->tx_timeout=tg3_tx_timeout; dev->hard_start_xmit=tg3_start_xmit; //网卡的MAC地址赋值dev->addr tg3_get_device_address(tp); //注册网络设备 register_netdev(dev); //把网络设备
此文档下载收益归作者所有