Skip to content

Latest commit

 

History

History
31 lines (12 loc) · 1.71 KB

lan9730-linux-driver-speed-bug.md

File metadata and controls

31 lines (12 loc) · 1.71 KB
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_driverrx_fixuprx_fixup这两个回调被频繁调用。

到此,我不禁有个大胆的猜测:莫非是log的原因导致了网速过慢。于是我删除了这两个回调函数里的log,果然网速恢复到了93M。自此,这个问题算是彻底解决。

总结:在热点函数里打log需要慎重。