最近在一个项目中,集成一个交换机芯片的时候,遇到一些麻烦,发现交换机的性能总是上
不去,100M的交换机,实际交换能力只有10M。跟做硬件的同事一起,花了几周时间调试,
才找到问题。原来是接到交换机芯片上的几个子系统,用的Micrel 8041PHY芯片,默认关闭
了硬件流控,导致交换机无法通过流控来控制网络数据交换,结果使得其性能下降。而交换
机每个端口的PHY与子系统的PHY都使用的Auto Negotiation来协商链接状态,子系统默认不
支持流控,交换机也关闭了流控。
解决方法实际上很简单,就是在子系统端打开PHY的流控,其实也就是寄存器的一个位而已,
却花了我们几周时间。究其原因,都是由于大部分PHY芯片默认都打开流控,所以导致我们
一开始没怀疑到这上面,而且也没有引出交换机的控制口查看其状态。
子系统是跑的嵌入式Linux系统,所以在这几周的调试过程中,着重查看了Linux Kernel中
PHY的驱动,以及相关的一些系统调用。有些心得,记录下来。
Linux系统提供了两类ioctl系统调用SIOCETHTOOL和SIOCXMIIXXX,用于控制或者获取网卡
PHY的状态。这两类系统调用的实现取决于PHY驱动中对应ioctl的实现,一般的PHY驱动都
会实现至少其中的一类。下面以获取网卡的Link状态来说明这两类系统调用的使用。
0. Create socket handler
由于这两类调用都要使用socket handler,我们先建立一个socket ha