数据链路层是事务层和物理层之间的中间组件。它的主要职责是提供可靠的机制,用于在链路上的两个组件之间交换事务层数据包(TLP)。
3.1 Data Link Layer Overview
数据链路层负责将事务层提供的TLP可靠地传输到另一个组件的事务层。数据链路层提供的服务包括:
- 数据交换
- 接受从传输事务层传输的TLP并将它们传递到传输物理层
- 接受通过链路从物理层接收的TLP并将其传递到接收事务层- 错误检测和重试
- TIP序列号和LCRC生成
- 用于数据链路层重发的TLP包存储
- TLP和数据链路层包(DLLP)的数据完整性检查
- 积极和消极应答DLLP
- 错误报告和日志机制的错误指示
- 链接应答超时重发机制- 初始化和电源管理
- 跟踪链接状态并将活动/重置/断开状态传递到事务层
DLLPs:
- 用于链路管理功能,包括TLP确认、电源管理和流控制信息交换
- 在链路上两个直接连接的组件的数据链路层之间传输
- DLLP在一个链路上的两个组件之间进行点对点发送。TLP可能通过一个或多个中间组件从一个组件路由到另一个组件。
- DLLP和TLP的数据完整性检查是使用通过链路发送的每个数据包中包含的CRC来完成的。DLLP使用16位CRC,而TLP(可以比DLLP长得多)使用32位LCRC。TLP还包括序列号,用于检测一个或多个完整TLP丢失的情况。
- 收到的未通过CRC检查的DLLP将被丢弃。使用DLLP的机制可能会因这种信息丢失而遭受性能损失,但可以自我修复,以便连续的DLLP将取代任何丢失的信息。
- 未通过数据完整性检查(LCRC和序列号)或在从一个组件到另一个组件的传输中丢失的TLP将由发送器重新发送。发送器存储已发送的所有TLP的副本,在需要时重新发送这些副本,并仅在收到来自其他组件的无错误接收的肯定确认时清除这些副本。如果在指定时间段内未收到肯定确认,发送器将自动开始重新传输。接收者可以使用否定确认请求立即重新传输。
数据链路层表现为对事务层具有不同延迟的信息管道。在任何给定的单个链路上,送入发射数据链路层(1和3)的所有TLP将在稍后以相同的顺序出现在接收数据链路层(2和4)的输出处,如图3-1所示。延迟将取决于多种因素,包括管道延迟、链路的宽度和操作频率、链路上的电信号传输以及数据链路层重发引起的延迟。由于这些延迟,发射数据链路层(1和3)可以向发射事务层施加反压力,而接收数据链路层(2和4)将有效信息的存在或不存在传达给接收事务层。
3.2 Data Link Control and Management State Machine
数据链路层跟踪链路的状态。它与事务层和物理层通信链路状态,并通过物理层执行链路管理。数据链路层包含数据链路控制和管理状态机(DLCMSM)来执行这些任务。该状态机的状态如下所述,如图3-2所示。
状态:
- DL_Inactive。物理层报告链路不可操作或没有连接到端口
- DL_Feature (optional) 。物理层报告链路可运行,执行 Link Feature交换
- DL_Init。物理层报告链路可操作,初始化默认虚拟通道VC0的流控制
- DL_Active。正常操作模式
状态输出:
- DL_Down。数据链路层未与链路另一端的组件通信
- DL_Up。数据链路层正在与链路另一端的组件通信
3.2.1 Data Link Control and Management State Machine Rules
规则
- DL_Inactive
- PCI Express hot、warm或冷重置后的初始状态(请参阅第6.6节)。请注意,DL状态不受FLR的影响(请参阅第6.6节)
- 进入DL_Inactive后
- 将所有数据链路层状态信息重置为默认值
- 如果端口支持可选的 Data Link Feature ,则必须清除“Remote Data Link Feature Supported,”和“Remote Data Link Feature Supported Valid”有效字段
- 丢弃数据链路层retry buffer的内容(请参阅第3.6节)
- 处于DL_Inactive状态时
- 向事务层以及数据链路层的其余部分报告DL_Down状态注意:这将导致事务层丢弃任何未完成的事务并在内部终止任何传输TLP的尝试。对于下游端口,这相当于“热移除”。对于上游端口,链路关闭相当于热重置(请参阅第2.9节)。
- 丢弃事务层和物理层的TLP信息
- 不生成或接受DLLP
- 退出到DL_Feature状态,如果
- 该端口支持可选的数据链路功能交换,数据链路功能交换启用位为设置,事务层指示软件未禁用该链路,物理层报告物理LinkUp = 1b
- 退出到DL_lint状态,如果
- 该端口不支持可选的数据链路功能交换,事务层指示该链路未被软件禁用,物理层报告物理LinkUp = 1。
- 该端口支持可选的数据链路功能交换,数据链路功能交换启用位为清除,事务层指示软件未禁用该链路,物理层报告物理LinkUp = 1b
- 上述2个条件取或
- DL_Feature
- 在DL_Feature中
- 执行第3.3节中所述的数据链路功能交换协议
- 报告DL_Down状态
- 具有DL_Down状态的端口的数据链路层被允许丢弃任何收到的TLP,除非已经发送一个或多个ACK DLLP来确认这些TLP。
- 退出到DL_lint状态,如果
- 数据链路功能交换成功完成,物理层继续报告物理链路Up = 1b
- 数据链路功能交换确定远程数据链路层不支持可选的数据链路功能交换协议,物理层继续报告物理LinkUp = 1b
- 上述2个条件取或
- DL_Init
- 在DL_Init中
- 遵循第3.4节中描述的流控制初始化协议,初始化默认虚拟通道VC 0的流控制
- 处于FC_INIT1状态时报告DL_Down状态;处于FC_INIT2状态时报告DL_Up状态
- 具有DL_Down状态的端口的数据链路层被允许丢弃任何收到的TLP,除非已经发送一个或多个ACK DLLP来确认这些TLP。
- 退出到DL_Active状态,如果
- 流量控制初始化成功完成,物理层继续报告物理LinkUp = 1b
- 如果出现以下情况,则终止初始化VC 0的流控制的尝试并退出DL_Inactive
- 物理层报告物理LinkUp = 0
- DL_Active
- DL_Active称为正常工作状态
- 处于DL_Active状态时
- 事务层和物理层接受并传输TLP信息
- 生成和接受DLLP
- 向事务和数据链路层报告DL_Up状态
- 退出到DL_Inactive,如果
- 物理层报告物理LinkUp = 0
- 具有Surprise Down错误报告功能的下游端口(请参阅7.5.3.6部分)必须将从DL_Active到DL_Inactive的转换视为Surprise Down错误,除非以下情况下此错误检测被阻止:
- 软件设置了桥控制寄存器的Secondary bus Reset
- 软件设置了Link Disable
- switch的下游端口因为上游端口的事件导致从DL_Active到DL_Inactive的转换不被视为错误。比如上游端口的Hot reset,上游链路转换到DL_Down,上游端口的Secondary bus Reset
- 通过此端口发送OME_Turn_Off消息。
- 关闭电源,复位,恢复链路的请求发送到物理层之前,不允许转换到DL_Inactive。
- 如果PME_Turn_off/PME_TO_Ack握手失败,则可能会检测到Surprise Down。
- 如果该端口和可热插入插槽关联,(Slot Capabilities寄存器的Hot-Plug Capable bit设置1),Hot-Plug Surprise bit设置1,那么任何到DL_Inactive的转换都不能被视为错误。
- 如果该端口和可热插入插槽关联,(Slot Capabilities寄存器的Hot-Plug Capable bit设置1), Power Controller Control bit设置1,那么任何到DL_Inactive的转换都不能被视为错误。
由上述一