问题描述
我正在阅读 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 page
或 int
/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 (将#修改为@)