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

不適用

不適用

不適用