uboot 下 phy 驱动的注册运行流程

本文详细介绍了在Linux环境下,针对国产裕太PHYyt8521进行配置后出现的1000M网口高丢包率问题。问题源于自动协商未被正确启用。在理解了Linux PHY驱动的初始化流程后,发现在自定义驱动中缺少自动协商的配置。修复方法是在自定义驱动中添加启用自动协商的代码,从而解决丢包问题。对于使用DPAA模式的系统,网卡配置需在U-Boot阶段完成,避免内核协议栈的参与。

如果要添加自己的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, 所以没有上述的问题。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值