scsisesdd SAM 设备驱动程序

用途

支持 串行连接 SCSI 机柜服务 设备。

语法

#include <sys/devinfo.h>
#include <sys/scsi.h>
#include <sys/scses.h>

描述

特殊文件 /dev/ses0/dev/ses1 ... 提供对 SCSI 机柜设备的 I/O 访问和控制功能。

典型 SCSI 机柜服务操作是使用 ioctl关闭 子例程实现的。

子例程将所选 设备 置于 "互斥访问" 方式。 此方式是单入方式; 即,一次只能有一个进程将其打开。 仅当 设备 当前未打开时,才能将其打开。 如果尝试打开一个已经打开的 device 文件,将返回 -1 值,并将 errno 全局变量设置为 EBUSY 值。

ioctl 子例程

以下 ioctl 操作对 SCSI 机柜服务 设备可用:
操作 描述
IOCINFO 返回 /usr/include/sys/devinfo.h 文件中定义的 devinfo 结构。
Sespassthru

在成功打开设备后,此操作将提供向指定机柜发出任何 SCSI 命令的方法。 设备驱动程序不会执行此 ioctl 操作的错误恢复或日志记录失败。

SCSI 状态字节和适配器状态字节通过 arg 参数返回,该参数包含 sc_passthru 结构 (在 /usr/include/sys/scsi.h 文件中定义) 的地址。 如果 SESPASSTHRU 操作返回 -1 值,并且 errno 全局变量被设置为非零值,则所请求的操作失败。 在此情况下,调用者必须对返回的状态字节进行求值,以确定操作失败的原因以及必须执行的恢复操作。

应该将 sc_passthru 结构的 版本 字段设置为 SCSI_VERSION_1的值,并且 SES 不支持可变长度的 CDB。

在完成 SESPASSTHRU ioctl 请求时, 残值 字段指示设备未完全满足此请求的剩余数据。 成功完成后, 残值 字段指示设备没有所请求的所有数据,或者设备拥有的数据量小于所请求的数据量。 发生故障时,用户需要检查 status_validity 字段以确定是否存在有效的 SCSI 总线问题。 在此情况下, 残值 字段指示此请求的设备未能完成的字节数。

开发信息 结构定义了该命令的最大传输大小。 如果尝试传输的大小超过最大传输大小,子程序将返回 -1 值,并将 errno 全局变量设置为 EINVAL 值、并将 einval_arg 字段设置为 SC_PASSTHRU_INV_D_LEN 值(定义在 /usr/include/sys/scsi.h文件中定义)。 请参阅 小型计算机系统接口 (SCSI) 规范 ,以了解特定设备的请求检测数据的格式。

设备需求

对于 SCSI 机柜服务设备,存在以下硬件需求:

  • 设备必须支持 SCSI-3 机柜服务规范修订版 4 或更高版本。
  • 可以使用不同于机柜内 SCSI 设备的 SCSI 标识的 SCSI 标识来对设备进行寻址。
  • 在接收 SCSI 查询到页面代码 0xC7时,设备必须 "行为正常"。 这意味着,如果设备无法通过检查条件进行查询页面代码 C7 ,那么下一个 SCSI 命令将清除该检查条件。 不需要显式请求检测。
  • 如果设备在标准查询数据中将其 ANSI 版本报告为 3 (SCSI-3) ,那么它必须正确拒绝所有对于 luns 8-31 无效的请求 (即,设备不能忽略 Lun ID 中的高位,因此不能将 Lun 8 视为 Lun 0 ,以此类推)。

示例

以下是用于填充 Sespassthru ioctl 的 sc_passthru 结构以发出 Standard Inquiry SCSI CDB 的示例代码:
    struct sc_passthru passthru;
    passthru.version = SCSI_VERSION_1;
    passthru.timeout_value = 30;
    passthru.command_length = 6;
    passthru.q_tag_msg = SC_SIMPLE_Q;
    passthru.flags = B_READ;
    passthru.autosense_length = SENSE_LEN;
    passthru.autosense_buffer_ptr = &sense_data[0];    /* Buffer for Auto Sense Data */
    passthru.data_length = 0xFF;
    passthru.buffer = data;            /* Data buffer address to store inquiry data */
    passthru.scsi_cdb[0] = SCSI_INQUIRY;
    passthru.scsi_cdb[1] = 0x00;
    passthru.scsi_cdb[2] = 00; /* Page Code */
    passthru.scsi_cdb[3] = 00;
    passthru.scsi_cdb[4] = 0xFF;
    passthru.scsi_cdb[5] = 0x00;

错误条件数

在以下情况下,针对此设备的 ioctl 子例程失败:

错误 描述
EBUSY 已尝试打开已打开的设备。
EEXIST 设备表中已存在设备。
ENOMEM 分配内存失败。
EFAULT 输入了非法用户地址。
EINVAL 对于 Sespassthru ioctl 操作,数据缓冲区长度超过了 开发信息 结构中定义的最大值。
EINVAL 尝试了不受支持的 ioctl 操作。
EINVAL 已尝试配置仍处于打开状态的设备。
EINVAL 给出了非法的配置命令。
EINVAL 变量 _cdb_ptrvariable_cdb_length 字段是在 sc_passthru 结构中设置的。
EIO 找不到目标设备或目标设备未响应。
EIO 目标设备已指示未恢复的硬件错误。
电子文件 已尝试对已具有最大允许已打开设备数的适配器执行打开操作。
ENODEV 尝试了访问未定义的设备。
ENODEV 已尝试关闭未定义的设备。
ENXIO ioctl 子例程提供的参数或设备号无效,或者未配置该设备。
EPERM 尝试的子例程需要适当的权限。
ETIMEDOUT I/O 操作已超过给定的计时器值。

文件

描述
/dev/ses0, /dev/ses1... /dev/sesn 提供一个接口以允许 SCSI 设备驱动程序访问 SCSI 机柜服务设备。