前面几章我们介绍了MDIO模块的大部分内容,针对mii_bus、mdio_bus、phy_device、phy_driver相关的注册、注销均进行了介绍。基本上把mdio模块的内容介绍完了,而本篇介绍的内容,主要是针对虚拟mii_bus实现,并将虚拟phy_device注册至该mii_bus上。(本次分析内容基于LINUX3.10的内核)
那fixed-mii_bus起到什么作用呢?其应用场景如下(示意图如下):
- 两个cpu间的mac通过rgmii/sgmii等直接相连(不需要phy device),这两块核心板存在于一块单板上,无须使用phy芯片。
- cpu与fpga间的mac通过rgmii/sgmii等直接相连(不需要phy device),这两块核心板存在于一块单板上,无须使用phy芯片。
针对这两种应用场景,均没有使用phy芯片,但mac的驱动程序为保持通用性还是需要进行mii_bus注册以及net-device与phy-device的connect。因此mdio模块设计了一个虚拟的mii_bus(命名为fixed-mii_bus),用于mac芯片无需连接phy芯片的情况。
针对上述情况而言,因两个mac间直接通过数据总线(rgmii/sgmii/qsgmii等)相连,因此需要手动配置mac芯片的模式(全双工)、速率(千兆/百兆/万兆等)。
fixed_mii_bus相关的数据结构说明
主要定义了struct fixed_mdio_bus、struct fixed_phy两个结构体。其中struct fixed_mdio_bus中包含了
struct mii_bus类型的成员;而struct fixed_phy包含了struct phydev类型的成员。
struct fixed_mdio_bus
该结构体表征一个虚拟mii_bus,并包含了fixed相关的信息,其中:
- 链表头phys用于将所有注册至fixed_mii_bus上的逻辑phy device链接在一起;
- irqs表示每一个虚拟phy对应的中断(基本上很少有使用该变量的,在mii_bus介绍章节中也说了,该中断可实现对phy devic link up/down的中断触发。在此处基本用不到)
struct fixed_mdio_bus { int irqs[PHY_MAX_ADDR]; struct mii_bus *mii_bus; struct list_head phys;};
struct fixed_phy
该结构体表征一个虚拟phy设备,其中:
- id表示phy的addr,范围[0-31];
- regs示该虚拟phy设备的寄存器值(因是一个虚拟phy,因此该虚拟phy的寄存器值由fxied_phy_status中的值决定)
- ss中定义了该