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’ 将启动以下操作序列
从 .
dev_open()
调用的phylink_start()
。PHYLINK 调用 .
mac_config()
和 .mac_link_up()
回调。为了配置 HW MAC,调用 MC 固件 API dpmac_set_link_state()。
固件最终将在新配置中设置 HW MAC。
直接从 PHYLINK 在关联的 net_device 上调用
netif_carrier_on()
。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 连接的情况下,通常的操作序列如下所示
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,因为现在操作链路状态为 up。
从 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 结构。