LINUX Mii management

接著上篇文章繼續分析mdio子系統,本章主要介紹mdio子系統的驅動模型,當然了介紹mdio子系統的驅動模型,就繞不開linux系統設備-總線-驅動模型,所有的總線類的驅動,基本上都可以理解為繼承自linux系統設備-總線-驅動模型。

本篇主要介紹如下幾部分的內容:

一、總線-設備-驅動-控制器模型分析

二、總線定義

三、class定義

一、總線-設備-驅動-控制器模型分析

針對驅動模型而言,基本上通過其數據結構的定義及關聯,即可窺知一二(結構體一般封裝了數據與方法,基本上熟悉數據結構間的關聯,也就對其模型有了理解)。下面我們先建立phy_device、phy_driver、mdio_bus、mii_bus、device、device_driver等數據結構之間的關聯,介紹該子系統的驅動模型,接著再對具體的數據結構進行分析。

如下圖即為這些數據結構間的關聯,主要涉及兩個方面:

  1. mdio子系統的驅動模型,主要繼承於linux系統的設備-總線-驅動模型,因此通過繼承device、device_driver數據結構的定義,完成了mdio_bus_type、device、device_driver的關聯,並使用設備-總線-驅動提供的方法完成這些數據結構間的綁定與解綁操作(device_register、driver_register、bus->probe、bus->remove等接口);
  2. 與之前介紹的mmc、spi、i2c驅動模型類似,mdio驅動模型也定義了phy_device、phy_driver、mii_bus之間的關聯,phy_device通過其成員變量,完成了與mii_bus、phy_driver之間的關聯:
  3. phy_device通過其bus指針,可獲取其所依附的mii management,即可使用mii_bus提供給的read/write方法;
  4. phy_device通過其drv指針,可獲取該device對應的driver,可實現對自己的驅動操作;

phy_device通過與mii_bus、phy_driver的關聯,即可實現針對該phy_device的命令設置、狀態獲取等操作,因此在網口驅動實現時,每一個網口對應的net_device均通過其私有指針,綁定對應的phy_device,通過該phy_device類型變量,即可獲取該網口對應phy的信息。

LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析

以上即是mdio子系統的驅動模型,該子系統的數據結構(phy_device、phy_driver、mdio_bus_type)通過繼承linux設備-總線-驅動模型的結構體,即可藉助其方法完成針對phy_device的probe/remove操作,實現驅動與設備的綁定與解綁操作。下面我們分析下這幾個數據結構的定義。

struct mii_bus

該數據結構對應一個mii management控制器的抽象,定義的數據和方法說明如下:

id:表示該mii_bus的id信息(如針對ti cpsw的mii_bus,其id值為cpmac-mii;針對fixed-mii-bus,其值為fixed-0)

read:該mii management提供的讀方法,藉助該接口,可訪問掛載至該mii management上的phy-device;

write:該miimanagement提供的寫方法,藉助該接口,可修改掛載至該mii management上的phy-device;

reset:是對該mii management控制器的復位方法;

phy_map:該數組成員用於指示目前已掃描到的掛載至該控制器下的phy-device;

phy_mask:用於表示忽略該控制器下某一個phy addr對應的phy-device的探測操作。

LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析

Struct phy_driver分析

該結構體的定義如下,主要涉及如下幾個方面:

  1. 定義了該驅動所識別的phy device對應的id;
  2. 定義了device_driver類型的變量,主要用於繼承linux設備-總線-驅動模型,實現mdio總線-phy-device、phy-driver的綁定、解綁等操作;
  3. 定義了probe、remove、suspend、resume等方法(device_driver中也定義了這些方法),而phy_driver也定義這些方法,可以理解為面向對象的多態行為(藉助mdio_bus的probe/remove/suspend/resume,最終調用具體phy_driver的方法);
  4. 定義了針對phy_device的操作方法(phy初始化、phy自適應配置、phy自適應狀態的獲取等接口)


LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析

struct phy_device分析

該數據結構是針對phy設備的抽象。該數據結構主要涉及如下幾個方面:

  1. 該數據結構可理解為是phy_driver、mii_bus、device的子類,因此可以使用mii_bus的read/write方法,實現對phy的訪問,也可以使用phy_driver的方法,實現對phy的配置操作(配置phy的傳輸模式(10M/100M/1000M等)、自適應、工作模式(半雙工/全雙工))
  2. state表示phy的狀態(PHY_DOWN、PHY_UP、PHY_RUNNING、PHY_AN、PHY_FORCING...)
  3. phy_id為phy的廠家標識;
  4. speed、duplex、pause、link、autoneg等變量表示phy的工作速率、工作模式、鏈接狀態、是否自適應等信息;
  5. attached_dev表示該phy所對應的網絡設備;


LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析

以上便是這幾個數據結構的定義,根據這些數據結構的定義及他們之間的關聯,基本上可理解mdio子系統驅動模型的內容。

二、mdio bus 定義及說明

mdio_bus的定義如下,主要實現內如下:

  1. 僅實現了match接口與電源管理相關的接口,而針對設備探測與移除的接口(probe、remove)均沒有實現,因此在調用device_register、driver_register進行設備與驅動註冊匹配時,則調用device_driver->probe/remove接口實現設備的探測操作,針對phy_driver而言,其phy_driver->driver->probe/remove定義為phy_probe/phy_remove,而這兩個接口最終會調用phy_driver->probe/remove接口進行設備的探測與移除操作;
  2. 定義了默認設備屬性(即所有註冊至mdio_bus上的設備,均需要為該設備創建該默認屬性文件,這部分內容可參考我之前寫的設備驅動模型相關的文章,此處不再細說),該默認屬性定義如下,即phy_id的只讀屬性,可讀取該phy_device對應的phyid;


LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析


LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析

三、mdio_bus_class

與spi、mmc子系統類似,mdio子系統針對mii_bus,也創建了對應的類,名稱為“mdio_bus”,該類的定義如下:

LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析

針對mdio_bus_class而言,所有創建的mii_bus,均需要鏈接至該類,而mii_bus繼承自device結構體,而所有的device類型的變量均屬於device_kset,而所有的device類型變量與class的關聯是通過sym_link實現關聯的。如下圖即為mii_bus、mii_bus->dev、mdio_bus_class的關聯。

藉助於mii_bus->dev->kobj->kref(引用計數),mii_bus的釋放由linux設備-總線-驅動模型的kref進行關聯,當mii_bus的引用計數為0時,則觸發其relese接口,通過如下圖的調用,最終調用mdio_bus_class->dev_release,即mdiobus_release接口,該接口則完成mii_bus類型變量的內存釋放操作。

LINUX Mii management/MDIO模塊分析(二)子系統驅動模型分析

以上即為本篇文章的內容,主要介紹mii management/mdio子系統的驅動模型及相關的數據結構的介紹;並介紹mdio_bus_type、mdio_bus_class的定義等內容。本篇文章中的介紹也涉及了linux設備-總線-驅動模型、linux sysfs相關內容,若需要對這兩部分內容的分析,請參考之前寫的文章,強烈建議大家學習下這兩部分的內容,只要把這兩部分的內容理解了,針對linux系統中總線類的設備驅動模型基本上就可以快速理解。


分享到:


相關文章: