复旦微 DW 网卡驱动踩坑

DW 网卡驱动踩坑指南

写在前面:妈的,从毕业到现在,都两年半了,依旧碌碌无为,这两年半经历的事堪称荒唐,闻者虽然不至于落泪,但百分百免不了一顿同情,(也许应该单独写一篇文章记录一下?)。

linux 下,dw 网卡驱动在 drivers\net\ethernet\stmicro\stmmac\ 路径下

硬件环境

复旦微的国产 zyng 板卡:fmql45t900, 4核,cortex-A7
板卡所使用的 GMAC 为 dwmac
mac 与 PHY 接口为 RGMII
phy 芯片为 88e1512.

软件环境

网络协议栈为 lwip

问题1:dw 网卡驱动运行后,中断报错接受 buffer 不可用

原因:是 MMU 页表配置问题,收发描述符必须是 no cacheable 属性的,否则就会出现这个错误。
且此时,读写当前主机接受 buffer 地址寄存器(偏移地址:0x1054),会出现一个随机值,而这个随机值就是 cache 中存储的内容。

问题2:MDIO 通信不成功

原因:MDIO 引脚复用配置不正确

问题3:读取 MAC 寄存器的 rgmii 状态寄存器(偏移地址 0xd8)值永远为 0

此现象说明 rgmii 接口通信不成功(可能也存在其他原因)
解决:依旧是 rgmii 引脚复用配置的问题,在复旦微板卡上,如果复用功能引脚的数据方向是输入,那么必须置位复用配置寄存器的 bit0。

问题4:无法触发链路状态改变中断

现象:当插拔网线时,无法触发链路状态改变中断
参考问题3的解决,那么 RGMII 接口大概率是没问题了,问题出在驱动上
解决:在网卡初始化代码中,我们应该先设置 MAC 与 PHY 的接口为 RGMII,然后再进行时钟复位,这两个的顺序不能反,否则会出现这个错误。

问题5:发送驱动中释放 pbuf 的话会报错

解决: 经过查看协议栈源码, pbuf 的释放不需要驱动参与,在 linkoutput 函数返回后,由协议栈负责 pbuf 的释放。

问题6:板子与电脑直连,link up 后,电脑无法抓到板卡发送的无回报 ARP 报

解决:因为板卡与电脑不在同一网段下,此时 ping 也不能 ping 通。
此时板子 IP 地址为 192.168.1.30,电脑 IP 地址为 192.168.2.98,子网掩码为 255.255.255.0,板子与电脑不在同一网段下,所以当板子 link up 并发送无回报 ARP 时,电脑的 IP 层会过滤掉这个数据包。
将板子与电脑设置为同一网段,问题解决,此时 ping 也能 ping 通

2022/1/14
关于问题 6
该问题并不是这个原因,而是驱动造成的,但目前我并没有找出来

问题7,在驱动中打印接受的以太网帧,发现起始 8 个字节为随机值

解决:该问题依旧由驱动造成,目前我的解决方法是,将数据地址进行 16 字节对齐,因为之前我的数据地址是 8 字节对齐的,而 DMA 不搬运前 8 个字节,所以导致前 8 个字节不正确

以上内容如果有错,欢迎老哥指正,如果谁需要我这个菜狗子写的网卡驱动,请私信联系,可free分享作为技术交流使用。

你可能感兴趣的:(dw,mac,复旦微,网络,驱动程序)