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”將啟動以下操作序列

  1. 從 .dev_open() 呼叫的 phylink_start()

  2. .mac_config() 和 .mac_link_up() 回撥由 PHYLINK 呼叫。

  3. 為了配置 HW MAC,將呼叫 MC 韌體 API dpmac_set_link_state()。

  4. 韌體最終將在新配置中設定 HW MAC。

  5. 一個 netif_carrier_on() 呼叫直接從 PHYLINK 在關聯的 net_device 上發出。

  6. 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 連線,則通常的操作序列如下所示

  1. ip link set dev eth0 up

  2. 在關聯的 fsl_mc_device 上呼叫的 dpni_enable() MC API。

  3. ip link set dev eth1 up

  4. 在關聯的 fsl_mc_device 上呼叫的 dpni_enable() MC API。

  5. dpaa2-eth 驅動程式的兩個例項都接收到 LINK_STATE_CHANGED irq,因為現在的執行鏈路狀態已啟動。

  6. 從 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 結構。