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 卸载(“标志 2”)进行管理。与 taprio 的软件实现相比,不同之处在于后者只能塑造来自 CPU 的流量,而不能自主转发的流。
该设备有 8 个流量类别,并根据 VLAN PCP 位将传入帧映射到其中一个类别(如果不存在 VLAN,则使用基于端口的默认值)。如前几节所述,根据 vlan_filtering
的值,交换机识别为 VLAN 的 EtherType 可以是典型的 0x8100,也可以是驱动程序在内部用于标记的自定义值。因此,如果在独立模式或具有 vlan_filtering=0
的桥接模式下使用,则交换机将忽略 VLAN PCP,因为它将无法识别 0x8100 EtherType。在这些模式下,只能通过 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 概念)来实现的。
该驱动程序支持 2 种类型的虚拟链路密钥
VLAN 感知虚拟链路:这些链路与目标 MAC 地址、VLAN ID 和 VLAN PCP 匹配。
VLAN 无感知虚拟链路:这些链路仅与目标 MAC 地址匹配。
在安装虚拟链路规则时,无法更改网桥的 VLAN 感知状态 (vlan_filtering)。
支持在同一规则中组合多个操作。当仅请求路由操作时,驱动程序会创建一个“非关键”虚拟链路。当操作列表还包含 tc-gate(更多详细信息见下文)时,虚拟链路将变为“时间关键”(从保留的内存分区中提取帧缓冲区等)。
支持的 3 个路由操作是“捕获”、“丢弃”和“重定向”。
示例 1:将 swp2 上接收的 DA 为 42:be:24:9b:76:20 的帧发送到 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:丢弃在 swp2 上接收的 DA 为 42:be:24:9b:76:20、VID 为 100 且 PCP 为 0 的帧
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 卸载的引擎相同。因此,关于不能同时(在同一 200 ns 时隙内)触发两个门操作(tc-gate 或 tc-taprio 门)的事实的限制仍然适用。
为了方便起见,可以通过流块在多个入口端口之间共享时间触发的虚拟链路。在这种情况下,同时触发的限制不适用,因为系统中只有一个计划,即共享虚拟链路的计划
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 无感知网桥中,自动填写 VLAN ID 和 PCP,并且只接受“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角色以避免时钟信号上有两个驱动程序时,不可避免地会创建RMII PHY-to-PHY连接。SJA1105完全模拟PHY接口,并在帧前导码之前生成/J/ 和 /K/符号,而真实的PHY不应该理解这些符号。因此,PHY只是将从SJA1105(作为PHY)接收到的额外符号编码到100Base-Tx线上。在电线的另一端,一些链路伙伴可能会丢弃这些额外的符号,而另一些链路伙伴可能会被它们阻塞并丢弃随后到来的整个以太网帧。这看起来像与某些链路伙伴存在数据包丢失,而与其他链路伙伴则不存在。结论是,在RMII模式下,如果连接到PHY,则必须让SJA1105驱动参考时钟。
RGMII固定链路和内部延迟¶
如绑定文档中所述,第二代设备在MAC中具有可调延迟线,可用于建立正确的RGMII时序预算。上电后,它们可以将Rx和Tx时钟偏移73.8到101.7度之间的相位差。关键是,延迟线需要锁定到具有稳定频率的时钟信号。这意味着旧频率和新频率之间的时钟之间必须至少有2微秒的静默时间。否则,锁定会丢失,并且必须重置(断电然后重新上电)延迟线。在RGMII中,时钟频率会随着链路速度而变化(1000 Mbps时为125 MHz,100 Mbps时为25 MHz,10 Mbps时为2.5 MHz),并且链路速度可能会在AN过程中发生变化。在交换机端口通过RGMII固定链路连接到链路伙伴(其链路状态生命周期不受Linux控制,例如不同的SoC)的情况下,延迟线将保持解锁(和不活动状态),直到进行手动干预(交换机端口上的ifdown/ifup)。结论是,在RGMII模式下,只有当链路伙伴永不更改链路速度时,或者如果更改链路速度,则以与交换机端口协调的方式进行更改(实际上,固定链路的两端都处于同一Linux系统的控制下),交换机的内部延迟才是可靠的。至于为什么固定链路接口会更改链路速度:有一些以太网控制器在100 Mbps模式下复位后启动,并且如果要求它们以千兆位速度工作,则它们的驱动程序不可避免地需要更改速度和时钟频率。
MDIO总线和PHY管理¶
SJA1105没有MDIO总线,也不执行带内AN。因此,没有来自交换机设备的链路状态通知。电路板需要将连接到交换机的PHY连接到系统中Linux可用的任何其他MDIO总线(例如,连接到DSA导管的MDIO总线)。然后,链路状态管理通过驱动程序手动(通过SPI命令)将MAC链路速度与PHY协商的设置保持同步来工作。
相比之下,SJA1110支持MDIO从访问点,主机可以通过该访问点访问其内部100base-T1 PHY。但是,驱动程序不使用它,而是通过SPI命令访问内部100base-T1和100base-TX PHY,在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 |
不适用 |
不适用 |
不适用 |