scsisesdd SAM デバイス・ドライバー

目的

シリアル接続 SCSI エンクロージャー・サービス 装置をサポートします。

構文

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

説明

スペシャル・ファイル /dev/ses0/dev/ses1 ... SCSI エンクロージャー装置への入出力アクセスおよび制御機能を提供します。

標準的な SCSI エンクロージャー・サービス操作は、 オープンIoctl、および 閉じる サブルーチンを使用してインプリメントされます。

オープン サブルーチンは、選択された 装置 を排他的アクセス・モードにします。 このモードは、単独でしか使用できません。つまり、一度に 1 つのプロセスしか開くことができません。 装置 は、現在開かれていない場合にのみ開くことができます。 既にオープンされている 装置 をオープンしようとすると、値 -1 が戻され、 エラー番号 グローバル変数に エプシーの値が設定されます。

ioctl サブルーチン

SCSI エンクロージャー・サービス デバイスでは、以下の ioctl 操作を使用できます。
実行 説明
IOCINFO /usr/include/sys/devinfo.h ファイルに定義された devinfo 構造体を戻します。
セスパススルー

デバイスが正常にオープンされると、この操作は、指定されたエンクロージャーに SCSI コマンドを発行する手段を提供します。 デバイス・ドライバーは、この ioctl 操作のエラー・リカバリーやロギングの失敗を実行しません。

SCSI 状況バイトおよびアダプター状況バイトは、 arg パラメーターを介して戻されます。このパラメーターには、( /usr/include/sys/scsi.h ファイルに定義されている) sc_passthru 構造体のアドレスが入っています。 セスパススルー 操作が値 -1 を戻し、 エラー番号 グローバル変数がゼロ以外の値に設定されている場合、要求された操作は失敗しています。 この場合、呼び出し側は、戻された状況バイトを評価して、操作が失敗した理由と取るべきリカバリー・アクションを判別する必要があります。

sc_passthru 構造体の バージョン フィールドは SCSI_VERSION_1の値に設定する必要があり、SES は可変長 CDB をサポートしません。

SESPASSTHRU ioctl 要求が完了すると、 残差 フィールドには、装置がこの要求に対して完全には満たさなかった残りのデータが示されます。 正常終了の場合、 残差 フィールドは、要求されたすべてのデータが装置に含まれていないか、または装置のデータ量が要求された量より少ないことを示します。 失敗した場合、ユーザーは 状況の妥当性 フィールドを調べて、有効な SCSI バス問題が存在するかどうかを判別する必要があります。 この場合、 残差 フィールドは、この要求に対してデバイスが完了できなかったバイト数を示します。

デバイス情報 構造は、コマンドの最大転送サイズを定義します。 最大転送サイズを超えて転送しようとすると、サブルーチンは -1 の値を戻し、 エラー番号 グローバル変数を エインヴァルの値に設定し、 EINVAL_ARG フィールドを SC_PASSTHRU_INV_D_LEN ( /usr/include/sys/scsi.h ファイルで定義されている) の値に設定します。 特定の装置の要求センス・データの形式については、「 Small Computer System Interface (SCSI) 仕様 」を参照してください。

装置要件

SCSI エンクロージャー・サービス・デバイスには、以下のハードウェア要件があります。

  • デバイスは、 SCSI-3 エンクロージャー・サービス仕様改訂 4 以降をサポートしている必要があります。
  • デバイスは、エンクロージャー内の SCSI デバイスの SCSI ID とは異なる SCSI ID からアドレス指定できます。
  • SCSI 照会をページ・コード 0xC7に受信する場合、デバイスは「適切に動作する」必要があります。 これは、デバイスがチェック条件でページ・コード C7 への照会に失敗すると、次の SCSI コマンドによってチェック条件がクリアされることを意味します。 明示的な要求センスは必要ありません。
  • 装置が標準照会データで ANSI バージョンが 3 (SCSI-3) であることを報告する場合は、LUN 8 から 31 に対して有効でないすべての要求を正しく拒否する必要があります (つまり、装置は Lun ID の上位ビットを無視できないため、Lun 8 を Lun 0 として扱うことができません (以下同様)。

以下は、 セスパススルー ioctl が標準照会 SCSI CDB を発行するための sc_passthru 構造体を埋めるコード例です。
    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 データ・バッファー長が、 セスパススルー ioctl 操作の デバイス情報 構造体に定義されている最大長を超えました。
EINVAL サポートされない ioctl 操作が試行されました。
EINVAL まだ開かれているデバイスを構成しようとしました。
EINVAL 正しくない構成コマンドが指定されました。
EINVAL 変数 cdb_ptr または 変数 cdb_length フィールドは、 sc_passthru 構造体に設定されます。
EIO ターゲット・デバイスが見つからないか、応答していません。
EIO ターゲット装置が回復されていないハードウェア・エラーを示しています。
EMFILE すでに最大許容数のオープン・デバイスを持つアダプターに対してオープン操作が試みられました。
ENODEV 定義されていない装置にアクセスしようとしました。
ENODEV 定義されていない装置をクローズしようとしました。
ENXIO Ioctl サブルーチンによって提供されたパラメーターまたは装置番号が無効であるか、または装置が構成されていません。
EPERM 試行されたサブルーチンには適切な権限が必要です。
ETIMEDOUT 入出力操作が指定されたタイマー値を超えました。

ファイル

項目 説明
/dev/ses0, /dev/ses1... /dev/sesn SCSI デバイス・ドライバーが SCSI エンクロージャー・サービス・デバイスにアクセスできるようにするインターフェースを提供します。