问题:RTL8211通过4芯网线对接千兆,UBOOT下ping不通,无法通过网络烧写,但内核起来时可以正常通信。
分析后发现,在UBOOT下,通过4芯网线对接百兆可以通信,但是对接千兆却不行,通过打印发现,4芯对接千兆时自协商结果居然是千兆,自然无法正常通信。那如何才能协商成百兆呢?
通过代码分析,发现uboot 代码是通过寄存器0A来判断speed是否为千兆
后来经过一些牛人的指导,才发现原来除了对方的协商能力,RTL8211本身协商能力寄存器09有一个bit9,是否建议千兆。
通过打印发现,REG09.BIT9这一位,通过8芯网线对接千兆时为1,4芯网线对接千兆时为0。如果不判断该位,只判断0A寄存器,4芯网线就会协商成千兆全双工,但因为只有4芯,所以通信不成功。加上该位判断后,自动协商成百兆,即可正常通信。
通过打印,在协商不成功时09和0A寄存器的值会变化,个人猜测,8211应该是在8对网线中的2组MDI都会去协商,如果2组都协商成功,BIT9才会置高。
另外,UBOOT下第一次ping不成功,第二次ping即可成功,通过分析发现第一次不成功时协商了多次没有协商成功,NOT LINK,因为这是8211芯片机制。个人解决办法是把协商此时的上限提高了,第一次ping就可以通了。