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 固件处于等待链路状态更新事件的状态,但这些事件实际上严格地在 dpaa2-mac(基于 phylink)及其附加的 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 功能填充支持的链接模式。

  • .mac_config() 将使用 dpmac_set_link_state() MC 固件 API 配置新配置中的 MAC。

  • .mac_link_up() / .mac_link_down() 将使用上述相同的 API 更新 MAC 链接。

在驱动程序 unbind() 时或当 DPNI 对象与 DPMAC 断开连接时,dpaa2-eth 驱动程序调用 dpaa2_mac_disconnect(),这将反过来与 PHY 断开连接并销毁 PHYLINK 实例。

在 DPNI-DPMAC 连接的情况下,‘ip link set dev eth0 up’ 将启动以下操作序列

  1. 从 .dev_open() 调用的 phylink_start()

  2. PHYLINK 调用 .mac_config() 和 .mac_link_up() 回调。

  3. 为了配置 HW MAC,调用 MC 固件 API dpmac_set_link_state()。

  4. 固件最终将在新配置中设置 HW MAC。

  5. 直接从 PHYLINK 在关联的 net_device 上调用 netif_carrier_on()

  6. dpaa2-eth 驱动程序处理 LINK_STATE_CHANGE irq,以便根据暂停帧设置启用/禁用 Rx 尾部丢弃。

+---------+               +---------+
| 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,因为现在操作链路状态为 up。

  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 结构。