Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

宣言とデータ構造体

ターゲットドライバでは、ヘッダーファイル <sys/scsi/scsi.h> をインクルードする必要があります。

SCSI ターゲットドライバは次のコマンドを使用して、バイナリモジュールを生成する必要があります。

ld -r xx xx.o -N"misc/scsi"

scsi_device 構造体

ホストバスアダプタドライバは、probe(9E) または attach(9E) ルーチンのいずれかが呼び出される前に、ターゲットドライバの scsi_device(9S) 構造体を割り当てて初期化します。この構造体には、一般的な情報とデバイス固有の情報を含む情報領域を指すポインタなど、各 SCSI 論理ユニットに関する情報が格納されます。システムに接続されている論理ユニットごとに 1 つの scsi_device(9S) 構造体が存在します。ターゲットドライバは、ddi_get_driver_private(9F) を呼び出すことで、この構造体へのポインタを取得できます。


Caution

注意  - ホストバスアダプタドライバは、ターゲットデバイスの dev_info 構造体内にある非公開フィールドを使用するため、ターゲットドライバが ddi_set_driver_private(9F) を使用してはいけません。


scsi_device(9S) 構造体には、次のフィールドがあります。

struct scsi_device {
    struct scsi_address           sd_address;    /* opaque address */
    dev_info_t                    *sd_dev;       /* device node */
    kmutex_t                      sd_mutex;
    void                          *sd_reserved;
    struct scsi_inquiry           *sd_inq;
    struct scsi_extended_sense    *sd_sense;
    caddr_t                       sd_private;
};

ここでは:

sd_address

SCSI リソースの割り当てのためのルーチンに渡されるデータ構造体です。

sd_dev

ターゲットの dev_info 構造体を指すポインタです。

sd_mutex

ターゲットドライバが使用する mutex です。この mutex はホストバスアダプタドライバによって初期化され、ターゲットドライバによって、デバイスごとの mutex として使用できます。この mutex は、scsi_transport(9F) または scsi_poll(9F) への呼び出しにわたって保持しないでください。mutex の詳細については、マルチスレッドを参照してください。

sd_inq

ターゲットデバイスの SCSI 照会データへのポインタです。scsi_probe(9F) ルーチンは、バッファーを割り当て、照会データでそのバッファーを満たして、このフィールドに追加します。

sd_sense

デバイスから送られた SCSI 要求検知データを収めるバッファーを指すポインタです。ターゲットドライバは、このバッファーを割り当てて管理する必要があります。attach エントリポイント (SCSI ターゲットドライバ)を参照してください。

sd_private

ターゲットドライバが使用するポインタフィールドです。このフィールドは、ターゲットドライバの非公開の状態構造体を指すポインタの格納によく使われます。

scsi_pkt 構造体 (ターゲットドライバ)

scsi_pkt 構造体には次のフィールドが含まれます。

struct scsi_pkt {
    opaque_t  pkt_ha_private;         /* private data for host adapter */
    struct scsi_address pkt_address;  /* destination packet is for */
    opaque_t  pkt_private;            /* private data for target driver */
    void     (*pkt_comp)(struct scsi_pkt *);  /* completion routine */
    uint_t   pkt_flags;               /* flags */
    int      pkt_time;                /* time allotted to complete command */
    uchar_t  *pkt_scbp;               /* pointer to status block */
    uchar_t  *pkt_cdbp;               /* pointer to command block */
    ssize_t  pkt_resid;               /* data bytes not transferred */
    uint_t   pkt_state;               /* state of command */
    uint_t   pkt_statistics;          /* statistics */
    uchar_t  pkt_reason;              /* reason completion called */
};

ここでは:

pkt_address

scsi_init_pkt(9F) によって設定されたターゲットデバイスのアドレスです。

pkt_private

ターゲットドライバのプライベートデータを格納する場所です。pkt_private は通常、コマンドのbuf(9S) ポインタを保存するために使用されます。

pkt_comp

完了ルーチンのアドレスです。ホストバスアダプタドライバはドライバがコマンドをトランスポートしたときにこのルーチンを呼び出します。コマンドのトランスポートは、コマンドが成功したことを意味するわけではありません。ターゲットがビジー状態になっていた可能性があります。タイムアウト期間が経過する前にターゲットが応答しなかった可能性もあります。pkt_time フィールドの説明を参照してください。ターゲットドライバは、このフィールドで有効な値を指定する必要があります。ドライバへの通知が不要な場合は、この値を NULL にできます。


注 - 2 つの異なる SCSI コールバックルーチンが用意されています。pkt_comp フィールドは、ホストバスアダプタが処理を完了したときに呼び出される完了コールバックルーチンを指します。また、現在使用できないリソースが利用可能になりそうなときに呼び出される resource callback ルーチンが用意されています。scsi_init_pkt(9F) のマニュアルページを参照してください。
pkt_flags

たとえば、切断するための特権なしにコマンドをトランスポートしたり (FLAG_NODISCON)、コールバックを無効にしたり (FLAG_NOINTR) するために、追加の制御情報を提供します。詳細については、scsi_pkt(9S) のマニュアルページを参照してください。

pkt_time

タイムアウト値 (秒単位) です。コマンドがこの時間内に完了しない場合、ホストバスアダプタは pkt_reason を CMD_TIMEOUT に設定して、完了ルーチンを呼び出します。ターゲットドライバはこのフィールドを、コマンドの実行にかかる可能性のある最大時間より大きい値に設定する必要があります。タイムアウトを 0 に設定すると、タイムアウトは要求されません。タイムアウトの起点は、コマンドが SCSI バス上で送信された時点です。

pkt_scbp

SCSI ステータスの完了ブロックへのポインタです。このフィールドの値はホストバスアダプタドライバによって格納されます。

pkt_cdbp

ターゲットデバイスに送信される実際のコマンドが格納されている、SCSI コマンド記述子ブロックへのポインタです。ホストバスアダプタドライバが、このフィールドの解釈を行うことはありません。ターゲットドライバはこのフィールドに、ターゲットデバイスが処理できるコマンドを入れる必要があります。

pkt_resid

未処理の操作内容です。pkt_resid が使用される方法に応じて、pkt_resid フィールドには 2 つの異なる用途があります。scsi_init_pkt(9F) コマンドでの DMA リソースの割り当てのために pkt_resid が使用される場合、pkt_resid は割り当てできないバイト数を示します。DMA リソースは、DMA ハードウェアの分散と集中や、その他のデバイスの制限のために、割り当てができない場合もあります。コマンドのトランスポート後、pkt_resid は転送できないデータバイト数を示します。このフィールドの値は、完了ルーチンが呼び出される前に、ホストバスアダプタドライバによって格納されます。

pkt_state

コマンドの状態を示します。コマンドの進行状況につれて、ホストバスアダプタドライバがこのフィールドに値を格納します。次に示す 5 つのコマンドの状態ごとに 1 ビットがこのフィールドに設定されます。

  • STATE_GOT_BUS – バスの取得

  • STATE_GOT_TARGET – ターゲットの選択

  • STATE_SENT_CMD – コマンドの送信

  • STATE_XFERRED_DATA – データの転送 (適切な場合)

  • STATE_GOT_STATUS – デバイスからのステータスの受信

pkt_statistics

ホストバスアダプタドライバによって設定されたトランスポート関連の統計情報が格納されます。

pkt_reason

完了ルーチンが呼び出された理由を示します。完了ルーチンがこのフィールドをデコードします。ルーチンはその後、適切な処理を実行します。トランスポートエラーが発生せず、コマンドが完了すると、このフィールドは CMD_CMPLT に設定されます。このフィールドにほかの値がある場合はエラーを示します。コマンドが完了したら、ターゲットドライバは pkt_scbp フィールドでチェック条件のステータスを調べる必要があります。詳細については、scsi_pkt(9S) のマニュアルページを参照してください。