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