我正在尝试使用环回(对于 Windows 7 平台)从 Realtek 8168E 发送和接收(写入 tx 缓冲区并从 rx 缓冲区读取)读取 rx 缓冲区给出 0。在检查中断状态寄存器时,TDU 和 RDU 位设置为 1( Tx/Rx 描述符不可用)
网络适配器:Realtek 8168E
参考数据表:Realtek 8168B
发送端配置 - 根据数据表(第 55 页)中给出的规范为 TX 描述符分配内存。将描述符对齐到 256 字节对齐。
还分配了一个单独的缓冲区(TXBuffer)来存储要传输的数据。
将 TXBuffer 的地址放入 TX 描述符中的指定字段。
启用 TX 配置寄存器 (40h) 中的 MAC 环回位。
然后我们启用了 TxPoll 寄存器 (38h) 中的 NPQ 位。
之后,我们通过偏移量 37h 完成了 NIC 重置。
然后我们启用了 BMCR 寄存器中的环回位。
在中断屏蔽寄存器 (3Ch) 中启用 Tx OK 和 Tx Descriptor Unavailable 中断。
将 Tx 描述符地址放入 MAC 寄存器 TNPDS (20h)。
然后最后启用命令寄存器(37h)中的 TE 位。
同样,我在 Rx 端做了必要的配置。
下面是我给的缓冲区
//TX Buffer desriptor
typedef struct _TMP_TBD_STRUC {
ULONG ulFrameLength;
ULONG VLAN_TAG;
ULONG TX_Buffer_Add_Low;
ULONG TX_Buffer_Add_High;
} TBD_TMP_STRUC, *PTBD_TMP_STRUC;
//RX Buffer desriptor
typedef struct _RMP_RBD_STRUC {
ULONG ulBufferSize;
ULONG VLAN_TAG;
ULONG RX_Buffer_Add_Low;
ULONG RX_Buffer_Add_High;
} RBD_RMP_STRUC, *PRBD_RMP_STRUC;
* PL。建议如何调试这种情况。Tx & Rx 描述符配置的正确顺序,请共享。*