NXP SJA1105 交换机驱动程序

概述

NXP SJA1105 是一系列 10 个 SPI 管理的汽车交换机

  • SJA1105E:第一代,无 TTEthernet

  • SJA1105T:第一代,TTEthernet

  • SJA1105P:第二代,无 TTEthernet,无 SGMII

  • SJA1105Q:第二代,TTEthernet,无 SGMII

  • SJA1105R:第二代,无 TTEthernet,SGMII

  • SJA1105S:第二代,TTEthernet,SGMII

  • SJA1110A:第三代,TTEthernet,SGMII,集成 100base-T1 和 100base-TX PHY

  • SJA1110B:第三代,TTEthernet,SGMII,100base-T1,100base-TX

  • SJA1110C:第三代,TTEthernet,SGMII,100base-T1,100base-TX

  • SJA1110D:第三代,TTEthernet,SGMII,100base-T1

作为汽车部件,它们的配置接口面向设置后无需修改的使用方式,在运行时进行最少的动态交互。 它们需要软件编写静态配置,并使用 CRC 和表头进行打包,并通过 SPI 发送。

静态配置由多个配置表组成。每个表占用多个条目。某些配置表可以在运行时(部分)重新配置,而某些配置表则不能。某些表是强制性的,而某些表则不是

表格

强制性

可重新配置

时间表

时间表入口点

如果调度

VL 查找

VL 策略

如果 VL 查找

VL 转发

如果 VL 查找

L2 查找

L2 策略

VLAN 查找

L2 转发

部分(P/Q/R/S 上完全)

MAC 配置

部分(P/Q/R/S 上完全)

时间表参数

如果调度

时间表入口点参数

如果调度

VL 转发参数

如果 VL 转发

L2 查找参数

部分(P/Q/R/S 上完全)

L2 转发参数

时钟同步参数

AVB 参数

常规参数

部分

重新标记

xMII 参数

SGMII

此外,配置是只写的(软件无法从交换机读取回来,除了极少数例外)。

驱动程序在探测时创建静态配置,并始终将其保存在内存中,作为硬件状态的影子。 当需要更改硬件设置时,静态配置也会更新。 如果可以通过动态重新配置接口将更改的设置传输到交换机,则会传输; 否则,交换机将被重置并使用更新的静态配置重新编程。

交换功能

该驱动程序支持在硬件中配置 L2 转发规则以进行端口桥接。 端口之间的转发、广播和泛洪域可以通过两种方法进行限制:在 L2 转发级别(将一个桥的端口与另一个桥的端口隔离)或在 VLAN 端口成员级别(将同一桥内的端口隔离)。 硬件做出的最终转发决定是这两组规则的逻辑与。

硬件在内部使用基于端口的 VLAN (pvid) 标记所有流量,或者从 802.1Q 标签解码 VLAN 信息。 不可能进行高级 VLAN 分类。 一旦归因了 VLAN 标签,就会根据端口的成员规则检查帧,如果它们与任何 VLAN 不匹配,则会在入口处丢弃。 当交换机端口加入 vlan_filtering 1 的桥时,此行为可用。

通常,硬件在 VLAN 感知方面是不可配置的,但是通过更改交换机搜索 802.1Q 标签的 TPID,可以保留 vlan_filtering 0 的桥的语义(接受所有流量,标记或未标记),因此也支持此模式。

支持将交换机端口分隔到多个桥中(例如,2 + 2),但是所有桥应具有相同级别的 VLAN 感知(要么都具有 vlan_filtering 0,要么都具有 1)。

支持通过 STP 进行拓扑和环路检测。

卸载

时间感知调度

该交换机支持 IEEE 802.1Q-2018(以前称为 802.1Qbv)中指定的计划流量增强功能的变体。 这意味着它可以用于确保网络计划中以带内方式发送的优先级流量的确定性延迟,其门打开事件。

此功能可以通过 tc-taprio 卸载(“flags 2”)进行管理。 与 taprio 的软件实现相比,不同之处在于后者只能整形来自 CPU 的流量,而不能自主转发的流。

该设备具有 8 个流量类别,并根据 VLAN PCP 位将传入帧映射到其中一个类别(如果不存在 VLAN,则使用基于端口的默认值)。 如前几节所述,根据 vlan_filtering 的值,交换机识别为 VLAN 的以太网类型可以是典型的 0x8100,也可以是驱动程序在内部用于标记的自定义值。 因此,当在独立或桥接模式下使用 vlan_filtering=0 时,交换机将忽略 VLAN PCP,因为它将无法识别 0x8100 以太网类型。 在这些模式下,只能通过 DSA 网络设备将流量注入到特定的 TX 队列中,这些设备会填充出口处标记标头的 PCP 字段。 使用 vlan_filtering=1,行为方式相反:可以基于 VLAN PCP 将卸载的流引导到 TX 队列,但是 DSA 网络设备不再能够执行此操作。 为了在 VLAN 感知处于活动状态时将帧注入到硬件 TX 队列中,有必要在 DSA 导管端口上创建 VLAN 子接口,并发送带有适当设置的 VLAN PCP 位的正常 (0x8100) VLAN 标记流量到交换机。

管理流量(具有 DMAC 01-80-C2-xx-xx-xx 或 01-19-1B-xx-xx-xx)是一个值得注意的例外:交换机始终以固定的优先级处理它,并且忽略任何 VLAN PCP 位,即使存在。 目前,管理流量的流量类别的值为 7(最高优先级),这在驱动程序中是不可配置的。

以下是在出口端口 swp5 上配置 500 us 循环时间表的示例。 管理流量(7)的流量类别门打开 100 us,所有其他流量类别的门打开 400 us

#!/bin/bash

set -e -u -o pipefail

NSEC_PER_SEC="1000000000"

gatemask() {
        local tc_list="$1"
        local mask=0

        for tc in ${tc_list}; do
                mask=$((${mask} | (1 << ${tc})))
        done

        printf "%02x" ${mask}
}

if ! systemctl is-active --quiet ptp4l; then
        echo "Please start the ptp4l service"
        exit
fi

now=$(phc_ctl /dev/ptp1 get | gawk '/clock time is/ { print $5; }')
# Phase-align the base time to the start of the next second.
sec=$(echo "${now}" | gawk -F. '{ print $1; }')
base_time="$(((${sec} + 1) * ${NSEC_PER_SEC}))"

tc qdisc add dev swp5 parent root handle 100 taprio \
        num_tc 8 \
        map 0 1 2 3 5 6 7 \
        queues 1@0 1@1 1@2 1@3 1@4 1@5 1@6 1@7 \
        base-time ${base_time} \
        sched-entry S $(gatemask 7) 100000 \
        sched-entry S $(gatemask "0 1 2 3 4 5 6") 400000 \
        flags 2

可以将 tc-taprio 卸载应用于多个出口端口。 存在与以下事实相关的硬件限制:没有门事件可以同时在两个端口上触发。 驱动程序会检查时间表与此限制的一致性,并在适当时出错。 需要进行时间表分析以避免这种情况,这超出了本文档的范围。

路由操作(重定向、捕获、丢弃)

该交换机能够将基于流的数据包重定向到用户指定的一组目标端口。 在内部,这是通过利用虚拟链路(TTEthernet 概念)来实现的。

驱动程序支持两种虚拟链路的键类型

  • VLAN 感知虚拟链路:这些链路匹配目标 MAC 地址、VLAN ID 和 VLAN PCP。

  • VLAN 不感知虚拟链路:这些链路仅匹配目标 MAC 地址。

在安装虚拟链路规则时,无法更改桥的 VLAN 感知状态 (vlan_filtering)。

支持在同一规则中组合多个操作。 当仅请求路由操作时,驱动程序将创建“非关键”虚拟链路。 当操作列表还包含 tc-gate(更多详细信息见下文)时,虚拟链路将变为“时间关键”链路(从保留的内存分区中提取帧缓冲区等)。

支持的 3 种路由操作是“捕获”、“丢弃”和“重定向”。

示例 1:将 DA 为 42:be:24:9b:76:20 的 swp2 上收到的帧发送到 CPU 和 swp3。 当端口的 VLAN 感知状态关闭时,此类型的键(仅 DA)

tc qdisc add dev swp2 clsact
tc filter add dev swp2 ingress flower skip_sw dst_mac 42:be:24:9b:76:20 \
        action mirred egress redirect dev swp3 \
        action trap

示例 2:丢弃 DA 为 42:be:24:9b:76:20、VID 为 100 和 PCP 为 0 的 swp2 上收到的帧

tc filter add dev swp2 ingress protocol 802.1Q flower skip_sw \
        dst_mac 42:be:24:9b:76:20 vlan_id 100 vlan_prio 0 action drop

基于时间的入口策略

可以约束交换机的 TTEthernet 硬件能力,使其表现得类似于 IEEE 802.1Q-2018(以前称为 802.1Qci)中指定的每流过滤和策略 (PSFP) 条款。 这意味着它可以用于对最多 1024 个流(由目标 MAC 地址、VLAN ID 和 VLAN PCP 组成的元组标识)执行严格的基于时间的准入控制。 在预期接收窗口之外收到的数据包将被丢弃。

此功能可以通过 tc-gate 操作的卸载来管理。 由于路由操作是 TTEthernet 中虚拟链路固有的(它执行时间关键流量的显式路由,并且不会将其留给 FDB、泛洪等),因此在要求 sja1105 卸载 tc-gate 操作时,它永远不会单独出现。 还必须遵循一个(或多个)重定向或捕获操作。

示例:创建一个与 tc-gate 时间表相位对齐的 tc-taprio 时间表(时钟必须由 1588 应用程序堆栈同步,这超出了本文档的范围)。 发送者传递的任何数据包都不会被丢弃。 请注意,接收窗口大于传输窗口(在本示例中更是如此),以补偿链路的数据包传播延迟(可以通过 1588 应用程序堆栈确定)。

接收器 (sja1105)

tc qdisc add dev swp2 clsact
now=$(phc_ctl /dev/ptp1 get | awk '/clock time is/ {print $5}') && \
        sec=$(echo $now | awk -F. '{print $1}') && \
        base_time="$(((sec + 2) * 1000000000))" && \
        echo "base time ${base_time}"
tc filter add dev swp2 ingress flower skip_sw \
        dst_mac 42:be:24:9b:76:20 \
        action gate base-time ${base_time} \
        sched-entry OPEN  60000 -1 -1 \
        sched-entry CLOSE 40000 -1 -1 \
        action trap

发送者

now=$(phc_ctl /dev/ptp0 get | awk '/clock time is/ {print $5}') && \
        sec=$(echo $now | awk -F. '{print $1}') && \
        base_time="$(((sec + 2) * 1000000000))" && \
        echo "base time ${base_time}"
tc qdisc add dev eno0 parent root taprio \
        num_tc 8 \
        map 0 1 2 3 4 5 6 7 \
        queues 1@0 1@1 1@2 1@3 1@4 1@5 1@6 1@7 \
        base-time ${base_time} \
        sched-entry S 01  50000 \
        sched-entry S 00  50000 \
        flags 2

用于安排入口门操作的引擎与用于 tc-taprio 卸载的引擎相同。 因此,关于以下事实的限制仍然适用:没有两个门操作(tc-gate 或 tc-taprio 门)可以在同一时间(在同一 200 ns 时隙内)触发。

为了方便起见,可以通过流块在多个入口端口之间共享时间触发的虚拟链路。 在这种情况下,同时触发的限制不适用,因为系统中只有一个时间表,即共享虚拟链路的时间表

tc qdisc add dev swp2 ingress_block 1 clsact
tc qdisc add dev swp3 ingress_block 1 clsact
tc filter add block 1 flower skip_sw dst_mac 42:be:24:9b:76:20 \
        action gate index 2 \
        base-time 0 \
        sched-entry OPEN 50000000 -1 -1 \
        sched-entry CLOSE 50000000 -1 -1 \
        action trap

每个流的硬件统计信息也可用(“pkts”计数丢弃的帧数,这是由于时序违规、缺少目标端口和 MTU 强制检查而丢弃的帧数的总和)。 字节级别的计数器不可用。

限制

SJA1105 交换机系列始终执行 VLAN 处理。 当配置为 VLAN 不感知时,帧在内部携带不同的 VLAN 标记,具体取决于端口是独立的还是在 VLAN 不感知的桥下。

虚拟链路键始终固定为 {MAC DA, VLAN ID, VLAN PCP},但是当端口位于 VLAN 感知的桥下时,驱动程序会请求 VLAN ID 和 VLAN PCP。 否则,它会自动填写 VLAN ID 和 PCP,具体取决于端口是独立的还是位于 VLAN 不感知的桥中,并且仅接受“VLAN 不感知”tc-flower 键 (MAC DA)。

在使用虚拟链路卸载的现有 tc-flower 键在发生以下情况之一后将不再可用

  • 端口是独立的,并且加入桥(VLAN 感知或 VLAN 不感知)

  • 端口是桥的一部分,其 VLAN 感知状态发生变化

  • 端口曾经是桥的一部分,并且变为独立的

  • 端口是独立的,但是另一个端口加入 VLAN 感知的桥,并且这会更改桥的全局 VLAN 感知状态

驱动程序无法否决所有这些操作,也无法更新/删除现有的 tc-flower 过滤器。 因此,为了正常运行,tc-flower 过滤器应仅在端口的转发配置完成后安装,并在用户空间进行任何更改之前将其删除。

设备树绑定和板设计

本节引用 Documentation/devicetree/bindings/net/dsa/nxp,sja1105.yaml,旨在展示一些潜在的交换机注意事项。

RMII PHY 角色和带外信令

在 RMII 规范中,50 MHz 时钟信号由 MAC 或外部振荡器驱动(但不由 PHY 驱动)。 但是该规范相当宽松,并且设备以多种方式超出规范。 某些 PHY 违反规范,可能会提供一个输出引脚,它们自己在那里提供 50 MHz 时钟,以试图提供帮助。 另一方面,SJA1105 只是二进制可配置的 - 当处于 RMII MAC 角色时,它也会尝试驱动时钟信号。 为了防止这种情况发生,必须将其置于 RMII PHY 角色。 但是这样做会产生一些意想不到的后果。 在 RMII 规范中,PHY 可以通过 RXD[1:0] 传输额外的带外信号。 实际上,这些是在每个帧的前导码之前发送的一些额外的代码字(/J/ 和 /K/)。 MAC 没有 RMII 规范定义的这种带外信令机制。 因此,当 SJA1105 端口置于 PHY 角色以避免在时钟信号上有 2 个驱动程序时,不可避免地会创建一个 RMII PHY 到 PHY 的连接。 SJA1105 完全模拟 PHY 接口,并在帧前导码之前生成 /J/ 和 /K/ 符号,真实 PHY 不应理解这些符号。 因此,PHY 只是将从 SJA1105-as-PHY 收到的额外符号编码到 100Base-Tx 线路上。 在电线的另一侧,某些链路伙伴可能会丢弃这些额外的符号,而另一些伙伴可能会因这些符号而窒息并丢弃随后的整个以太网帧。 这看起来像是与某些链路伙伴的数据包丢失,但与其他链路伙伴的数据包丢失则不是。 结论是在 RMII 模式下,如果 SJA1105 连接到 PHY,则必须让 SJA1105 驱动参考时钟。

MDIO 总线和 PHY 管理

SJA1105 没有 MDIO 总线,也不会执行带内 AN。 因此,没有来自交换机设备的链路状态通知。 板需要将连接到交换机的 PHY 连接到系统中 Linux 可用的任何其他 MDIO 总线(例如,DSA 导管的 MDIO 总线)。 然后,链路状态管理通过驱动程序手动保持 MAC 链路速度与 PHY 协商的设置同步(通过 SPI 命令)来工作。

相比之下,SJA1110 支持 MDIO 从站接入点,可以通过该接入点从主机访问其内部 100base-T1 PHY。 但是,驱动程序不使用此接入点,而是通过 SPI 命令访问内部 100base-T1 和 100base-TX PHY,这些 SPI 命令在 Linux 中建模为虚拟 MDIO 总线。

连接到 SJA1110 端口 0 的微控制器也具有在主模式下运行的 MDIO 控制器,但是驱动程序也不支持此控制器,因为当 Linux 驱动程序运行时,该微控制器会被禁用。 连接到交换机端口的离散 PHY 应将其 MDIO 接口连接到主机系统上的 MDIO 控制器,而不是连接到交换机,类似于 SJA1105。

端口兼容性矩阵

SJA1105 端口兼容性矩阵是

端口

SJA1105E/T

SJA1105P/Q

SJA1105R/S

0

xMII

xMII

xMII

1

xMII

xMII

xMII

2

xMII

xMII

xMII

3

xMII

xMII

xMII

4

xMII

xMII

SGMII

SJA1110 端口兼容性矩阵是

端口

SJA1110A

SJA1110B

SJA1110C

SJA1110D

0

RevMII (uC)

RevMII (uC)

RevMII (uC)

RevMII (uC)

1

100base-TX 或 SGMII

100base-TX

100base-TX

SGMII

2

xMII 或 SGMII

xMII

xMII

xMII 或 SGMII

3

xMII 或 SGMII 或 2500base-X

xMII 或 SGMII 或 2500base-X

xMII

SGMII 或 2500base-X

4

SGMII 或 2500base-X

SGMII 或 2500base-X

SGMII 或 2500base-X

SGMII 或 2500base-X

5

100base-T1

100base-T1

100base-T1

100base-T1

6

100base-T1

100base-T1

100base-T1

100base-T1

7

100base-T1

100base-T1

100base-T1

100base-T1

8

100base-T1

100base-T1

不适用

不适用

9

100base-T1

100base-T1

不适用

不适用

10

100base-T1

不适用

不适用

不适用