- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方
您可能关注的文档
最近下载
- “十五五”消防事业发展规划.docx VIP
- 2025高考数学专项讲义第06讲几何法求空间角与空间距离(学生版+解析).docx VIP
- 2025年执业药师承诺书.pdf VIP
- 高考语文阅读理解《到梨花屯去》含答案.docx VIP
- (高清版)-B-T 2651-2023 金属材料焊缝破坏性试验 横向拉伸试验.pdf VIP
- 2025年无人机驾驶员实操考核模拟试题及答案.docx VIP
- 中国偶像产业迭代研究报告-(研究报告).pdf VIP
- 2025年广东省高中历史学业水平考试综合测评(一)历史试题(原卷版+解析版).docx VIP
- 2025-2026秋季学年第一学期“1530”安全教育记录表.docx VIP
- 人教版小学数学三年级上册《多位数乘一位数》教材分析.doc VIP
原创力文档


文档评论(0)