DPAA2 MAC / PHY 支援¶
- 版權所有:
© 2019 NXP
概述¶
DPAA2 MAC / PHY 支援包含一組 API,這些 API 幫助 DPAA2 網路驅動程式(dpaa2-eth、dpaa2-ethsw)與 PHY 庫進行互動。
DPAA2 軟體架構¶
在其他 DPAA2 物件中,fsl-mc 匯流排匯出 DPNI 物件(抽象網路介面)和 DPMAC 物件(抽象 MAC)。 dpaa2-eth 驅動程式探測 DPNI 物件,並在 phylink 的幫助下連線和配置 DPMAC 物件。
可以在 DPNI 和 DPMAC 之間或兩個 DPNI 之間建立資料連線。 根據連線型別,netif_carrier_[on/off] 由 dpaa2-eth 驅動程式直接處理或由 phylink 處理。
Sources of abstracted link state information presented by the MC firmware
+--------------------------------------+
+------------+ +---------+ | xgmac_mdio |
| net_device | | phylink |--| +-----+ +-----+ +-----+ +-----+ |
+------------+ +---------+ | | PHY | | PHY | | PHY | | PHY | |
| | | +-----+ +-----+ +-----+ +-----+ |
+------------------------------------+ | External MDIO bus |
| dpaa2-eth | +--------------------------------------+
+------------------------------------+
| | Linux
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | MC firmware
| /| V
+----------+ / | +----------+
| | / | | |
| | | | | |
| DPNI |<------| |<------| DPMAC |
| | | | | |
| | \ |<---+ | |
+----------+ \ | | +----------+
\| |
|
+--------------------------------------+
| MC firmware polling MAC PCS for link |
| +-----+ +-----+ +-----+ +-----+ |
| | PCS | | PCS | | PCS | | PCS | |
| +-----+ +-----+ +-----+ +-----+ |
| Internal MDIO bus |
+--------------------------------------+
根據 MC 韌體配置設定,每個 MAC 可能處於以下兩種模式之一
DPMAC_LINK_TYPE_FIXED:鏈路狀態管理完全由 MC 韌體透過輪詢 MAC PCS 來處理。 無需註冊 phylink 例項,dpaa2-eth 驅動程式將根本不會繫結到連線的 dpmac 物件。
DPMAC_LINK_TYPE_PHY:MC 韌體保持等待鏈路狀態更新事件,但這些事件實際上嚴格在基於 phylink 的 dpaa2-mac 與其連線的 net_device 驅動程式(dpaa2-eth,dpaa2-ethsw)之間傳遞,從而有效地繞過韌體。
實現¶
在探測時或動態更改 DPNI 的端點時,dpaa2-eth 負責找出對等物件是否為 DPMAC,如果是,則使用 dpaa2_mac_connect() API 將其與 PHYLINK 整合,這將執行以下操作
在裝置樹中查詢與 PHYLINK 相容的繫結 (phy-handle)
將建立一個與接收到的 net_device 關聯的 PHYLINK 例項
使用
phylink_of_phy_connect()連線到 PHY
實現了以下 phylink_mac_ops 回撥
.validate() 僅當 phy_interface_t 為 RGMII_* 時才使用 MAC 功能填充受支援的 linkmodes(目前,這是驅動程式唯一支援的鏈路型別)。
.
mac_config()將使用 dpmac_set_link_state() MC 韌體 API 在新配置中配置 MAC。.
mac_link_up()/ .mac_link_down()將使用上述相同的 API 更新 MAC 連結。
在驅動程式 unbind() 時或從 DPMAC 斷開 DPNI 物件時,dpaa2-eth 驅動程式呼叫 dpaa2_mac_disconnect(),後者將斷開與 PHY 的連線並銷燬 PHYLINK 例項。
如果是 DPNI-DPMAC 連線,則“ip link set dev eth0 up”將啟動以下操作序列
從 .dev_open() 呼叫的
phylink_start()。.
mac_config()和 .mac_link_up()回撥由 PHYLINK 呼叫。為了配置 HW MAC,將呼叫 MC 韌體 API dpmac_set_link_state()。
韌體最終將在新配置中設定 HW MAC。
一個
netif_carrier_on()呼叫直接從 PHYLINK 在關聯的 net_device 上發出。dpaa2-eth 驅動程式處理 LINK_STATE_CHANGE irq,以便根據暫停幀設定啟用/停用 Rx taildrop。
+---------+ +---------+
| PHYLINK |-------------->| eth0 |
+---------+ (5) +---------+
(1) ^ |
| |
| v (2)
+-----------------------------------+
| dpaa2-eth |
+-----------------------------------+
| ^ (6)
| |
v (3) |
+---------+---------------+---------+
| DPMAC | | DPNI |
+---------+ +---------+
| MC Firmware |
+-----------------------------------+
|
|
v (4)
+-----------------------------------+
| HW MAC |
+-----------------------------------+
如果是 DPNI-DPNI 連線,則通常的操作序列如下所示
ip link set dev eth0 up
在關聯的 fsl_mc_device 上呼叫的 dpni_enable() MC API。
ip link set dev eth1 up
在關聯的 fsl_mc_device 上呼叫的 dpni_enable() MC API。
dpaa2-eth 驅動程式的兩個例項都接收到 LINK_STATE_CHANGED irq,因為現在的執行鏈路狀態已啟動。
從 link_state_update() 在匯出的 net_device 上呼叫
netif_carrier_on()。
+---------+ +---------+
| eth0 | | eth1 |
+---------+ +---------+
| ^ ^ |
| | | |
(1) v | (6) (6) | v (3)
+---------+ +---------+
|dpaa2-eth| |dpaa2-eth|
+---------+ +---------+
| ^ ^ |
| | | |
(2) v | (5) (5) | v (4)
+---------+---------------+---------+
| DPNI | | DPNI |
+---------+ +---------+
| MC Firmware |
+-----------------------------------+
匯出的 API¶
任何驅動 DPMAC 物件端點的 DPAA2 驅動程式都應處理其 _EVENT_ENDPOINT_CHANGED irq,並在必要時使用下面列出的 API 連線/斷開與關聯的 DPMAC 的連線
- int dpaa2_mac_connect(struct dpaa2_mac *mac);
- void dpaa2_mac_disconnect(struct dpaa2_mac *mac);
只有當合作夥伴 DPMAC 不是 TYPE_FIXED 時,才需要進行 phylink 整合。 這意味著它要麼是 TYPE_PHY,要麼是 TYPE_BACKPLANE(兩者的區別在於 TYPE_BACKPLANE 模式下,MC 韌體不訪問 PCS 暫存器)。 可以使用以下幫助程式檢查此條件
- static inline bool dpaa2_mac_is_type_phy(struct dpaa2_mac *mac);
在連線到 MAC 之前,呼叫者必須分配並使用關聯的 net_device、要使用的 MC 門戶的指標以及 DPMAC 的實際 fsl_mc_device 結構填充 dpaa2_mac 結構。