一、故事前传
在之前的文章中,已经解析了SATA协议的部分相关内容。
较为详细解释请见之前的文章:
1,浅析SATA Physical Layer物理层OOB信号;
2,SATA Link layer链路层解析2.0-2.3;
3,SATA Transport layer链路层解析3.0-3.3;
我们这里主要解析Transport layer Error Reporting机制相关内容。
二、Error Reporting
SATA Spec中提到SATA环境支持ATA error以及SATA error的检测。SATA环境中发生的error大致分为四类:
Command无法正常完成。这部分会记录在ATA的Status/Error register(也可以称为ATA shadow register).
FIS传输错误。这部分记录在SATA定义的Error register.
SATA链路传输error。这部分也记录在在SATA定义的Error register.
HBA(Host Bus Adapter)错误。这部分会记录在SATA定义的Error register或者IO bus register.
从上图我们也可以看到,所有的status和error register都放在HBA。Device也可以检测到Error,但是要上报给Host, 主要途径有两个:
在command执行过程中发现错误后,Device通过向Host发送Register FIS-D2H来更新ATA status & error。
在FIS传输过程中发生错误,Device向Host发送Primitive基元“R_ERR”。不过,这种情况下,Host不能判断错误的根本原因。
SATA环境下产生的错误可能发生在任何一层,每层检测的status & error类型如下图:
发现了问题,最终还得去解决。对于各层上报的error,根据错误类型以及错误严重程度,应对措施主要有:
冻结(Freeze)。这个时候就说明了错误的严重性很高,无法修复,需要做reset才能清除错误;
中断(Abort)。表明错误比较持久,相应的cmd已经失败。需要告诉Host作中断处理。
重新发送(Retry)。表明错误是短暂并且不影响SATA系统运行,比如CRC error。这个错误如果是在Transport Layer或者以下发生的,由硬件启动retry机制。如果发生在Transport Layer之上了,就要依赖软件启动retry机制。
追踪/忽略(Track/ignore)。表明这是个可以纠正的错误,不严重,可以忽略。不过,此类error虽然可以被纠正,但是也会对SATA的整体性能产生不利影响。
(1) ATA Status & Error Register
当有ATA error发生时,ATA status会将ERR bit置"1"。如果ERR bit=0, 那么Error register相应的内容均为无效。
Error Register具体定义如下:
(2) SATA定义的相关Error Register
SATA Status(SStatus) Register:
SATA Error(SError) Register: