ReakTek r8169 驱动程序计数器和统计结构及其成员类型它们是否应该是用于字节排序的 le64/le32/etc 类型

问题描述

我正在阅读 RealTek r8169 驱动程序。其中有硬件相关的结构体并在 DMA 中使用。所以我有 Counter 的结构,还有 Rx Descriptor 和 Tx Descriptor。

这是结构rtl8169_counters

    struct rtl8169_counters {
        __le64  tx_packets;
        __le64  rx_packets;
        __le64  tx_errors;
        __le32  rx_errors;
        __le16  rx_missed;
        __le16  align_errors;
        __le32  tx_one_collision;
        __le32  tx_multi_collision;
        __le64  rx_unicast;
        __le64  rx_broadcast;
        __le32  rx_multicast;
        __le16  tx_aborted;
        __le16  tx_underun;
    };

我注意到硬件相关结构及其成员使用 __le32__le64 或类似的类型来表示较小的值。 cpu 类型与 C 中的类型相同,如 struct pageint/char 等。还有一个函数,如 le32_to_cpu(descriptor->opts2); 将值转换为 cpu 字节顺序从le32/le64/等

所以我想知道为了设备(即网卡)接受结构体或变量,类型应该是le16/le32/le64?

所以我的 Rx 描述符或计数器结构可以被 NIC 卡访问,因此它可以将计数器值从设备写入 DMA 缓冲区,也可以将数据包从 NIC 内部寄存器写入 DMA 缓冲区。

这是正确的理解吗?

所以基本上我的理解是 le64 类型是特定于设备的(即 NIC 卡),其余的普通 C 类型是特定于处理器的,因此为了匹配应该有像 le32_to_cpu 这样的函数,等等?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)