SATA系列专题之三:3.2 Transport Layer传输层FIS Retry机制解析
一、故事前传
在之前的文章中,已经解析了SATA协议的部分相关内容。
较为详细解释请见之前的文章:
1,浅析SATA Physical Layer物理层OOB信号;
2,SATA Link layer链路层解析2.0-2.3;
3,SATA Transport layer链路层解析3.0-3.1;
我们这里主要解析Transport layer FIS Retry机制相关内容。
二、FIS Retry机制解析
上回说到,FIS是一种用于Host和device之间信息传输的机制,每个FIS的格式都是固定的,并且对应唯一的ID,SATA Spec定义了14类FIS ID。
其实在很多场景下,FIS的传输会出现Error,那怎么办呢?
不怕不怕,SATA协议给我们准备了Retry机制可以救场~
Transport Layer在Host端和Device分别有一个Buffer: FIS Tx Buffer和FIS Rx Buffer(如下图)。
当Host端将FIS从Transport Layer传至Link layer的时候,FIS其实在Transport Layer的FIS Tx Buffer有一个备份。
当device Link layer解析到传过来的FIS有错误发生时,会返回一个Primitive基元“R_ERR”,告诉Host端:“您刚才传输的FIS出了点问题,麻烦您发送一遍”。
Host端收到R_ERR反馈会再讲备份在FIS Tx Buffer的FIS重新发送一遍。
但是,有一点需要注意,并不是所有的FIS都可以用Retry机制修复Error:
DATA FIS最大长度为2049 DWs, 但是Transport layer并没有这么大Buffer,FIS Tx/Rx Buffer只要7 DWs,所以DATA FIS无法用Retry机制。
BIST只用在测试诊断场景,所以BIST也无法用Retry机制。
所有FIS Retry机制状态如下表: