SATA系列专题之三:3.4 Transport Layer传输层Error处理机制解析

发布于:2022-12-21 ⋅ 阅读:(751) ⋅ 点赞:(0)

一、故事前传

在之前的文章中,已经解析了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大致分为四类:

  1. Command无法正常完成。这部分会记录在ATA的Status/Error register(也可以称为ATA shadow register).

  2. FIS传输错误。这部分记录在SATA定义的Error register.

  3. SATA链路传输error。这部分也记录在在SATA定义的Error register.

  4. HBA(Host Bus Adapter)错误。这部分会记录在SATA定义的Error register或者IO bus register.

从上图我们也可以看到,所有的status和error register都放在HBA。Device也可以检测到Error,但是要上报给Host, 主要途径有两个:

  1. 在command执行过程中发现错误后,Device通过向Host发送Register FIS-D2H来更新ATA status & error

  2. 在FIS传输过程中发生错误,Device向Host发送Primitive基元“R_ERR”。不过,这种情况下,Host不能判断错误的根本原因。

SATA环境下产生的错误可能发生在任何一层,每层检测的status & error类型如下图:

发现了问题,最终还得去解决。对于各层上报的error,根据错误类型以及错误严重程度,应对措施主要有:

  1. 冻结(Freeze)。这个时候就说明了错误的严重性很高,无法修复,需要做reset才能清除错误;

  2. 中断(Abort)。表明错误比较持久,相应的cmd已经失败。需要告诉Host作中断处理。

  3. 重新发送(Retry)。表明错误是短暂并且不影响SATA系统运行,比如CRC error。这个错误如果是在Transport Layer或者以下发生的,由硬件启动retry机制。如果发生在Transport Layer之上了,就要依赖软件启动retry机制。

  4. 追踪/忽略(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:

本文含有隐藏内容,请 开通VIP 后查看