SATA—Link层状态机
一、概述
Link层的状态机大致可以分为五类:
- 链路层空闲状态机
- 通信异常处理状态机
- 链路层发送状态机
- 链路层接收状态机
- 链路层电源管理下的状态机
二、链路层空闲状态机
链路层空闲状态机共包含两个状态L_IDLE、L_SyncEscape,每个状态下的处理机制与条状条件如下:
1、L_IDLE是在一个帧发送完成后进入,在此状态下发送SYNC原语。在此状态下根据条件共有8中跳转情况。
总结如下:
事件编号 | 触发条件 | 目标状态 | 技术要点 |
---|---|---|---|
1 | Transport层请求帧传输 + PHYRDY²有效 | HL/DL_SendChkRdy | 主机/设备端分离路径(见Note 1) |
2 | Transport层请求Partial态 + PHYRDY²,⁵ | L_TPM_Partial | 需满足Note 5电源管理限制 |
3 | Transport层请求Slumber态 + PHYRDY²,⁵ | L_TPM_Slumber | 低功耗模式入口条件 |
4 | Phy层接收X_RDY_P原语 | L_RcvWaitFifo | 启动接收缓冲准备流程 |
5 | Phy层转发PMREQ_P/S_P + 电源模式使能 | L_PMOff | 进入节能模式(如SATA Partial/Slumber) |
6 | Phy层转发PMREQ_P/S_P + 电源模式禁用 | L_PMDeny | 拒绝节能请求(兼容性保护) |
7 | Phy层转发非法原语 + Transport层无请求²,³ | 保持L_IDLE | 静默丢弃未定义命令(Note 3) |
8 | PHYRDYn信号失效 | L_NoCommErr | 物理层连接异常处理 |
2、L_SyncEscape:该状态用于处理FIS传输异常退出的中间状态,通过发送SYNCP原语实现协议层同步复位。
(1). 进入条件
当满足以下任一条件时进入该状态:
- 传输层主动请求(Transport Layer请求中止当前FIS传输)
- 协议错误触发(检测到非法状态转换或传输超时)
注:该状态仅由SYNC逃逸的发起方(主机或设备)进入,接收端应响应SYNCP但不进入此状态。
(2). 状态行为
状态行为 | 发送SYNC原语 | |
---|---|---|
触发条件 | 目标状态 | 技术含义 |
收到非X_RDYp/SYNCp 的任意DWORD | 保持L_SyncEscape | 持续等待有效同步信号 |
收到X_RDYp 或SYNCp | 跳转至L_IDLE | 正常退出路径(双向握手完成) |
物理层信号PHYRDRYn 有效 | 跳转至L_NoCommErr | 物理层通信异常处理 |
三、通信异常处理状态机
通信异常处理共有四个状态分别为L_NoCommErr、L_NoComm、L_SendAlign、L_RESET。
1、L_NoCommErr:该状态用于向传输层上报PHY层未准备的错误
状态行为 | 上报PHY层未准备的错误 | |
---|---|---|
触发条件 | 目标状态 | 技术含义 |
无条件 | L_NoComm | 只进入L_NoCommErr状态一次,用于上报错误状态,以终止传输层传输 |
2、L_NoComm:等待PHY层通信恢复
状态行为 | 发送ALIGN原语 | |
---|---|---|
触发条件 | 目标状态 | 技术说明 |
PHYRDYn有效 | 保持L_NoComm | 物理层持续未就绪,等待恢复 |
PHYRDY有效 | 跳转L_SendAlign | 启动链路校准流程(发送ALIGNp原语 |
3、L_SendAlign :发送对齐原语
状态行为 | 发送ALIGN原语 | |
---|---|---|
触发条件 | 目标状态 | 技术说明 |
PHYRDYn有效 | 跳转至L_NoCommErr | 上报错误状态 |
PHYRDY有效 | 跳转L_IDLE | 链路恢复 |
4、L_RESET :复位链路层状态至初始条件
状态行为 | 复位链路层 | |
---|---|---|
触发条件 | 目标状态 | 技术说明 |
链路层复位信号置位 | 保持L_RESET状态 | 复位链路层状态 |
链路层复位信号置位取消 | 跳转至L_NoComm | 开始进行链路恢复 |
四、 链路层发送状态机
按照发送数据的顺序,发送状态机共有9个状态,具体状态的行为与跳转条件如下:
该状态是主机端链路层(Device Link)的传输准备状态,核心功能是通过交X_RDY_P/R_RDY_P原语完成主机-设备的双向握手。
触发条件 | 目标状态 | 协议行为 |
---|---|---|
收到R_RDYp 原语 | L_SendSOF | 设备确认就绪,准备发送帧起始符 |
收到X_RDYp 原语 | L_RcvWaitFifo | 设备请求主机切换为接收模式(SATA是半双工,不能同时收发) |
收到非标准DWORD(包括8b/10b错误解码、未定义的原语、违反SATA原语编码规则的数据) | 保持HL_SendChkRdy | 静默丢弃错误数据 |
PHYRDYn信号无效 | L_NoCommErr | 上报物理层错误至传输层,中止当前传输 |
该状态是设备端链路层(Device Link)的传输准备状态,核心功能是通过交X_RDY_P/R_RDY_P原语完成主机-设备的双向握手。
触发条件 | 目标状态 | 协议行为 |
---|---|---|
收到主机R_RDY_P 原语 | L_SendSOF | 确认主机就绪,准备发送帧起始符 |
收到非R_RDY_P 的任意DWORD | 保持DL_SendChkRdy | 持续发送X_RDYp直至收到有效响应 |
PHYRDYn信号有效 | L_NoCommErr | 物理层连接异常,触发错误恢复流程 |
后面的状态机还有很多,后面接着更新