Linux内核和realtek rtl8139驱动

Posted

技术标签:

【中文标题】Linux内核和realtek rtl8139驱动【英文标题】:Linux kernel and realtek rtl8139 driver 【发布时间】:2014-03-20 05:42:05 【问题描述】:

我正在尝试从头开始为 linux 2.6 编写 rtl8139 驱动程序。我已经写了 TX 路径,但是我对 RX 有一些问题。

我将 RX 置于混杂模式并接收 RX irqs。我将 RBSTART 设置为 kmalloc 分配内存的物理地址。

我不知道如何找出收到的数据包有多少以及它们有多长。 我以为 ERBCR、CAPR、CBR 寄存器告诉它,但它们是 == 0。

也许我做错了什么?如何找出收到的数据包的任何信息?

【问题讨论】:

【参考方案1】:

我自己回答我的问题。

接收到的数据包位于从 RBSTART 开始。 rx-ed包的前2个字节是状态字节,后2个是帧长+4字节crc。

也许有人觉得此信息有帮助。

【讨论】:

你能提供一个参考吗? 目前我不确定,但可能我自己研究了这些信息 - 没有任何文档。 我正在用 Rust 开发一个 RTL8139 驱动程序,并且在测试时我正在从一个 qemu 进程向另一个进程发送一个 46 字节的数据包。现在 RxBuffer 中写入的内容如下。 2 字节标头 + 2 字节数据包长度(=64)+ + + 4 字节(可能是 crc)+ 4 字节(全为零)。我不明白为什么最后会有零。你知道为什么吗? 对不起,我不知道。【参考方案2】:

在接收数据包时,从线路接收的数据存储在接收 FIFO 中。当满足 Early Receive Threshold 时,数据从 FIFO 移动到 Recieve Buffer。

所以,一旦你被打断。您需要检查 ROK 的中断状态寄存器。然后检查 Early Rx 状态寄存器,它为您提供接收数据包的状态。如果设置了 EROK,则检查 ROK 的接收缓冲区状态。检查 ISR 和 ERSR 中是否有任何错误。还要检查您的 Rx 配置寄存器以了解 Rx FIFO、RX buf 长度的阈值配置。

【讨论】:

但是如何识别数据包在内存中的存储位置以及存储了多长时间?

以上是关于Linux内核和realtek rtl8139驱动的主要内容,如果未能解决你的问题,请参考以下文章

VxWorks5.5.1 移植RTL8139驱动和配置网络启动调试环境

i.MX6ULL驱动开发 | 29 - 使用USB WIFI网卡(RTL8188EU)

i.MX6ULL驱动开发 | 29 - 使用USB WIFI网卡(RTL8188EU)

我要Realtek RTL8188CU Wireless LAN 802.11n USB 2.0 Network Adapter的驱动安装程序

Linux 网卡驱动的安装

Linux 网卡驱动的安装