背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
Switch Phy: ksz8463
问题
单独用POE供电,网络不通
分析
双网口设计:一个为”进”(机器默认绑定的active Phy),一个为”出”。
硬件设计:设计在”出”的网口上。
POE要设计在”进”的网口上,机器的网络才能正常,所以需要硬件交换POE的设计,或者软件交换机器的active Phy
追踪代码:
drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c文件中的stmmac_mdio_register函数:
默认bind到MAC的phy(plat->phy_addr)是最先找到的phy,伪代码:
for(addr = 0; addr < PHY_MAX_ADDR; addr++) {
struct phy_device *phydev = new_bus->phy_map[addr];
if(phydev) {
//....
/*
* If we're going to bind the MAC to this PHY bus,
* and no PHY number was provided to the MAC,
* use the one probed here.
*/
if (priv->plat->phy_addr == -1)
priv->plat->phy_addr = addr;
act = (priv->plat->phy_addr == addr);
//....
pr_info("%s: PHY ID %08x at %d IRQ %s (%s)%s\n",
ndev->name, phydev->phy_id, addr,
irq_str, dev_name(&phydev->dev),
act ? " active" : "");
found = 1;
}
}
而plat->phy_addr是从dts中的snps,phy-addr节点获取:
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c文件中stmmac_probe_config_dt函数:
/* "snps,phy-addr" is not a standard property. Mark it as deprecated
* and warn of its use. Remove this when phy node support is added.
*/
if (of_property_read_u32(np, "snps,phy-addr", &plat->phy_addr) == 0)
dev_warn(&pdev->dev, "snps,phy-addr property is deprecated\n");
解决
以下方法二选一
。。。。。。
作者: Shell
链接: https://notes.z-dd.online/2019/10/24/POE%E5%8F%8C%E7%BD%91%E5%8F%A3%E9%97%AE%E9%A2%98/
来源: DD'Notes
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。