Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

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) のマニュアルページを参照してください。