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