LINUX MDIO模塊分析(三)mii

本篇是mii management/mdio模塊分析的第三篇文章,本章我們主要介紹mii-bus的註冊與註銷接口。在前面的介紹中也已經說過,我們可以將mii-bus理解為mdio總線的控制器的抽象,就像spi-master、i2c-adapter一樣。

本篇文章主要涉及如下兩部分:

mii-bus的註冊與註銷接口

mii-bus提供的方法說明

mii-bus驅動開發步驟說明

mii-bus的註冊與註銷接口

mii_bus主要提供了mdiobus_register、mdiobus_unregister。下面我們對這兩個接口進行分析說明。在分析這兩個接口之前,我們還是把上一篇文章中的mii_bus、device、mdio_bus_class等結構體之間的關聯圖貼在這兒,以便我們可以更好的理解mdiobus_register、mdiobus_unregister。


LINUX MDIO模塊分析(三)mii_bus註冊、註銷及其驅動開發流程

mdiobus_register接口分析

該接口主要用於向系統中註冊一個mii_bus device,並將該device註冊至mdio_bus_class,完成以上操作後,即建立了如下圖的數據結構間的關聯圖。該接口的處理流程如下圖所示(該流程圖屏蔽了一些合法性判斷、返回值判斷等信息):

  1. 調用device_register,將該mii_bus的device成員註冊至系統的device_kset中,並完成與mdio_bus_class的關聯;
  2. 針對phy address範圍為[0-31],且mii_bus未設置忽略該phyid檢測,則調用mdio_scan去搜索該phy addr下是否掛載了phy device(通過mii_bus->read接口,獲取phy id),若獲取到phy_id,則調用phy_device_register,將掃描到的phy_device註冊至mdio_bus_type中(phy_device的註冊我們在下一篇文章中介紹)。

通過以上兩步,即完成了上述圖片中mdio_bus_class、device_kset、mii_bus之間的關聯,以及phy_device、mii_bus、phy_driver的關聯(在linux 各子模塊的學習中,理解各數據結構間的關係很重要,只要把數據結構間的關聯理清了,基本上就知道該模塊的實現流程了)。


LINUX MDIO模塊分析(三)mii_bus註冊、註銷及其驅動開發流程

mdiobus_unregister接口分析

該接口實現的功能剛發與mdiobus_registre相反,將上述建立的結構體變量之間的關聯解除。下圖為該接口的流程圖。主要分為如下兩部分:

  1. 調用device_del,註銷該mii_bus;
  2. 針對該mii_bus所掃描到的phy_device,均調用device_unregister進行註銷。


LINUX MDIO模塊分析(三)mii_bus註冊、註銷及其驅動開發流程

以上即為mii_bus的註冊與註銷方法,我們需要注意的一點是:

在進行mii_bus的註冊中,會掃描該mdio總線上掛載的每一個phy設備,若存在則將該設備註冊至mdio_bus_type上。這是與spi_master、i2c_adapter所不同的,在spi_master、i2c_adapter中需要驅動開發人員在板級文件或者設備樹配置文件上顯示完成spi device、i2c device的註冊,而phy_device的註冊與註銷由mii_bus自動完成搜索及註冊與註銷操作,不需要驅動人員參與。


mii-bus提供的方法說明

與spi-master、i2c-adapter一樣,mii-bus也提供了mdio-bus的訪問方法,通過mii-bus提供的訪問方法,即可訪問該mdio總線上掛接的phy設備。系統主要提供了mdio bus read、write方法,名稱分別為mdiobus_read、mdiobus_write,這兩個接口主要是調用具體mii_bus的read/write方法,實現對phy device的讀寫控制命令。


LINUX MDIO模塊分析(三)mii_bus註冊、註銷及其驅動開發流程

那我們在做哪些驅動開發時,會用到這兩個接口嗎?

比如我們的soc芯片通過mdio/mdc引腳連接了一個交換芯片,我們需要對該交換芯片進行配置,則可直接藉助mdiobus_read/mdiobus_write實現與該交換芯片的命令交換(目前針對這一類驅動,linux系統提供了dsa驅動模塊,在linux3.10時該模塊僅作為Marvell相關交換芯片驅動使用,而在linux 5.2中已經有眾多交換芯片驅動廠家支持了,後面我們在單獨對dsa驅動進行分析)。這一類驅動的開發步驟如下:

  1. 創建一個platform_driver驅動,在該驅動的probe接口中執行如下操作:
    1. 根據platform device傳遞的參數(即mii_bus的id名稱),從mdio_bus_class中查找到具體的mii_bus,並獲取該變量;
    2. 創建對應的字符設備驅動,並把mii_bus作為該字符設備驅動的私有數據傳遞,而在該字符設備的read/write/ioctl接口中,即可藉助mdiobus_read、mdiobus_write與mii_bus完成與具體的交換芯片的命令交換,實現對交換芯片的配置。


mii-bus驅動開發步驟說明

mii_bus結構體的定義如下,我們實現一個mii_bus驅動也就是實現該結構體類型的變量,並調用上述的mdiobus_register接口,即可完成mii_bus的註冊。具體步驟如下:

  1. 需設置該mii_bus的名稱與id,而在系統中可根據該id值搜索一個mii_bus;
  2. 完成read、write、reset方法,其中read、write主要用於與該mii_bus下的設備進行命令的交互;而reset方法主要用於對mii_bus的reset,關於這三個方法的實現,驅動開發人員可根據具體mac芯片的手冊說明進行相應的開發操作。
  3. phy_mask主要用於設置需要忽略的phy addr,如我們需要忽略對phy addr 0的查找,則將phy_mask設置為0x01即可。
  4. 而irq主要指向一個數組,該數組中存儲了每一個phy addr對應的irq,主要用於為每一個 phy addr對應的中斷,該中斷主要用於link up/down,針對該部分內容主要涉及到phy state machine,我們在後續章節中會詳述該部分(大部分的mii_bus一般不提供該irq,但phy state machine提供了phy_poll機制,即是沒有該irq,也可以進行phy link up/down,類似於mmc子模塊中mmc card的poll機制)。

針對一個mii_bus類型的變量,只需要實現上述4步,然後再調用mdiobus_register接口,即可將該mii_bus註冊至系統中。


LINUX MDIO模塊分析(三)mii_bus註冊、註銷及其驅動開發流程

以上便是本篇文章的主要內容,主要涉及mii_bus的註冊與註銷、mii_bus驅動編寫步驟等內容,該類驅動的實

現也比較簡單,只要按上述方法實現即可。


分享到:


相關文章: