主机侧流程:发现、校验与启动
规范描述的是模块一侧——引脚、存储器、状态。本页描述的是 主机一侧:交换机、路由器或网卡从模块插入那一刻起到流量开始转发为止所执行的流程,以及每一步用到的引脚、字节和时序。了解这一流程,能把"端口显示 unsupported"变成"主机在第 4 步停住了",也能解释为什么一个在台架上完全正常的模块,插到端口里却依然可能失败。
按封装形式划分的低速信号
| 封装形式 | 在位 | 复位 / 电源 | 中断 / 故障 | 其他 |
|---|---|---|---|---|
| SFP / SFP+ / SFP28 | MOD_ABS(低电平 = 已插入) | —(TX_DISABLE 控制激光器开关) | TX_FAULT、RX_LOS | RS0、RS1 速率选择 |
| XFP | Mod_ABS | P_Down/RST | Interrupt、Mod_NR(未就绪)、RX_LOS | TX_DIS、Mod_DeSel |
| QSFP+ / QSFP28 | ModPrsL | ResetL、LPMode | IntL | ModSelL |
| QSFP-DD | ModPrsL | ResetL、LPMode | IntL | ModSelL |
| OSFP | PRSn | RSTn、LPWn | INT | —(无选择引脚,每端口一条总线) |
| SFP-DD | 与 SFP 相同的在位检测方式 | 低功耗请求 | 中断 | 速率选择与 SFP 相同 |
各系列的引脚功能与引脚定义:SFP 硬件、 QSFP 硬件、XFP。
完整流程
| # | 步骤 | SFP (SFF-8472) | QSFP (SFF-8636) | CMIS | 故障表现 |
|---|---|---|---|---|---|
| 1 | 检测 | MOD_ABS 变低;去抖 | ModPrsL 变低 | ModPrsL / PRSn 变低 | 端口始终为空;模块"未检测到" |
| 2 | 上电与等待 | 3.3 V 始终通电;等待 t_init 300 ms | LPMode 拉高上电(仅 class 1);等待 t_init 2 s,或轮询 Data_Not_Ready | 相同;等待模块状态离开 MgmtInit(≤ 2 s) | 读取返回 FFh / 00h;身份信息为空 |
| 3 | 识别 | 读取 A0h 0–95;字节 0 = 03h 时选用 SFF-8472 解析方式 | 读取 0–127 及上页 00h;字节 0 = 0Dh/11h,字节 1 为版本 | 读取低页及上页 00h;字节 0 = 18h/19h…,字节 1 为 CMIS 版本 | unknown module type |
| 4 | 校验 | CC_BASE、CC_EXT;标识符/连接器/编码的一致性 | CC_BASE、CC_EXT | 页 00h 校验和 | invalid EEPROM、checksum error — 校验和 |
| 5 | 解码类型 | 兼容性字节 3–10、36;速率字节 12/66;长度;波长 | 字节 131–138、192;140/222 | 介质类型字节 85、应用描述符 | speed and type not supported — 兼容性代码 |
| 6 | 策略 | 厂商名称/PN(有时还有签名)与兼容性表比对 | 相同 | 相同 | unsupported transceiver、errdisable — 厂商锁定 |
| 7 | 功耗等级 | 字节 64 等级位与端口功耗预算比对 | 字节 129 等级;写字节 93 以释放低功耗 / 启用 class 5–8 | 字节 200 等级与端口比对;拉低 LPMode 或清除 LowPwrRequestSW → 模块 PwrUp → Ready | 停留在低功耗,power exceeds — 功耗与热管理 |
| 8 | 配置 | RS0/RS1 或软件速率选择;主机侧速率、FEC、SGMII/1000BASE-X | CDR 开/关 (98)、速率选择 (87–88)、主机侧的拆分通道 | 在 staged control set 中选择 AppSel/DataPathID → ApplyDPInit → 数据通路 Init → Initialized | LOL、FEC 不匹配、拆分被拒绝 — 速度与速率 |
| 9 | 使能 Tx | TX_DISABLE 引脚拉低,或清除软件位(A2h 110.6) | 字节 86 = 00h | 页 10h 字节 130 = 00h → DPTxTurnOn → DPActivated | 对端读到 −40 dBm — 无链路排查清单 |
| 10 | 建链 | PHY/MAC 检测到信号;DAC 上进行 AN/链路训练 | 每通道相同 | 每条数据通路相同 | 电平正常但链路不通 |
| 11 | 监测 | 每隔几秒轮询 A2h 监测量与标志位;TX_FAULT / RX_LOS 引脚 | IntL → 读取标志位 3–21;轮询监测量 | IntL → 模块标志位 + 页 11h 通道标志位;VDM | 告警、闪断 — DDM 数值范围、链路抖动 |
| 12 | 拔出 | MOD_ABS 变高 → 清理状态 | ModPrsL 变高 | ModPrsL 变高 | 去抖失败时残留旧状态 |
对 QSFP 和 CMIS 模块而言,第 3–6 步都发生在 低功耗 状态下:主机会先完成校验,再让光学部分耗电。这就是为什么被锁定或编码错误的模块永远不会点亮激光器,也是为什么一个电气上完全正常的模块,对端却读到 −40 dBm。
主机等待的各项时序
| 等待 | SFP | QSFP | CMIS |
|---|---|---|---|
| 插入后管理接口就绪 | 300 ms | 2 s | ≤ 2 s(MgmtInit),随后进入 LowPwr 状态 |
| 释放低功耗之后 | — | 直到 Data_Not_Ready 清零 | 直到模块状态变为 Ready(最长耗时在页 01h 中广播) |
| 数据通路初始化 | — | — | 按步骤广播(半字节编码:< 1 ms … < 50 min) |
| 使能 Tx 到出光 | t_on ≤ 1 ms | ton_txdis 100 ms / toff 400 ms | DPTxTurnOn 耗时由模块广播 |
| 标志位到中断 | — | ton_IntL 200 ms | 按硬件规范 |
总线级时序(t_WR、clock stretch):双线接口。
各主机策略上的差异点
- 白名单严格程度 — 从"只看厂商名称"到要求带签名的厂商专属信息块,各不相同。
- 拒绝后的处理方式 — 禁用端口、关闭激光器,或允许链路建立但记录日志(第三方光模块)。
- CMIS 支持深度 — 从完整的应用/数据通路控制,到仅仅"释放 LPMode、指望模块自己搞定" (CMIS 问题排查)。
- FEC 与速率默认值 — 可能取自兼容性代码,也可能是静态配置。
- DDM 轮询 — 轮询间隔、阈值是否触发端口关闭、是否应用外部校准(校准)。
查看主机具体停在哪一步的各厂商 CLI 命令:在交换机上核实光模块。
编程器与主机的区别
像 CodingBox 这样的编程器会执行第 1–5 步和第 11 步,但 没有策略判断:它会读取模块公开的所有内容,包括厂商区和密码字节,除非另行要求,否则会让 CMIS 模块保持在低功耗状态,并且永远不会自行使能激光器。这就是为什么一个模块在台架上看起来完全健康,插到端口里却依然会失败 — 台架环节没有第 6 步。
在 CodingBox 中
Check transceiver 会按主机的视角显示第 3–5 步的结果 — 类型、速率、校验和、功耗等级 — 并在模块进入端口之前标记出不一致之处; DDM 则用实时监测量和标志位覆盖第 11 步。
第 6 步(策略)背后的硬件基础,以及第 8 步背后的端口组限制: 交换机内部结构、各家 NOS 如何校验模块。