实现phy device处理相关的接口config_init、config_aneg、read_status、ack_interrupt、config_intr、did_interrupt、match_phy_device、ts_info、hwtstamp、rxtstamp、txtstamp、set_wol、get_wol
其中config_init主要是对phy device进行一些初始化配置;
config_aneg、read_status主要用于设置phy device的自适应机制已经获取phy的状态(主要用于获取适配速率、双工模式等),一般这两个接口直接使用genphy_config_aneg、genphy_read_status即可,触发该phy device有特殊的定义
ack_interrupt、config_intr、did_interrupt主要用于phy device的link up/down相关的中断处理,这个与具体的phy device有关
针对ts_info、hwtstamp、rxtstamp、txtstamp、set_wol、get_wol主要是时间戳相关的处理,大多数phy device均不需实现这几个接口。
phy_read和phy_write定义在linux-4.9.225\include\linux\phy.h中
mdiobus_read和mdiobus_write定义在linux-4.9.225\drivers\net\phy\mdio_bus.c
总线注册的入口函数phy_device.c
总线注册函数mdio_bus.c
phy_init函数中不仅注册了mdio_bus总线,还注册了一个通用的PHY驱动作为缺省的内核PHY驱动
PHY设备有多种不同的型号phy.h
以太网MII接口类型大全-MII、RMII、SMII、GMII、RGMII、SGMII、XGMII、XAUI、RXAUI
SGMII(高速模拟信号)接口支持10/100/1000M自适应
XAUI和SGMII的区别就是前者10G后者1G,介质无关
XAUI有4个lane,每个lane走2.5G有效数据(实际是3.125G,因为每8bit下插2bits的csma/cd的控制信号),RXAUI是XAUI的reduce版,由4个lane变成2个,6.25G per lane。
features表示网卡支持的特性,看代码,在genphy_config_init会重新赋值的,这里的赋值似乎无效。soft_reset->genphy_soft_reset:软复位PHY,写1到寄存器0的第15位,该位会自动清零,故要等待其清零后才认为复位成功
config_init ->genphy_config_init:初始化配置,主要初始化features,即supported和advertising
config_aneg -> genphy_config_aneg:自动协商,当自动协商使能时,配置advertising,并重新自动协商。如不是,则强制设置(写寄存器0)
aneg_done -> genphy_aneg_done: 读寄存器1,判断第5位,为1表示已经完成自动协商
read_status -> genphy_read_status:读取状态,是否连接上,当前速率、能力,等等,在phy状态机中,此函数经常被调用
RJ45 座子上一般有两个灯,一个黄色(橙色),一个绿色,绿色亮的话表示网络连接正常,黄色闪烁的话说明当前正在进行网络通信,黄灯闪动频率快表示网速好,这两个灯由 PHY 芯片控制。
识别phy的过程:
在网口驱动的probe中,调用mdiobus_register;
在mdiobus_register函数中,会对从0到PHY_MAX_ADDR(一般是31)依次调用mdiobus_scan;
在mdiobus_scan中会调用get_phy_device,如果返回成功,则调用phy_device_register;
在get_phy_device中,会调用get_phy_id来读取对应地址上的phy_id,然后如果满足((phy_id & 0x1fffffff) == 0x1fffffff),则认识该phy不存在。
然后在port的probe中会调用phy_connect来连接phy;
在phy_connect中,会调用bus_find_device_by_name来查找对应的phy是否存在。存在则connect_direct。