博通 Starfighter 2 以太网交换机驱动程序

博通的 Starfighter 2 以太网交换机硬件模块通常在以下产品中找到和部署:

  • xDSL 网关,如 BCM63138

  • 流媒体/多媒体机顶盒,如 BCM7445

  • 有线调制解调器/家庭网关,如 BCM7145/BCM3390

该交换机通常部署在包含 5 到 13 个端口的配置中,提供一系列内置和可自定义的接口:

  • 单个集成千兆 PHY

  • 四个集成千兆 PHY

  • 带有 MDIO 多路复用器的四个外部千兆 PHY

  • 集成 MoCA PHY

  • 多个外部 MII/RevMII/GMII/RGMII 接口

该交换机还支持特定的拥塞控制功能,允许 MoCA 故障转移在 MoCA 角色重新选举期间不会丢失数据包,以及当下游接口以较低速度连接时,向主机 CPU 网络接口提供带外背压。

交换机硬件模块通常使用 MMIO 访问进行接口连接,并包含一堆子模块/寄存器:

  • SWITCH_CORE: 通用交换机寄存器

  • SWITCH_REG: 外部接口交换机寄存器

  • SWITCH_MDIO: 外部 MDIO 总线控制器(在 SWITCH_CORE 中还有另一个,用于间接 PHY 访问)

  • SWITCH_INDIR_RW: 64 位宽寄存器辅助模块

  • SWITCH_INTRL2_0/1: 二级中断控制器

  • SWITCH_ACB: 准入控制模块

  • SWITCH_FCB: 故障转移控制模块

实现细节

该驱动程序位于 drivers/net/dsa/bcm_sf2.c 中,并作为 DSA 驱动程序实现;有关子系统及其提供的详细信息,请参阅 Documentation/networking/dsa/dsa.rst

SF2 交换机配置为启用博通特定的 4 字节交换机标签,该标签由交换机插入到转发到 CPU 接口的每个数据包中,相反,CPU 网络接口应该为进入 CPU 端口的数据包插入类似的标签。该标签格式在 net/dsa/tag_brcm.c 中描述。

总的来说,SF2 驱动程序是一个相当标准的 DSA 驱动程序;下面介绍一些具体细节。

设备树探测

DSA 平台设备驱动程序使用 net/dsa/dsa.c 中提供的特定兼容字符串进行探测。这样做的原因是 DSA 子系统目前注册为平台设备驱动程序。DSA 将提供所需的 device_node 指针,然后交换机驱动程序设置函数可以访问这些指针以设置诸如寄存器范围和中断之类的资源。目前这工作得很好,因为驱动程序使用的 of_* 函数都不需要 struct device 绑定到 struct device_node,但将来可能会发生变化。

MDIO 间接访问

由于博通交换机的设计方式存在限制,连接到 SF2 的外部博通交换机需要使用 DSA 用户 MDIO 总线才能正确配置它们。默认情况下,SF2 伪 PHY 地址和外部交换机伪 PHY 地址都将侦听传入的 MDIO 事务,因为它们位于相同的地址 (30),从而导致某种“双重”编程。使用 DSA 并相应地设置 ds->phys_mii_mask,我们有选择地将读写操作转向外部博通交换机伪 PHY 地址。较新版本的 SF2 硬件引入了可配置的伪 PHY 地址,从而规避了最初的设计限制。

同轴电缆多媒体 (MoCA) 接口

MoCA 接口相当特殊,需要使用固件 blob 加载到 MoCA 处理器上进行数据包处理。当 MoCA 同轴电缆断开或固件重新加载时,交换机硬件包含相应的逻辑来断言/取消断言 MoCA 接口的链路状态。SF2 驱动程序依赖此类事件来正确设置其 MoCA 接口载波状态,并将其正确报告给网络堆栈。

MoCA 接口使用 PHY 库的固定 PHY/模拟 PHY 设备提供支持,并且交换机驱动程序为此类 PHY 注册一个 fixed_link_update 回调,该回调反映从中断处理程序获取的链路状态。

电源管理

在可能的情况下,SF2 驱动程序尝试通过应用以下组合来最小化整体交换机功耗:

  • 关闭内部缓冲区/内存

  • 禁用数据包处理逻辑

  • 将集成 PHY 置于 IDDQ/低功耗模式

  • 根据活动端口数减少交换机内核时钟

  • 启用和播发 EEE

  • 当链路断开时,关闭 RGMII 数据处理逻辑

网络唤醒

网络唤醒目前通过利用主机处理器以太网 MAC 控制器唤醒逻辑来实现。当请求网络唤醒时,将完成用户请求和支持的主机以太网接口 WoL 功能之间的交集,并配置交集结果。在系统范围的挂起/恢复期间,仅禁用不参与网络唤醒的端口。