




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
n Linux网络设备驱动结构n struct pci_driver如果网络设备(包括wireless)是PCI规范的,则先是向内核注册该PCI设备(pci_register_driver),然后由pci_driver数据结构中的probe函数指针所指向的侦测函数来初始化该PCI设备,并且同时注册和初始化该网络设备。如果网络设备(包括wireless)是PCMCIA规范的,则先是向内核注册该PCMCIA设备(register_pccard_driver),然后driver_info_t数据结构中的attach函数指针所指向的侦测函数来初始化该PCMCIA设备,并且同时注册和初始化该网络设备。1. 申明为PCI设备:static struct pci_driver tg3_driver = .name = DRV_MODULE_NAME,/此驱动所支持的网卡系列,vendor_id, device_id.id_table = tg3_pci_tbl,/初始化网络设备的回调函数.probe = tg3_init_one,/注销网络设备的回调函数.remove = _devexit_p(tg3_remove_one), /设备挂起函数.suspend = tg3_suspend, /设备恢复函数.resume = tg3_resume ;2. 驱动模块的加载和卸载static int _init tg3_init(void)/先注册成PCI设备,并初始化,如果是其他的ESIA,PCMCIA,用其他函数return pci_module_init(&tg3_driver);static void _exit tg3_cleanup(void) pci_unregister_driver(&tg3_driver);/注销PCI设备module_init(tg3_init); /驱动模块的加载module_exit(tg3_cleanup); /驱动模块的卸载3. PCI设备探测函数probe,初始化网络设备主要工作:申请并设置pci资源(内存),申请并设置net_device网络设备结构,IO映射,注册网络设备static int _devinit tg3_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)/初始化设备,使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_resource_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_init(&tp-lock);/映射I/O,memory地址到私有域中的寄存器结构tp-regs = (unsigned long) 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;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-addrtg3_get_device_address(tp);/注册网络设备register_netdev(dev);/把网络设备指针地址放入PCI设备中的设备指针中pci_set_drvdata(pdev, dev);4. 注销网络设备主要工作:注销并释放网络设备,取消地址映射,释放PCI资源static void _devexit tg3_remove_one(struct pci_dev *pdev)struct net_device *dev = pci_get_drvdata(pdev);/注销网络设备unregister_netdev(dev);/取消地址映射iounmap(void *) (struct tg3 *)(dev-priv)-regs);/释放网络设备kfree(dev);/释放PCI资源pci_release_regions(pdev);/停用PCI设备pci_disable_device(pdev);/PCI设备中的设备指针赋空pci_set_drvdata(pdev, NULL);5. 网络设备挂起主要工作:停用网卡的中断寄存器,停止网卡收发包,停用网卡某些硬件,设置电源状态static int tg3_suspend(struct pci_dev *pdev, u32 state)/停用网卡的中断寄存器tg3_disable_ints(tp);/停止网卡收发包netif_device_detach(dev);/停止网卡某些硬件,fireware的一些功能tg3_halt(tp);/设置网卡的电源状态tg3_set_power_state(tp, state);6. 网络设备恢复主要工作:恢复网卡电源,允许收发包,初始化收发包的缓冲区,初始化网卡硬件,打开网卡中断寄存器 static int tg3_resume(struct pci_dev *pdev)/恢复网卡电源tg3_set_power_state(tp, 0);/允许网卡收发包netif_device_attach(dev);/初始化收发包的缓冲区tg3_init_rings(tp);/初始化网卡硬件tg3_init_hw(tp);/打开网卡中断寄存器tg3_enable_ints(tp);n struct net_device1. 打开网络设备主要工作: 分配中断及注册中断处理函数,初始化硬件及收发缓冲区,初始化定时器及注册超时函数,允许网卡开始传送包static int tg3_open(struct net_device *dev)/分配一个中断request_irq(dev-irq, tg3_interrupt, SA_SHIRQ, dev-name, dev);/* int request_irq(unsigned int irq,void (*handler)(int irq, void *dev_id, struct pt_regs *regs),unsigned long irqflags,const char * devname,void *dev_id);irq是要申请的硬件中断号。在Intel平台,范围0-15。handler是向系统登记的中断处理函数。这是一个回调函数,中断发生时,系统调用这个函数,传入的参数包括硬件中断号,device id,寄存器值。dev_id就是下面的request_irq时传递给系统的参数dev_id。irqflags是中断处理的一些属性。比较重要的有SA_INTERRUPT,标明中断处理程序是快速处理程序(设置SA_INTERRUPT)还是慢速处理程序(不设置SA_INTERRUPT)。快速处理程序被调用时屏蔽所有中断。慢速处理程序不屏蔽。还有一个SA_SHIRQ属性,设置了以后运行多个设备共享中断。dev_id在中断共享时会用到。一般设置为这个设备的device结构本身或者NULL。中断处理程序可以用dev_id找到相应的控制这个中断的设备,或者用rq2dev_map找到中断对应的设备。*/初始化硬件tg3_init_hw(tp);/初始化收包和发包的缓冲区tg3_init_rings(tp);/初始化定时器init_timer(&tp-timer);tp-timer.expires = jiffies + tp-timer_offset;tp-timer.data = (unsigned long) tp;tp-timer.function = tg3_timer; /超时回调函数add_timer(&tp-timer);/允许网卡开始传输包netif_start_queue(dev);2. 关闭网络设备主要工作: 停止网卡传输包,去除定时器,释放收发缓冲区,释放中断static int tg3_close(struct net_device *dev)/停止网卡传输包netif_stop_queue(dev);netif_carrier_off(tp-dev);/去除定时器del_timer_sync(&tp-timer);/释放收包和发包的缓冲区tg3_free_rings(tp);/释放中断free_irq(dev-irq, dev);3. 初始化数据包发送主要工作: 以DMA方式向网卡物理设备传输包,硬件发送static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)len = (skb-len - skb-data_len);/以DMA方式向网卡物理设备传输包。/如果是wireless的话,需要根据802.11协议及硬件的规范从新填充/硬件帧头,然后提交给硬件发送。mapping = pci_map_single(tp-pdev, skb-data, len, PCI_DMA_TODEVICE);tp-tx_buffersentry.skb = skb;pci_unmap_addr_set(&tp-tx_buffersentry, mapping, mapping);/硬件发送tg3_set_txd(tp, entry, mapping, len, base_flags, mss_and_is_end);/记录发包开始时间dev-trans_start = jiffies;4. 读取包的网卡收发包的状态,统计数据static struct net_device_stats *tg3_get_stats(struct net_device *dev)/从硬件相关的寄存器读取数据,累加 /stats-rx_packets, stats-tx_packets, stats-rx_bytes, stats-tx_bytes等5. 参数设置在驱动程序里还提供一些方法供系统对设备的参数进行设置和读取信息。一般只有超级用户(root)权限才能对设备参数进行设置。设置方法有:tg3_set_mac_addr (dev-set_mac_address)当用户调用ioctl类型为SIOCSIFHWADDR时是要设置这个设备的mac地址。一般对mac地址的设置没有太大意义的。dev-set_config()当用户调用ioctl时类型为SIOCSIFMAP时,系统会调用驱动程序的set_config方法用户会传递一个ifmap结构包含需要的I/O、中断等参数。用户的ioctl命令系统调用static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr-ifr_data;switch(cmd) /ethtool程序命令的调用case SIO*HTOOL:return tg3_ethtool_ioctl(dev, (void *) ifr-ifr_data);/mii程序命令的调用case SIOCGMIIREG: err = tg3_readphy(tp, data-reg_num & 0x1f, &mii_regval)data-val_out = mii_regval;return err;n request_irq1. 中断处理收包,发包static void tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)/如果要收包tg3_rx(tp);/如果要发包tg3_tx(tp);2. 发包static void tg3_tx(struct tg3 *tp)struct tx_ring_info *ri = &tp-tx_bufferssw_idx;struct sk_buff *skb = ri-skb;/以DMA方式向网卡传输包完毕pci_unmap_single(tp-pdev, pci_unmap_addr(ri, mapping),(skb-len - skb-data_len), PCI_DMA_TODEVICE);ri-skb = NULL;dev_kfree_skb_irq(skb);3. 收包static int tg3_rx(struct tg3 *tp, int budget)struct sk_buff *copy_skb;/分配一个包copy_skb = dev_alloc_skb(len + 2);copy_skb-dev = tp-dev;/修改包头空间skb_reserve(copy_skb, 2);/加入数据到包中skb_put(copy_skb, len);/以DMA方式从网卡传输回数据pci_dma_sync_single(tp-pdev, dma_addr, len, PCI_DMA_FROMDEVICE);memcpy(copy_skb-data, skb-data, len);skb = copy_skb;/解析包的协议skb-protocol = eth_ty
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 尿常规课件教学课件
- 2025年纸质图书出版与全球发行权许可协议
- 2025年智能化产品研发与市场拓展战略咨询合作协议
- 2025年绿色低碳型仓储租赁安全协议及环境监测服务
- 2025年新型环保节能建筑保温层施工及维护保养服务合同
- 2025年度高端食品级纸盒包装盒定制采购合同
- 2025年高端餐饮酒店食材采购与供应链管理服务合同
- 2025年新型医药产品生产基地入驻合作框架协议
- 2025年专业车辆运输租赁及城乡配送服务合同范本
- 2025年度公路运输企业安全培训及应急处理服务合同
- 高速公路服务区升级转型商业计划书
- 数学原来这么有趣
- 常见行政案件笔录模版
- 手术室甲状腺切除术手术配合护理查房
- 国家电网电力中级职称考试题
- 数据库设计规范说明
- 建设工程消防验收评定规则
- 肾内科临床技术操作规范2022版
- 山东省临沂市兰山区2022-2023学年小升初数学自主招生备考卷含答案
- 2023年中国工商银行软件开发中心春季校园招聘500人笔试模拟试题及答案解析
- 地质勘查钻探岩矿心管理通则
评论
0/150
提交评论