SCIOCMD SCSI 适配器设备驱动程序 ioctl 操作

用途

提供一种向 SCSI 设备发出任何 SCSI 命令的方法。

描述

SCIOCMD 操作允许调用程序向所选适配器发出 SCSI 命令。 系统管理例程可以使用此命令来帮助进行 SCSI 设备的配置。

SCIOCMD 操作的 arg 参数是在 /usr/include/sys/scsi.h 字段中定义的 sc_passthru 结构的地址。 sc_passthru 参数允许调用者选择要发送该命令的 SCSI 和 LUN IDS。

SCSI 状态字节和适配器状态字节是通过 sc_passthru 结构返回的。 如果 SCIOCMD 操作返回 -1 值,并且 errno 全局变量被设置为非零值,则表示请求的操作失败。 如果发生这种情况,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及必须执行的恢复操作。

如果 SCIOCMD 操作因 sc_passthru 结构中的字段值无效而失败,则子例程返回 -1 值、errno 全局变量被设置为 EINVALeinval_arg 字段被设置为无效值字段的字段编号(版本字段从 1 开始)。 对于 Einval_arg 字段 0 值为 0 表示没有其他信息可用。

sc_passthru 结构的版本字段可以设置为 /usr/include/sys/scsi.h 文件中 SC_VERSION_2 的值,用户可以提供以下字段:
  • 变量 _cdb_ptr 是指向包含 Variable SCSI cdb 的缓冲区的指针。
  • variable_cdb_length 确定 变量 _cdb_ptr 字段所指向的 欧洲委员会 变量的长度。
在完成 SCIOCMD ioctl 请求后, 残值 字段指示设备未完全满足此请求的剩余数据。 在成功完成时, 残值 字段将指示设备不具有所请求的所有数据,或者设备具有的数据量小于所请求的数据量。 在故障完成时,用户必须检查 status_validity 字段以确定是否存在有效的 SCSI 总线问题。 在此情况下, 残值 字段将指示此请求的设备未能完成的字节数。

开发信息 结构定义了该命令的最大传输大小。 如果尝试传输的大小超过最大传输大小,子程序将返回 -1 值,将 errno 全局变量设置为 EINVAL 值,并将 einval_arg 字段设置为 18 值。

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

返回值

成功完成后, SCIOCMD 操作将返回值 0。 如果不成功,将返回 -1 值,并将 errno 全局变量设置为以下值之一:
描述
EIO 发生系统错误。 请考虑尝试该操作几次 (三次) ,因为另一次尝试可能成功。 如果发生 EIO 错误,并且 status_validity 字段设置为 SC_SCSI_ERROR,那么 scsi_status 字段具有有效值,并且必须进行检查。

如果 status_validity 字段为零并且在连续试用时保持不变,那么将发生不可恢复的错误。

如果 status_validity 字段为 SC_SCSI_ERROR ,并且 scsi_status 字段包含 检查条件 状态,那么必须使用 SCIOCMD ioctl 来发出 SCSI 请求检测以恢复检测数据。

EFAULT 用户进程复制失败。
EINVAL 设备未打开,或者调用者将 sc_passthru 结构中的某个字段设置为无效值。
EACCES 该适配器处于诊断方式。
ENOMEM 内存请求失败。
ETIMEDOUT 命令已超时。 请考虑多次尝试该操作,因为另一次尝试可能成功。
ENODEV 该设备未响应。
ETIMEDOUT 在超过超时值之前,该操作未完成。

文件

描述
/dev/scsi0, /dev/scsi1, ... /dev/scsin 为所有 SCSI 设备驱动程序提供接口以访问 SCSI 设备或适配器。