USB 大容量存储客户机设备驱动程序的错误条件

当您使用 scsidisk 设备驱动程序时, ioctlopenreadwrite 子例程的可能 errno 值包括以下值:

描述
EACCES 指示下列其中一种情况:
  • 尝试打开当前以 DiagnosticExclusive Access 方式打开的设备。
  • 尝试在已打开的设备上打开 Diagnostic 方式会话。
  • 尝试在 Diagnostic 方式下运行除 ioctlclose 子例程以外的子例程。
  • 在未处于 Diagnostic 方式的设备上尝试了 DKIOLCMD 操作。
  • 在未处于 Exclusive Access 方式的设备上尝试了 DK_CD_MODE ioctl 子例程操作。
EBUSY 指示下列其中一种情况:
  • 尝试在已打开的设备上以 Exclusive Access 方式打开会话。
  • 目标设备由另一个发起方保留。
EFAULT 指示无效用户地址。
EFORMAT 指示目标设备具有未格式化的介质,或者该介质格式不兼容。
互联网络促进 指示 CD-ROM 驱动器正在进行中的播放音频操作。
EINVAL 指示下列其中一种情况:
  • 尝试对未配置为使用 SCSI-2 play-audio 命令的设备执行 DKAUDIO (play-audio) 操作。
  • readwrite 子例程提供的 n字节参数不是块大小的偶数倍数。
  • 大于 255 字节的检测数据缓冲区长度对于 DKIORDSE ioctl 子例程操作无效。
  • 数据缓冲区长度超过了在 DKIORDSEDKIOLCMD ioctl 子例程操作的 devinfo 结构中定义的最大值。
  • 尝试了不受支持的 ioctl 子例程操作。
  • 已尝试配置仍处于打开状态的设备。
  • 提供了无效的配置命令。
  • 已将 DKPMR (阻止介质除去) , DKAMR (允许介质除去) 或 DKEJECT (弹出介质) 命令发送到不支持可移动介质的设备。
  • 已将 DKEJECT (弹出介质) 命令发送到当前在驱动器中锁定其介质的设备。
  • 数据缓冲区长度超过了对策略操作定义的最大值。
EIO 指示下列其中一种情况:
  • 找不到目标设备或目标设备未响应。
  • 目标设备指示不可恢复的硬件错误。
EMEDIA 指示下列其中一种情况:
  • 目标设备指示不可恢复的介质错误。
  • 媒体已更改。
电子文件 指示已尝试对已具有最大允许打开设备数的适配器执行 open 操作。
ENODEV 指示下列其中一种情况:
  • 尝试了访问未定义的设备。
  • 已尝试关闭未定义的设备。
ENOTREADY 指示驱动器中没有任何介质。
ENXIO 指示下列其中一种情况:
  • ioctl 子例程提供了无效参数。
  • 尝试在硬盘结束后执行 readwrite 操作。
EPERM 指示尝试的子例程需要适当的权限。
ESTALE 指示已弹出只读光盘 (未由用户先关闭) ,然后重新插入或替换为第二个光盘。
ETIMEDOUT 指示 I/O 操作超过了指定的计时器值。
EWRPROTET 指示下列其中一种情况:
  • 在只读介质上尝试了需要读/写方式的 open 操作。
  • 尝试对只读介质执行 write 操作。

可靠性和可维护性信息

USB 硬盘,闪存驱动器, RDX 设备, CD-ROM 驱动器和读/写光盘驱动器将返回以下错误:

错误 描述
异常中止命令 指示设备已结束该命令。
Adapter 错误 指示该适配器返回了错误。
良好完成 表示命令成功完成。
硬件错误 指示在运行该命令时或在自检期间发生不可恢复的硬件故障。
非法的请求 指示命令或命令参数无效。
介质错误 指示该命令以不可恢复的介质错误条件结束。
未就绪 指示逻辑单元处于脱机状态或缺少介质。
已恢复的错误 指示在应用某些恢复后该命令成功。
单元辅助操作请求 指示设备已复位或已打开电源。

在错误记录模板中为硬盘,闪存驱动器, RDX , CD-ROM 和读/写光学介质错误定义的字段将按照以下结构进行记录:

/* Bulk transfer cmd and status blocks */
typedef struct mstor_cbw {
    uint32_t cbw_signature;     /* Always "USBC" little endian */
    uint32_t cbw_tag;              /* Command identification  */
    fld32_t cbw_dlen;              /* Data length  */
    uchar cbw_flags;               /* Indicates data in or data out */
    uchar cbw_lun;                 /* Logical unit number, 0-15  */
    uchar cbw_cblen;               /* Significant bytes of the cmd blk */
    uchar cbw_cb[16];              /* Command block itself  */
    uchar cbw_rsvd;
} mstor_cbw_t;
 
/* For error logging */
struct mstor_err_rec {
    struct err_rec0 log;
    uint cmd_error;
    mstor_cbw_t cbw;
    char sense_data[128];
};
 
LABEL:          DISK_ERRx
IDENTIFIER:     xxxxxxxx
 
Date/Time:       Wed Aug  4 11:40:43 CDT 2010
Sequence Number: 80
Machine Id:      00000A2AD400
Node Id:         node10
Class:           H
Type:            PERM
Resource Name:   usbms0
Resource Class:  usbms
Resource Type:   0806500b
Location:        U78A5.001.WIH00AD-P1-T1-L1-L2-L3
 
Description
Probable Causes
User Causes
Failure Causes
 
SENSE DATA
1111 2222 2222 3333 3333 4444 4444 5566 LLCC CCCC CCCC CCCC CCCC CCCC CCCC CCCC
CCRR SSSS KKSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS
SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS
SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS
SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSSS SSOO SSNN
 
Data Representation Legend
--------------------------
   cmd_error              1    Command Error Value 
  (cmd_error values can be negative which are logged as 2's complement. 
   For these USB specific error values refer below or /usr/include/sys/usbdi.h.
  For error values which are positive Please refer to /usr/include/sys/errno.h file for error description)
 
Bulk transfer Command and Status Blocks
   cbw_signature         2    Always .USBC. in ASCII - “5553 4243”
   cbw_tag                  3    Command Identification
   cbw_dlen                4    Data Length
   cbw_flags               5    Indicates Data IN or OUT
   cbw_lun                  6    LUN Id
   cbw_cblen               L    CDB (Command Descriptor Bytes) length
   cbw_cb                  C    CDB - SCSI/ATAPI Command Set
   cbw_rsvd                R    Reserved
 
Sense data
   Sense data             S
   Sense key              K
   ASC                    c
   ASCQ                   q
   Driver Open Count      O
   Location               N   Device Driver log location

介质错误的错误记录值

描述
注释 指示硬盘驱动器,闪存驱动器, RDX , CD-ROM 或读/写光学介质错误。
等于指示硬件错误的值 H
报告 等于表示在生成错误报告时必须包含此错误的 True 值。
日志 等于 True 值,指示在发生此错误时必须创建错误日志条目。
警告 等于表示此错误不能具有警报的值 False。
错误类型 等于指示永久故障的 Perm 的值。
错误描述 (_D) 等于指示磁盘操作失败的值 1312。
概率原因 等于指示介质的 5000 的值。
用户原因 等于指示介质有缺陷的值为 5100。
用户操作 等于以下值:
  • 1601 ,指示必须更换可移动介质并再次尝试。
  • 00E1,用于指示执行问题确定过程。
本能原因 无。
指令操作 无。
故障原因 等于以下值:
  • 5000 ,表示介质发生故障。
  • 6310 ,它指示磁盘驱动器故障。
失败操作 等于以下值:
  • 1601 ,表示必须更换可移动介质,然后重试。
  • 00E1,用于指示执行问题确定过程。
详细数据 (_D) 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注: err_rec 结构中的 Detail_Data 字段包含 mstor_err_rec 结构。 err_rec 字段在 /usr/include/sys/errids.h 文件中定义。 Detail_Data 字段跟在前面的结构示例中提到的相同图例后面。

请参阅小型计算机系统接口 (SCSI) 规范,以了解特定设备的请求检测数据的格式。

硬件错误的错误记录值

下表中列出了在错误记录模板中为硬盘错误, CD-ROM 错误和读/写光学硬件错误以及为硬异常终止命令错误定义的字段:

描述
注释 指示硬盘驱动器,闪存驱动器, RDX , CD-ROM 或读/写光学硬件错误。
等于用于指示硬件错误的值 H。
报告 等于表示在生成错误报告时必须包含此错误的 True 值。
日志 等于 True 值,指示在发生此错误时必须创建错误日志条目。
警告 等于 False 值,指示无法向此错误发出警报。
错误类型 等于指示永久故障的 Perm 的值。
错误描述 (_D) 等于指示磁盘操作失败的值 1312。
概率原因 等于用于指示磁盘驱动器的值 6310。
用户原因 无。
用户操作 无。
本能原因 无。
指令操作 无。
故障原因 等于以下值:
  • 6310 ,它指示磁盘驱动器故障。
  • 6330 ,指示磁盘驱动器电子部件发生故障。
失败操作 等于 00E1 的值,指示必须执行问题确定过程。
详细数据 (_D) 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注: err_rec 结构中的 Detail_Data 字段包含 mstor_err_rec 结构。 err_rec 字段在 /usr/include/sys/errids.h 文件中定义。 它遵循前面结构示例中提到的相同图例。

适配器检测到的硬件故障的错误记录值

以下字段是在错误记录模板中针对硬盘, CD-ROM 和读/写光学介质错误以及针对适配器检测到的硬件错误定义的:

描述
注释 指示适配器检测到的硬盘,闪存驱动器, RDX , CD-ROM 或读/写光学硬件故障。
等于用于指示硬件错误的值 H。
报告 等于 True 值,指示在生成错误报告时必须包含此错误。
日志 等于 True 的值,指示在发生此错误时必须创建错误日志条目。
警告 等于 False 值,指示无法向此错误发出警报。
错误类型 等于指示永久故障的 Perm 的值。
错误描述 (_D) 等于指示磁盘操作失败的值 1312。
概率原因 等于以下值:
  • 3452 ,指示设备电缆发生故障
  • 6310 ,表示磁盘驱动器发生故障
用户原因 无。
用户操作 无。
本能原因 无。
指令操作 无。
故障原因 等于以下值:
  • 3452 ,指示存储设备电缆发生故障
  • 6310 ,表示磁盘驱动器发生故障
  • 6330 ,指示磁盘驱动器的电子故障
失败操作 等于 0000 的值,表示必须执行问题确定过程。
详细数据 (_D) 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注: err_rec 结构中的 Detail_Data 字段包含 mstor_err_rec 结构。 err_rec 字段在 /usr/include/sys/errids.h 文件中定义。 它遵循前面结构示例中提到的相同图例。

已恢复错误的错误记录值

在硬盘, CD-ROM 和读/写光学介质恢复的错误的错误记录模板中定义了以下字段:

描述
注释 指示硬盘, CD-ROM 或读/写光盘已恢复错误。
等于用于指示硬件错误的值 H。
报告 等于表示在生成错误报告时必须包含此错误的 True 值。
日志 等于 True 值,指示在发生此错误时必须创建错误日志条目。
警告 如果值为 False ,那么表示无法向此错误发出警报。
错误类型 等于用于指示临时故障的 Temp 值。
错误描述 (_D) 等于用于指示物理卷操作失败的值 1312。
概率原因 等于以下值:
  • 5000 ,指示介质发生故障
  • 6310 ,表示磁盘驱动器发生故障
用户原因 等于 5100 的值,表示介质有缺陷。
用户操作 等于以下值:
  • 0000 ,这指示必须执行问题确定过程
  • 1601 ,表示必须更换可移动介质,然后重试
本能原因 无。
指令操作 无。
故障原因 等于以下值:
  • 5000 ,指示介质发生故障
  • 6310 ,表示磁盘驱动器发生故障
失败操作 等于以下值:
  • 1601 ,表示必须更换可移动介质,然后重试
  • 00E1,用于执行问题确定过程
详细数据 (_D) 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注: err_rec 结构中的 Detail_Data 字段包含 mstor_err_rec 结构。 err_rec 字段在 /usr/include/sys/errids.h 文件中定义。  它遵循与其他错误相同的图注。

未知错误的错误记录值

以下字段在硬盘, CD-ROM 和读/写光学介质未知错误的错误记录模板中进行定义:

描述
注释 指示硬盘, CD-ROM 或读/写光盘的未知故障。
等于用于指示硬件错误的值 H。
报告 等于表示在生成错误报告时必须包含此错误的 True 值。
日志 等于 True 值,指示在发生此错误时必须创建错误日志条目。
警告 如果值为 False ,那么表示无法向此错误发出警报。
错误类型 等于 "Unkn" 值,指示错误类型未知。
错误描述 (_D) 等于 FE00 的值,它指示未确定的错误。
概率原因 等于以下值:
  • 3300 (指示适配器故障)
  • 5000 ,指示介质发生故障
  • 6310 ,表示磁盘驱动器发生故障
用户原因 无。
用户操作 无。
本能原因 无。
指令操作 无。
故障原因 等于 FFFF 值,该值指示故障原因未知。
失败操作 等于以下值:
  • 00E1,用于执行问题确定过程
  • 1601 ,它指示必须更换可移动介质并重试
详细数据 (_D) 等于 156,11 和 HEX 的值。 此值指示十六进制格式。
注: err_rec 结构中的 Detail_Data 字段包含 mstor_err_rec 结构。 err_rec 字段在 /usr/include/sys/errids.h 文件中定义。 它遵循与其他错误相同的图注。

特殊文件

usbcd USB 客户机设备驱动程序将原始文件和块特殊文件用于其功能。 下表中按设备类型列出了 usbcd 设备驱动程序使用的特殊文件:

表 1. 用于 usbcd 设备驱动程序的特殊文件
设备 特殊文件 描述
硬盘,闪存驱动器, RDX 设备 /dev/rusbms0, /dev/rusbms1, ..., /dev/rusbmsn 为 USB 客户机设备驱动程序提供用于访问字符 (原始 I/O 访问和控制功能) 的接口。
/dev/usbms0, /dev/usbms1, ..., /dev/usbmsn 为 USB 客户机设备驱动程序提供用于访问块 I/O 的接口。
CD-ROM , DVD-RAM , Blu-ray 只读设备: /dev/rcd0, /dev/rcd1, ..., /dev/rcdn 为 USB 客户机设备驱动程序提供用于访问字符 (原始 I/O 访问和控制功能) 的接口。
/dev/cd0, /dev/cd1, ..., /dev/cdn 为 USB 客户机设备驱动程序提供用于访问块 I/O 的接口。
注: 特殊文件名上的前缀 r 指示驱动器作为原始设备而不是块设备进行访问。 使用硬盘,闪存驱动器, RDX , CD-ROM 或读/写光盘驱动器执行原始 I/O 时,所有数据传输都需要达到设备块大小的倍数。 此外,对原始设备驱动程序执行的所有 lseek 子例程都必须生成一个文件指针值,该值是设备块大小的倍数。