写在前面
移植瑞芯微px30 网卡RTL8363的时候,不能识别到网卡 日志打印No found PHY, 只能调试一下代码,调试完成后,梳理网卡框架如下
一 、驱动框架
此框架是很老的linux kernel 4.4内核思路,我看最新内核的GMAC结构体略有不同
匹配过程如下
1 在phy_device.c中,通过get_phy_device 函数拿到设备的id号
2 phy_device_register 将设备节点挂到phy_map中
3 通过mii_bus 注册的函数操作设备读写
二、驱动调用流程
kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
rk_gmac_probe() //探测px30 gmac
kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
stmmac_dvr_probe()
kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
stmmac_mdio_register()
kernel/drivers/of/of_mdio.c
of_mdiobus_register()
mdiobus_register()
kernel/drivers/net/phy/mdio_bus.c //
__mdiobus_register()
mdiobus_scan()
kernel/drivers/net/phy/phy_device.c
get_phy_device()
rtl8367rb_init()
rtk_switch_init()
get_phy_device()
a、通过bus->id区别rtl8363 phy设备与fixed phy设备
b、rtl8363NB 扫描端口1 3 16
// 测试函数,读取到的默认数据为 0x0432 mdio读取没问题
rtk_switch_reg1b03()
drivers/net/ethernet/stmicro/stmmac/rtl8367c/rtk_switch.c
smi_readreg1b03()
drivers/net/ethernet/stmicro/stmmac/rtl8367c/smi.c
MDC_MDIO_READ
drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
stmmac_mdio_write_switch()// 真正调用mdio的地方
stmmac_mdio_read_switch()//所有的通信都是通过这两个函数去通信的 这是rk平台自定的,正常通过mii_bus->stmmac_read_switch/mii_bus->stmmac_write_switch