LINUX Mii management

從本章開始,我們介紹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之間的連接,包括兩部分:

  1. 通過mii/rgmii/sgmii/…與phy連接,進行數據的通信;
  2. 通過mdc/mdio與phy連接,實現對phy設備的控制命令的下發等功能

本次我們主要介紹mac與phy之間控制接口間的設備驅動模型(即mac通過mii management控制phy設備的驅動模型),而針對netdevice子系統模塊,此次暫不介紹,留待後續介紹。


LINUX Mii management/MDIO總線子模塊分析(一) 總體概述

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子系統,我們可以針對上面的設備邏輯圖進行如下的設備

驅動模型的抽象:

  1. 針對mii management而言,應該抽象控制器對應的類型;
    1. 針對該控制器,需要提供訪問phy的方法,包括讀寫方法
  2. 針對phy 設備,應該抽象出對應的設備類型;
  3. 針對phy設備的驅動,應該抽象出對應的phy設備驅動類型;
  4. 針對mdc/mdio,應該抽象出對應的總線類型。


而在linux的mdio子系統中,和上述我們的猜想類似,該子系統抽象的內容如下:

  1. 針對mii management,抽象為struct mii_bus;
  2. 針對phy設備,抽象為struct phy_device;
  3. 針對phy設備的驅動,抽象為struct phy_driver ;
  4. 為mdc/mdio定義了名為“mdio_bus”的總線類型。

MDIO設備驅動模型介紹

在mdio子模塊中,針對mii_bus、phy_device、phy_driver、mdio_bus而建立了對應的驅動模型,下面我們分析下該子系統的驅動模型。藉助於設備-總線-驅動模型,實現將這幾個數據結構關聯起來,這些數據結構之間的關聯說明如下:

  1. 藉助於設備-總線-驅動模型,通過device_register、driver_register接口,即實現了phy_device、phy_driver註冊至mdio bus行,並完成它們之間device與device_driver的關聯;
  2. phy_device通過其drv指針,實現與phy_driver的關聯與綁定(其實藉助設備-總線-驅動模型的device、device_driver數據結構,也可以獲取該phy_device對應的phy_driver,個人認為phy_device中的drv指針有點多餘);
  3. mii_bus藉助其成員phy_map,將所有連接至該mii management的phy device關聯起來。


LINUX Mii management/MDIO總線子模塊分析(一) 總體概述


此處mdio 驅動模型的數據結構的抽象,該驅動模型與spi驅動模型、i2c驅動模型類似,但也有些區別:

  1. mii_bus總定義了phy_map,將所有連接至該mii management的phy device關聯一起,而在spi模型中,是spi_device中定義指針指向所依附的spi_master(spi master和mii_bus的操作剛好相反);
  2. spi模型中定義了一個全局鏈表,將所有註冊的spi master鏈接在一起,而mdio模型中並沒有為mii_bus創建相應的全局鏈表;
  3. spi模型與mdio模型,均沒有將spi master/mii_bus註冊至spi_bus/mdio_bus中,這是與i2c模型的區別(i2c adapter是註冊至i2c bus的)。
  4. mii_bus提供了read、write方法,用於和具體的phy device進行通信(主要是控制命令的交互)


其實mdio子模塊也是比較簡單的,只涉及到寄存器的讀寫操作(藉助mii_bus提供的方法),理解起來也相對簡單點。


本篇主要是簡要介紹mdio驅動模型,讓大家有一個感性印象,下一篇文章我們主要介紹mdio總線-設備-驅動模型。


分享到:


相關文章: