一,介绍
以imx8mp为例,网关设备的phy分布如下,现在mac需要绑定一路mdio,可以是原生的mdio,也可以是gpio模拟模拟的。
当绑定到原生的mdio时,应用无法通过eth找到下面4个phy,所以要绑定到模拟mdio上。
当绑定到模拟的mdio时,mdio总线需要挂载下面4个任意一个phy。
如绑定phy1时,会遇到两个问题:
1,当phy1对应网口接入时,即phy1 link up 时mac才会工作。
2,当关闭eth打流时,会导致phy1停止工作,phy1与phy2打流不通。
二,解决
问题1:
修改phy_device.c源码,找到genphy_read_status函数,
屏蔽函数里的内容,添加如下:
phydev->speed = SPEED_100;
phydev->duplex = DUPLEX_FULL;
phydev->pause = 0;
phydev->asym_pause = 0;
speed配置根据实际需求,有SPEED_100百兆和SPEED_100千兆。
这样,当ifconfig eth up时,mac不会通过读phy寄存器就可以工作起来。
问题2:
添加一个虚拟phy,找到一个不用的phy id,在模拟mdio里添加如下节点:
ethphy_virt: ethphy-virt {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x9>;
status = "okay";
};
然后,在mac网络节点里,phy-handle指定该虚拟phy节点,
phy-handle = <ðphy_virt>;
修改phy_device.c源码,找到get_phy_id函数,在函数最前面对phy地址进行判断,
如果为0x9,则对这个虚拟phy设置一个假的phy id,然后返回成功。
if(0x9==addr){
*phy_id = 0x1234;
return 0;
}
这样,通过添加一个虚拟phy,当ifconfig eth down,关闭的是这个虚拟phy,不会影响到实际phy。