Linux Mii management/mdio子系统分析之一 总体概述
(转载)原文链接:https://blog.csdn.net/u014044624/article/details/123303099
从本章开始,我们介绍linux的mii management对应的mdio子模块,该模块主要用于管理phy设备,实现phy device创建与phy driver的注册等功能。本系统主要涉及如下按如下几个篇章进行分析:
一、总线概述(介绍mdio驱动模型的简要逻辑模型)
二、mdio总线-设备-驱动模型分析
三、虚拟mii_bus模型分析(即fixed-mii_bus,主要的应用场景为2个cpu间网口通过rgmii/sgmii等直接相连,无需phy时,如何让net-device绑定一个逻辑phy-device)
设备间的逻辑关联图及抽象
如下图为cpu与mac、phy之间的逻辑关联图,针对mac与phy之间的连接,包括两部分:
- 通过mii/rgmii/sgmii/…与phy连接,进行数据的通信;
- 通过mdc/mdio与phy连接,实现对phy设备的控制命令的下发等功能
本次我们主要介绍mac与phy之间控制接口间的设备驱动模型(即mac通过mii management
控制phy设备的驱动模型),而针对netdevice子系统模块,此次暂不介绍,留待后续介绍。
MII Management interface用于MAC层芯片控制和配置phy设备,而ieee 802.3中规定了phy device寄存器的额地址空间为5位,最多可定义32各寄存器,而ieee 802.3定义了地址为0-15这16个寄存器的功能,主要包括control、status、phy identifer、auto-neg相关等,而16-31由厂家自行定义。
结合我们之前介绍的i2c、spi、mmc子系统,我们可以针对上面的设备逻辑图进行如下的设备驱动模型的抽象:
- 针对mii management而言,应该抽象控制器对应的类型;
- 针对该控制器,需要提供访问phy的方法,包括读写方法
- 针对phy 设备,应该抽象出对应的设备类型;
- 针对phy设备的驱动,应该抽象出对应的phy设备驱动类型;
- 针对mdc/mdio,应该抽象出对应的总线类型。
而在linux的mdio子系统中,和上述我们的猜想类似,该子系统抽象的内容如下:
- 针对mii management,抽象为struct mii_bus;
- 针对phy设备,抽象为struct phy_device;
- 针对phy设备的驱动,抽象为struct phy_driver ;
- 为mdc/mdio定义了名为“mdio_bus”的总线类型。
MDIO设备驱动模型介绍
在mdio子模块中,针对mii_bus、phy_device、phy_driver、mdio_bus而建立了对应的驱动模型,下面我们分析下该子系统的驱动模型。借助于设备-总线-驱动模型,实现将这几个数据结构关联起来,这些数据结构之间的关联说明如下:
- 借助于设备-总线-驱动模型,通过device_register、driver_register接口,即实现了phy_device、phy_driver注册至mdio bus行,并完成它们之间device与device_driver的关联;
- phy_device通过其drv指针,实现与phy_driver的关联与绑定(其实借助设备-总线-驱动模型的device、device_driver数据结构,也可以获取该phy_device对应的phy_driver,个人认为phy_device中的drv指针有点多余);
- mii_bus借助其成员phy_map,将所有连接至该mii management的phy device关联起来。
此处mdio 驱动模型的数据结构的抽象,该驱动模型与spi驱动模型、i2c驱动模型类似,但也有些区别:
- mii_bus总定义了phy_map,将所有连接至该mii management的phy device关联一起,而在spi模型中,是spi_device中定义指针指向所依附的spi_master(spi master和mii_bus的操作刚好相反);
- spi模型中定义了一个全局链表,将所有注册的spi master链接在一起,而mdio模型中并没有为mii_bus创建相应的全局链表;
- spi模型与mdio模型,均没有将spi master/mii_bus注册至spi_bus/mdio_bus中,这是与i2c模型的区别(i2c adapter是注册至i2c bus的)。
- mii_bus提供了read、write方法,用于和具体的phy device进行通信(主要是控制命令的交互)
其实mdio子模块也是比较简单的,只涉及到寄存器的读写操作(借助mii_bus提供的方法),理解起来 也相对简单点。
本篇主要是简要介绍mdio驱动模型,让大家有一个感性印象,下一篇文章我们主要介绍mdio总线-设备-驱动模型。