RTL8139网卡驱动数据包接收流程.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网卡驱动数据包接收流程 基于 RTL8139 网卡 目录 网卡驱动数据包接收流程 1 中断函数 1 发送完成事件处理 4 软中断处理函数 5 8139 poll 函数实现 8 rtl8139_rx 的实现 9 netif_receive_skb 1. 2 1. 中断函数 static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance) 所有有网卡产生的中断都会引起该中断函数的调用,这是在static int rtl8139_open (struct net_device *dev) { struct rtl8139_private *tp = netdev_priv(dev); int retval; void iomem *ioaddr = tp-mmio_addr; /* 注册中断处理函数 ,中断号为共享 */ retval = request_irq (dev-irq, rtl8139_interrupt, IRQF_SHARED, dev-name, dev); 完成的。 中断函数处理的事件可以大致分为几类: 数据包到达产生的中断(RxAckBits = RxFIFOOver | RxOverflow | RxOK); 异常事件,通常都是出错的情况(RxAckBits = RxFIFOOver | RxOverflow | RxOK) C 发送完成事件(TxOK | TxErr) 下面我们看看具体的代码 static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance) { /* 参数 dev_instance 是在上面注册中断处理函数的时候传入的 */ struct net_device *dev = (struct net_device *) dev_instance; /* tp 为网卡驱动自定义的驱动特有的数据,和dev 一起分配的 */ struct rtl8139_private *tp = netdev_priv(dev); void iomem *ioaddr = tp-mmio_addr; u16 status, ackstat; int link_changed = 0; /* avoid bogus uninit warning */ int handled = 0; /* 对驱动数据加锁*/ spin_lock (tp-lock); /*读中断状态寄存器,获取中断状态*/ status = RTL_R16 (IntrStatus); /* 这时由共享此中断号的其它设备产生的中断 */ if (unlikely((status rtl8139_intr_mask) == 0)) goto out; handled = 1; /* 硬件错误 */ if (unlikely(status == 0xFFFF)) goto out; /* 设备已关闭*/ if (unlikely(!netif_running(dev))) { /* 屏蔽所有中断*/ RTL_W16 (IntrMask, 0); goto out; } /* Acknowledge all of the current interrupt sources ASAP, but an first get an additional status bit from CSCR. */ if (unlikely(status RxUnderrun)) link_changed = RTL_R16 (CSCR) CSCR_LinkChangeBit; ackstat = status ~(RxAckBits | TxErr); if (ackstat) RTL_W16 (IntrStatus, ackstat); 下一步处理数据包到达事件 /* Receive packets are processed by poll routine. If not running start it now. */ if (status RxAckBits){ if (netif_rx_schedule_prep(dev, tp-napi)) { RTL_W16_F (IntrMask, rtl8139_norx_intr_mask); netif_rx_schedule(dev, tp-napi); } } 先强调下 8139 网卡驱动的数据接收方式采用的是Linux 内核的 NAPI 新机制。 NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档