数据链路层协议
数据链路层作为处理层和物理层的中间层,为处理层TLP 在链路中传递提供可靠机制。数据链路层主要负责TLP的可靠传输。所以数据链路层完成的主要任务是:1、数据交换。接收发送方处理层的TLP包,并送到物理层。另外从物理层接收TLP 包并送到接收端的处理层。2、出错检测和裁决。LCRC和序列号(TLP Sequence Number)的生成;存储发送端的TLP用于再试重发;为TLP和DLLP做数据完成性检测(crc校验);DLLP 的ack和nack响应;错误指示;链接确认超时重试机制。3、初始化和电源管理。跟踪链路状态并传送链路活动、链路复位、链路失去连连等状态给处理层;4、生成DLLP。用于链路管理功能包括TLP确认、电源管理、流程控制信息(VC通道初始化)交流。在链接两端的数据链路层点对点传输.
数据完整性检测就是为DLLP和TLP做crc校验DLLP使用crc-16,TLP使用32bit的LCRC,此外,TLP还有一个序列号(sequence Number),用于检测TLP丢失与否。LCRC和sequence Number检测有误的TLP或者在发送过程中丢失的TLP,将被发送端重新发送。发送端存放TLP的备份,在需要的时候将备份发送或者在收到接收端的正确接收确认后清除备份。
数据链路层跟踪链路连接的状态,并和处理层和物理层交流链路状态,通过物理层来完成对链路的管理。链路层中包含状态机DLCMSM(Data Link Control and Management State Machine)
来完成这些任务,以下详细介绍。
●DL_Inactive – Physical Layer reporting Link is non-operational
or nothing is connected to the Port
●DL_Init – Physical Layer reporting Link is operational, initialize
Flow Control for the default Virtual Channel
●DL_Active – Normal operation mode
Status output:
●DL_Down – The Data Link Layer is not communicating with the
component on the other side of the Link.
●DL_Up – The Data Link Layer is communicating with the
component on the other side of the Link.
Dl_Inactive状态随PCIE复位之后,将所有数据链路状态信息恢复到默认值,并放弃数据层重试缓冲器中的内容。当数据链路处于DL_Inactive状态时,将通知处理层链路处于非连接状态(DL_Down),处理层将停止发送TLP。数据链路层将不产生和接收DLLP。当接收到处理层的链路不是因软件致不使能的报告和物理层的Physical LinkUP=1b(一个物理层连接标志位)时,状态转换至DL_Init。
处于DL_Init状态时,初始化流程控制成为VC0通道,当在FC_INIT1初始化阶段时输出DL_Down链路状态给处理层,在FC_INIT2初始化阶段时输出DL_UP连接状态给处理层。在初始
化成功和物理层继续传递Physical LinkUp=1b后,状态转换至
DL_Active。如果Physical LinkUp=0b,状态转换至DL_Inactive。
DL_Active就是总线正常运转的状态,数据包TLP和DLLP正常发送和接收,发送DL_Up至处理层。物理层的Physical LinkUp=0b报告使得状态转换至DL_Inactive。
接下来就要提到流程控制初始化协议(Flow Control Initialization)。上电或者互连复位后,总线正常操作前,需要流程控制初始化至默认虚拟通道VC0。如果需要额外使能其他虚拟通道,必须在初始化VC0之后初始化相应虚拟通道的流程控制机制。VC初始化过程包括以下两个状态:1、FC_INIT1,2、FC_INIT2。
首先介绍FC_INIT1状态,在需要初始化VC通道时进入
FC_INIT1状态,条件是链路处于DL_Init状态,VCx=VC0;某VC 通道(1-7)被软件使能。在FC_INIT1状态,处理层阻止TLP的发送,数据链路层为VC通道按以下顺序发送InitFC1 DLLP:1、InitFC1—p;2、InitFC1—NP;3、InitFC1—Cpl。这些DLLP包的发送至少持续24us,并且建议按特定频率重复发送。在这期间,数据链路层不能阻止其他已经被初始化的虚拟通道的数据包发
送(包括物理层初始化信息、ack和nak DLLP、TLP)。对接收到的InitFC1和InitFC2 DLLP按以下处理:1.记录FC值(以credit 为单位的基本缓冲空间值和类型)2.P、NP、CPL的FC值被记录后,设置Flag FI1。在Flag FI1被设置后,状态转至FC_INIT2。
在FC_INIT2状态,所做的处理基本与FC_INIT1状态相同,
除了对接收到的InitFC2 DLLP处理:以接收到的InitFC2 DLLP设置flag FI2。之后,流程控制初始化结束。
上面多次提到DLLP,是用于支持链路操作数据信息包。
▲Ack DLLP:TLP序列数据确认(sequence Number),用于表明成功接收到某些TLP。
▲Nak DLLP:TLP序列数据否定确认,用于初始化数据链路层再试机制。
▲InitFC1、InitFC2、UpdataFC DLLP:流程控制初始化。
▲此外还有电源管理DLLP。
数据链路包(DLLP)规范,包结构如下:
保留信息R应设置为0,并被接收端忽略,采用CRC-16bit校验。DLLP Type的编码如下: