title | zhihu-url | zhihu-tags |
---|---|---|
记一次LAN9730以太网MAC芯片Linux驱动网速过低的Bug |
Linux 内核, linux驱动, 网卡驱动 |
事情的背景是这样的,根据需求,需要在一个很古老的Kernel版本上支持LAN9730。虽然这个古老的内核已经支持LAN9730,但是仅包含内置PHY的支持;而我这个项目需要使用外置PHY,所以就需要把最新内核的驱动移植过来。
由于版本跨度很大,相关的驱动框架(其实主要就是回调函数和结构体定义)也变了很多,所以整个移植过程让人头大。当然啦,最主要的原因还是本人对网络协议和Linux网络驱动一窍不通。
费尽心思终于完成了移植,make
一下,直接通过。跑一下,直接跑通。看来真的是人品爆发。iperf
测下速度,1M,你没看错,只有1M,还是小b。我的LAN9730可是一个百兆的MAC呀。
第一反应应该是哪个寄存器没有设置正确,错误地配置了速度,查阅文档的时候发现,只有10M和100M两个配置选项。就算是10M,1M也是差了太多了。
幸好机智的我在移植的时候加了很多log,也许可以通过log来定位一下问题。我一般会在回调函数的开头和退出的地方加上log,这样可以让我对驱动的整体流程有个大致的把握。然后我发现struct usb_driver
的rx_fixup
和rx_fixup
这两个回调被频繁调用。
到此,我不禁有个大胆的猜测:莫非是log的原因导致了网速过慢。于是我删除了这两个回调函数里的log,果然网速恢复到了93M。自此,这个问题算是彻底解决。
总结:在热点函数里打log需要慎重。