ata1.00: exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen 硬盘问题

测试发现嵌入式linux vfat 文件系统的sata固态硬盘偶然启动时出现异常打印如下:

ata1.00: exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen
ata1.00: failed command: READ FPDMA QUEUED
ata1.00: cmd 60/08:d8:00:00:00/00:00:00:00:00/40 tag 27 ncq 4096 in
res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
ata1.00: status: { DRDY }
ata1: hard resetting link
ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
ata1.00: configured for UDMA/133
ata1.00: device reported invalid CHS sector 0
ata1: EH complete
sda:
sda: detected capacity change from 0 to 512110190592
sd 0:0:0:0: [sda] Attached SCSI disk

寻找说明,参考Libata error messages - ata Wiki (kernel.org)

1. 错误每一行都有前缀,前缀ata3.00解释为:

  • ata:该前缀指明这是条libata端口或设备信息
  • 1:端口号,从1开始记
  • 00:设备号,一般从0记,除非端口多路复用或是使用PATA主从设备

 

2. 异常描述行(第一行)给出异常处理状态(EH)概述

exception Emask 0x0 SAct 0x8000000 SErr 0x0 action 0x6 frozen

  • Emask:错误分类掩码(代码中的 AC_ERR_xxx )
  • SAct:SATA SActive 寄存器
  • SErr:SATA SError 寄存器
  • action: ATA_EH_xxx操作,如revalidate,softreset,hardreset(参见include / linux / libata.h)
  • frozen:如果存在,表示端口被冻结为EH
  • t3:这项也是可选的,表重试次数,t3表示3次

3. cmd行(第二行)给出了发送到设备的ATA命令(taskfile)

cmd 60/08:d8:00:00:00/00:00:00:00:00/40 tag 27 ncq 4096 in

上述命令按’/’及空格分割分5段解释:

  • 60:命令号?
  • 08:d8:00:00:00:(第一个)Feature : 需查询源文件
  • 00:00:00:00:00:(第二个)HOB Feature : HOB NSect : HOB LBA L : HOB LBA M : HOBLBA H
  • a0:设备/头
  • tag : NCQ tag 号, NCQ如果没有激活或不适用,则为0。

4. (第三行)包含当前ATA设备寄存器的dump信息及错误摘要:

res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)

5. ATA状态扩展

status: { DRDY }

将输出任务文件中返回的ATA状态寄存器扩展为其组件位:

  • Busy:设备忙(所有其他位无效)
  • DRDY:设备就绪,正常的情况下一般为1。
  • DRQ:数据准备好通过PIO发送/接收
  • DF: 设备故障
  • ERR: 错误(有关详细信息,请参阅错误寄存器)

6. ATA错误扩展
如果错误寄存器中的任何位置1,则错误寄存器内容将扩展为其组件位,例如:

error: { ICRC ABRT }

  • ICRC:Ultra DMA传输时接口CRC错误 - 通常是线或电源问题,驱动程序设置错误的Ultra DMA模式也会导致该问题
  • UNC : 无法纠正的错误 - 通常是由于磁盘上的坏扇区造成的
  • IDNF :未找到请求的地址
  • ABRT : 命令已中止 - 或者命令不支持,无法完成或接口CRC存在问题(如上例,与ICRC一起出)

7. SATA SError扩展
如果SATA SError寄存器中的任何位置1,则SError寄存器内容将扩展为其组件位,例如:

SError:{PHYRdyChg CommWake}

这些寄存器的位通常是由SATA host接口设置的,以响应SATA链路上的错误。除非设备热插拔或拔出操作,否则这些位不会被设置。如果这些位被置上了,则强烈怀疑是硬件问题(通常是SATA线不行或电源不良或供电不足)。

    • RecovData:出现数据完整性错误,但接口已恢复
    • RecovComm:设备和主机之间的通信暂时丢失,但已重连上了
    • UnrecovData:发生数据完整性错误,但接口没有恢复
    • Persist:持久通信或数据完整性错误
    • Proto:检测到SATA协议不符合规范
    • HostInt:主设备总线适配器内部错误
    • PHYRdyChg:PhyRdy信号状态改变
    • PHYInt:PHY内部错误
    • CommWake:PHY检测到COMWAKE(PHY唤醒)
    • 10B8B:10b到8b的解码错误
    • Dispar:检测到不正确的差异
    • BadCRC:链路层CRC错误
    • Handshk: 帧传输返回接收到了R_ERR握手响应
    • LinkSeq:链路状态机错误
    • TrStaTrns :传输层状态转换错误
    • UnrecFIS:收到无法识别的FIS(帧信息结构)
    • DevExch:设备存在状态改变

8. 关于第二行failed command: READ FPDMA QUEUED

    参考关于Linux报错解决方案:READ FPDMA QUEUED-CSDN博客failed command: READ FPDMA QUEUED - 裸睡的猪 - 博客园 (cnblogs.com)

 可能跟内核对SSD硬盘的兼容相关。

    强制关机导致内核提示

     FAT-fs (mmcblk0): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
      FAT-fs (sda): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

 

综上,未确认cmd具体含义,仅从简单信息看,似乎有超时发生,且发生了硬件重连;

最早有发生掉电锁盘为只读的情况,所以启动脚本添加“umount 再 mount硬盘”指令,之后才偶尔出现以上信息,目前看无太大影响,准备换ext4文件格式测试。

 

此贴也记录了一些状态信息:ata1.01: status: { DRDY } - Ubuntu中文论坛

posted @ 2024-03-14 09:57  zensi  阅读(643)  评论(0编辑  收藏  举报