如果要添加自己的phy driver,只需实现下面的三个接口就好,如果只想做一些特殊的配置,有的接口可以直接用 genphy_xxx接口 。
我用了一个国产裕太的 phy yt8521 , 做了一些配置后,发现到 系统后,网口使用有问题,1000M 打流丢包率90% 以上,后来通过读寄存器发现,自动协商没有使能。
环境 :
bootloader : uboot2018
kernel :linux 4.1
cpu : nxp T1042
网口使用dpaa模式,系统内看不到网卡,因为不走内核协议栈,只需要在uboot 下将phy配置好即可。
fm_standard_init //drivers/net/fm/init.c
->fm_eth_initialize //drivers/net/fm/eth.c
->fm_eth_startup
->init_phy(dev) //drivers/net/fm/eth.c
->phy_connect
->phy_find_by_mask //drivers/net/phy/phy.c
->get_phy_device_by_mask->
->create_phy_by_mask
->phy_device_create
->phy_device_create
-> if ((drv->uid & drv->mask) == (phy_id & drv->mask))
return drv;
else
return generic_for_interface(interface)
->phy_probe
->phy_connect_dev
->phy_reset
->phy_config //drivers/net/phy/phy.c
->
/*
* 如果没有注册驱动,就会使用generic_driver,会配置自动协商。
* 如果自己添加驱动,可能没有使能自动协商!!!
* 跑DPAA,可能就会不通,或者大量丢包~~*/
if(phydev->drv->config)
phydev->drv->config() /* 自己注册的驱动*/
genphy_config /* 自己没注册*/
->genphy_config_aneg
-> genphy_restart_aneg
->eth_register
搞明白之后,在自己驱动里,加上使能使能自动协商即可
linux 下的 phy驱动,会多一个配置 自动协商的 API, 所以没有上述的问题。