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

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

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

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

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

【问题讨论】:

    标签: linux linux-kernel linux-device-driver


    【解决方案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 长度的阈值配置。

    【讨论】:

    • 但是如何识别数据包在内存中的存储位置以及存储了多长时间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多