经过一段时间的奋斗,实现了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的模式修改了对应的配置寄存器实现了光口和电口的互相切换。