從本章開始,我們介紹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總線-設備-驅動模型。
閱讀更多 jerry的編程路 的文章