ar8031网卡中的光口和电口相互切换

经过一段时间的奋斗,实现了ar8031网卡的光口和电口相互切换。其中的几个关键概念需要厘清。光口如果是SFP的1000M模块需要注意,一定只能是1000M模式。因为这个问题卡了一段时间。不过因为这些问题,把网卡的驱动流程dump了一遍,其中关键的文件为phy_device.c,关键的驱动接口结构体为:

static struct phy_driver genphy_driver = {
	.phy_id		= 0xffffffff,
	.phy_id_mask	= 0xffffffff,
	.name		= "Generic PHY",
	.config_init	= genphy_config_init,
	.features	= 0,
	.config_aneg	= genphy_config_aneg,
	.read_status	= genphy_read_status,
	.suspend	= genphy_suspend,
	.resume		= genphy_resume,
	.driver		= {.owner= THIS_MODULE, },
};
然后这个结构体被在另外一个文件中也实现了,具体文件为at803x.c文件:

static struct phy_driver at8030_driver = {
	.phy_id		= 0x004dd076,
	.name		= "Atheros 8030 ethernet",
	.phy_id_mask	= 0xffffffef,
	.config_init	= at803x_config_init,
	.features	= PHY_GBIT_FEATURES,
	.flags		= PHY_HAS_INTERRUPT,
	.config_aneg	= &genphy_config_aneg,
	.read_status	= &genphy_read_status,
	.driver		= {
		.owner = THIS_MODULE,
	},
};
从这个两个结构体中可以看出,是相互关联实现的。对此可以看出来PHY的基本初始化流程和配置流程。基于此思路我修改了config_aneg的实现。根据PHY的模式修改了对应的配置寄存器实现了光口和电口的互相切换。


你可能感兴趣的:(嵌入是项目开发,HI35xx)