ufs2.2 协议扫盲(十二)

10.7.2 RESPONSE UPIU
RESPONSE UPIU 包含基本 UPIU 报头以及指示命令和设备级别状态的附加信息,该状态由命令执行成功或失败产生。 Target 将在完成请求的任务后生成此 UPIU 并将其发送给 Initiator 设备。 在终止需要Data-Out data传输的命令和发送RESPONSE UPIU 之前,目标设备应等待,直到它接收到与任何未完成的 READY TO TRANSFER UPIUs 相关的所有DATA OUT UPIUs。 此外,目标设备应停止发送用于需要Data-Out data传输并被终止的命令的READY TO TRANSFER UPIU 。ufs2.2 协议扫盲(十二)_第1张图片
1、Response字段将包含 UFS 响应,指示 UFS 定义的构成任务执行的一系列命令、数据和响应 UPIU 的总体成功或失败。

Flag
Description
Flags.O
Flags.O 标志将设置为“1”以指示在任务执行期间发生数据溢出:目标设备有比发起设备请求的更多数据字节要传输。Residual Transfer Count字段将指示未从目标设备传输到启动器设备的可用字节数,反之亦然。 Residual Transfer Count 将设置为可传输的总字节数与 COMMAND UPIU 中接收到的 Expected Data Transfer Length 值的差值。 请参阅下面的进一步说明
Flags.U
Flags.U 标志将设置为“1”以指示在任务执行期间发生数据下溢:目标设备要传输的数据字节少于发起设备请求的数据字节。 Residual Transfer Count 字段将指示未从目标设备传输到启动器设备的字节数,反之亦然。 Residual Transfer Count 将设置为在 COMMAND UPIU 中接收到的 Expected Data Transfer Length 值与实际传输字节数的差值。 请参阅下面的进一步说明。
Flags.D
.D 标志将设置为“1”,表示在任务执行期间发生了 UTP 数据输出不匹配错误:数据输出 UPIU 中的数据缓冲区偏移量和/或数据传输计数参数与相应参数不匹配 在 RTT 请求中。
注 Flags 字段的位分配见之前的文章。 
2、Status:状态字段包含启动器设备发出的特定命令的 特定于命令集的状态。 状态字段是特定于命令集的。 Command Set Type 字段将指示状态与哪个命令集相关联。 特定命令集可能会或可能不会定义 详细扩展状态指示作为sense data。 如果命令需要扩展状态,则该信息将存储在 Sense Data 字段中。
Command Set Type 字段指示 SCSI 命令集时,状态字段将包含标准 SPC 定义的 SCSI 状态值。 下表列出了可能的值。 有关状态条件的详细定义,请参见 [SPC] 或 [SAM]。GOOD 状态表示 SCSI 成功完成,因此不会返回检测数据。CHECK CONDITION 状态要求数据段包含失败命令的sense数据。其他状态值可能会或可能不会返回感知数据。 在这种情况下,数据段长度字段中的非零值表示该 UPIU 在数据段区域中包含sense数据。
ufs2.2 协议扫盲(十二)_第2张图片
'M' 表示该字段的强制实现以及如果fixed则为指定的值。 ‘O’表示该字段的支持是可选的; 如果不支持,则应在字段中插入零值,否则将按所述指示值。 n/a 表示“不适用”于 UFS。
GOOD - 此状态表示设备已完成命令且没有错误。
CHECK CONDITION - 此状态表示设备已完成命令但有错误或需要其他操作来处理结果。 发生此状态时,将在响应 UPIU 中返回最后处理命令的有效sense数据。
CONDITION MET - 不用于 UFS。
BUSY - 此状态表示逻辑单元正忙。 当逻辑单元无法接受命令时,将返回此状态。 稍后发出命令是标准恢复操作。
RESERVATION CONFLICT - 当执行命令将导致现有预留冲突时返回此状态。 UFS 可能支持设备的保留区域,具体取决于设备类型和功能。
TASK SET FULL - 当逻辑单元由于资源不足(例如任务队列已满或命令执行所需的内存暂时不可用)而无法处理命令时返回此状态。
ACA ACTIVE - 当存在 ACA 条件时返回此状态。 进一步定义见[SAM]。
TASK ABORTED - 当命令被另一个 I_T nexus 上的命令或任务管理功能中止并且控制模式页面 TAS 位设置为 1 时,应返回此状态。 由于在 UFS 中,TAS 位为零,因此永远不会出现 TASK ABORTED 状态代码。
3、Device Information

Device Information字段提供设备级别的信息,不一定与执行命令的逻辑单元相关。 一般来说,这些信息是关于发展速度比常规命令慢得多的事件,并且主机响应延迟并不重要。 使用此字段可避免对某些 UFS 属性执行连续轮询。 仅定义了设备信息字段的第 0 位,所有其他位保留并应设置为零。

0b:所有异常源均未激活
1b:至少有一个异常源处于活动状态  
异常来源包括:后台操作、动态容量、系统数据池等。之后看看异常事件机制。

4、Data Segment Length
Data Segment Length
字段将包含数据段中的有效字节数。 在 RESPONSE UPIU 中,数据段将包含sense数据字节和sense数据长度字段。 当该字段为 0 时,表示 UPIU 中没有数据段区域,因此不返回 Sense Data。 此版本的标准,当 Command Set Type 字段指示 SCSI Command Set 时,Sense Data 字节数为 18,因此该字段将包含值 20(18 字节 Sense Data + 2 字节 Sense Data Length = 20 字节)。 如前所述, Data Segment字段大小位于 32 位 (DWORD) 边界上。 Data Segment Length字段表示数据段区域中“有效”字节的数量,因此它的值可能不是四的整数倍。
5、Residual Transfer Count
仅当 Flags.U 或 Flags.O 字段之一设置为“1”时,此字段才有效,否则此字段将包含零。 当 Flags.O 字段设置为“1”时,该字段指示未从/向发起方设备传输的字节数,因为预期数据传输长度字段包含的值低于预期要传输的目标设备 . 换句话说,目标设备有更多字节要接收/发送以完成请求,但发起方设备不期望超过预期数据传输长度中指示的数量。 例如,发起方设备可能有意请求的字节数少于它知道目标设备可以传输的字节数,因为它只需要前 N 个字节。
当 Flags.U 字段设置为“1”时,该字段指示未从/向发起方传输的字节数,因为预期数据传输长度字段包含高于可用数据字节的值。 换句话说,目标设备接收/发送的字节数少于发起方请求传输的字节数。 例如,当发起方设备不知道目标设备实际拥有多少字节并且它要求最大或超过可能时,它可能故意请求比目标设备必须传输的更多字节。
Flags.O 
Flags.U
Residual
Transfer
Count
Description
0 0 0 传输的预期数据长度字节
1 0 N 目标设备预计向发起设备发送 N 个字节
0 1 N 发起者设备预计从目标设备接收 N 个字节
1 1 X 非法条件


6、Sense Data Fields
sense数据字段将包含有关错误情况的附加信息。 对于 SCSI 命令,它们将提供为固定格式检测数据定义的前 18 个检测数据字节的副本,这对应于 70h 的响应代码值。 有关详细信息,请参阅后边表格。 成功执行的命令通常不需要返回 Sense Data,因此在这种情况下 Data Segment 可能为空,Data Segment Length 可能为零值。 如果有效 Sense Data 字段的长度加上 2 不是 32 位的倍数,则 Sense Data 字段将用零填充以将数据放置在下一个最近的 32 位边界上。

7、SCSI Sense Data Fields
当使用响应代码值 70h 的格式时,感知数据字段将包含标准的 18 字节 SPC 定义的感知数据。 有关详细信息,请参阅 [SPC]。

Sense Data 由三个级别的错误代码组成,每个级别都越来越详细。 目的是为应用程序客户端提供一种方法,以在各个详细级别确定错误或异常情况的原因。 Sense Key 提供了发生错误或异常情况并导致当前命令成功完成的一般类别。 附加检测代码字段 (ASC) 中提供了更多和更精细的错误详细信息。 Additional Sense Code Qualifier (ASCQ) 字段进一步细化了错误信息。 当指示错误或异常情况时,需要实现 Sense Key 值。 不需要执行本文档中未描述的 ASC 或 ASCQ 值; 如果实现不需要更精细的错误细节,则可以在这些字段中放置零值。

所有在错误或异常情况下终止的 SCSI 命令将自动在 RESPONSE UPIU 中返回 Sense Data,从而使主机不必发出后续的 REQUEST SENSE 命令来检索附加的感知错误信息。

8、Sense Data Length
Sense Data Length 字段指示随后的有效 Sense Data 字节数。 如果已添加填充字节以达到 32 位边界,则感知数据长度加 2 可能小于数据段区域中包含的字节数。 成功执行的命令通常不需要返回 Sense Data,因此在这种情况下,Data Segment 区域可能为空,Data Segment Length 可能为零值。 因错误或异常终止的命令可能会或可能不会返回感知数据。 如果感知数据长度指示值为零,则该错误条件不返回感知数据。 数据段长度中的零值也表示没有返回检测数据。 否则,感知数据长度将包含一个值,该值指示感知数据信息的附加字节数。当使用 SCSI 命令集时,Sense Data Length 字段应指示值 18。

9、Sense Data Format
表 10-17 描述了提供有关先前执行的 SCSI 命令的详细错误信息的感知数据结构。 返回 18 个字节,并将 Additional Sense Length 字段设置为值 10。 “M”表示该字段的强制实现,如果fix则指定值。 ‘O’表示该字段的支持是可选的; 如果不支持,则应在字段中插入零值,否则将按所述指示值。
截取比较重要的两个:

SENSE KEY 用于操作期间的正常错误处理。 附加感知代码 (ASC) 和附加感知代码限定符 (ASCQ) 主要用于详细的诊断和记录(事后)信息。 如果设备服务器没有与错误或异常情况相关的进一步信息,则这些字段应设置为零。 通常,除了少数几个,它们不是强制性的,它们可能被设置为零,这意味着没有提供额外的信息。 请参阅 [SPC] 以获取附加感知代码和附加感知代码限定符的列表。

10、Sense Key

Sense Key 值提供了一种对错误和异常情况进行分类的方法。 Sense Key 指示特定类型的错误。 Additional Sense Code 和 Additional Sense Code Qualifier 可用于进一步详细说明和描述 Sense Key 指示的条件。 Sense Key特定于特定命令执行的操作。

                                                     Sense Key
Value
Description
00h NO SENSE – 表示没有要报告的特定感知关键信息。 这将是成功执行命令的结果。
01h RECOVERED ERROR – 表示在设备服务器执行错误恢复操作后,最后一个命令成功完成。 进一步的细节可以通过检查额外的检测字节(ASC 和 ASCQ 字段)来确定。
02h NOT READY ——表示此时无法访问寻址的逻辑单元。
03h MEDIUM ERROR – 表示由于介质中的缺陷或错误恢复失败导致的不可恢复错误条件,最后一个命令不成功。
04h HARDWARE ERROR – 表示设备服务器检测到不可恢复的硬件错误。
05h ILLEGAL REQUEST – 指示在命令描述符块中或在某些命令提供的附加参数数据中存在非法参数值。 如果设备服务器在命令描述符块中检测到无效参数,则它将终止命令而不更改媒体
06h UNIT ATTENTION – 表示设备已重置或意外开机或可移动媒体已更改。
07h DATA PROTECT – 表示在受此操作保护的块上尝试了读取或写入介质的命令。 不应执行读或写操作。
08h BLANK CHECK - 表示在读取或写入时遇到空白或未格式化的媒体。
09h VENDOR SPECIFIC – 此 Sense Key 可用于报告供应商特定的错误或异常情况。
0Ah COPY ABORTED – 不适用于 UFS 设备。 保留的
0Bh ABORTED COMMAND – 表示设备服务器中止了命令的执行。 应用程序客户端可能能够通过重试命令来恢复。
0Ch
Reserved
0Dh VOLUME OVERFLOW - 表示缓冲的外围设备已到达分区末尾,数据可能保留在尚未写入介质的缓冲区中。
0Eh MISCOMPARE – 表示源数据与从媒体读取的数据不匹配。
0Fh Reserved

 


 

你可能感兴趣的:(UFS,linux,c语言,架构,驱动开发,C)