ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 10 8/11 Information Library (日本語) |
パート I Solaris プラットフォーム用デバイスドライバの設計
Sun Common SCSI Architecture の概要
probe() エントリポイント (SCSI ターゲットドライバ)
attach() エントリポイント (SCSI ターゲットドライバ)
detach() エントリポイント (SCSI ターゲットドライバ)
getinfo() エントリポイント (SCSI ターゲットドライバ)
scsi_alloc_consistent_buf() 関数
21. ドライバのコンパイル、ロード、パッケージ化、およびテスト
ターゲットドライバでは、ヘッダーファイル <sys/scsi/scsi.h> をインクルードする必要があります。
SCSI ターゲットドライバは次のコマンドを使用して、バイナリモジュールを生成する必要があります。
ld -r xx xx.o -N"misc/scsi"
ホストバスアダプタドライバは、probe(9E) または attach(9E) ルーチンのいずれかが呼び出される前に、ターゲットドライバの scsi_device(9S) 構造体を割り当てて初期化します。この構造体には、一般的な情報とデバイス固有の情報を含む情報領域を指すポインタなど、各 SCSI 論理ユニットに関する情報が格納されます。システムに接続されている論理ユニットごとに 1 つの scsi_device(9S) 構造体が存在します。ターゲットドライバは、ddi_get_driver_private(9F) を呼び出すことで、この構造体へのポインタを取得できます。
注意 - ホストバスアダプタドライバは、ターゲットデバイスの 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; };
各表記の意味は次のとおりです。
SCSI 資源の割り当てのためのルーチンに渡されるデータ構造体です。
ターゲットの dev_info 構造体へのポインタです。
ターゲットドライバが使用する mutex です。この mutex はホストバスアダプタドライバによって初期化され、ターゲットドライバによって、デバイスごとの mutex として使用できます。この mutex は、scsi_transport(9F) または scsi_poll(9F) への呼び出しにわたって保持しないでください。mutex の詳細については、第 3 章マルチスレッドを参照してください。
ターゲットデバイスの SCSI 照会データへのポインタです。scsi_probe(9F) ルーチンは、バッファーを割り当て、照会データでそのバッファーを満たして、このフィールドに追加します。
デバイスから送られた SCSI 要求検知データを収めるバッファーを指すポインタです。ターゲットドライバは、このバッファーを割り当てて管理する必要があります。「attach() エントリポイント (SCSI ターゲットドライバ)」を参照してください。
ターゲットドライバが使用するポインタフィールドです。このフィールドは、ターゲットドライバの非公開の状態構造体を指すポインタの格納によく使われます。
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 */ };
各表記の意味は次のとおりです。
scsi_init_pkt(9F) によって設定されたターゲットドライバのアドレスです。
ターゲットドライバのプライベートデータを格納する場所です。pkt_private は通常、コマンドの buf(9S) ポインタを保存するために使用されます。
完了ルーチンのアドレスです。ホストバスアダプタドライバはドライバがコマンドをトランスポートしたときにこのルーチンを呼び出します。コマンドのトランスポートは、コマンドが成功したことを意味するわけではありません。ターゲットがビジー状態になっていた可能性があります。タイムアウト期間が経過する前にターゲットが応答しなかった可能性もあります。pkt_time フィールドの説明を参照してください。ターゲットドライバは、このフィールドで有効な値を指定する必要があります。ドライバへの通知が不要な場合は、この値を NULL にできます。
注 - 2 つの異なる SCSI コールバックルーチンが用意されています。pkt_comp フィールドは、ホストバスアダプタが処理を完了したときに呼び出される completion callback ルーチンを指します。また、現在使用できない資源が利用可能になりそうなときに呼び出される resource callback ルーチンが用意されています。scsi_init_pkt(9F) のマニュアルページを参照してください。
たとえば、切断するための特権なしにコマンドをトランスポートしたり (FLAG_NODISCON)、コールバックを無効にしたり (FLAG_NOINTR) するために、追加の制御情報を提供します。詳細については、scsi_pkt(9S) のマニュアルページを参照してください。
タイムアウト値 (秒単位) です。コマンドがこの時間内に完了しない場合、ホストバスアダプタは pkt_reason を CMD_TIMEOUT に設定して、完了ルーチンを呼び出します。ターゲットドライバはこのフィールドを、コマンドの実行にかかる可能性のある最大時間より大きい値に設定する必要があります。タイムアウトを 0 に設定すると、タイムアウトは要求されません。タイムアウトの起点は、コマンドが SCSI バス上で送信された時点です。
SCSI ステータスの完了ブロックへのポインタです。このフィールドの値はホストバスアダプタドライバによって格納されます。
ターゲットデバイスに送信される実際のコマンドが格納されている、SCSI コマンド記述子ブロックへのポインタです。ホストバスアダプタドライバが、このフィールドの解釈を行うことはありません。ターゲットドライバはこのフィールドに、ターゲットデバイスが処理できるコマンドを入れる必要があります。
未処理の操作内容です。pkt_resid が使用される方法に応じて、pkt_resid フィールドには 2 つの異なる用途があります。scsi_init_pkt(9F) コマンドでの DMA 資源の割り当てのために pkt_resid が使用される場合、pkt_resid は割り当てできないバイト数を示します。DMA 資源は、DMA ハードウェアの分散と集中や、その他のデバイスの制限のために、割り当てができない場合もあります。コマンドのトランスポート後、pkt_resid は転送できないデータバイト数を示します。このフィールドの値は、完了ルーチンが呼び出される前に、ホストバスアダプタドライバによって格納されます。
コマンドの状態を示します。コマンドの進行状況につれて、ホストバスアダプタドライバがこのフィールドに値を格納します。次に示す 5 つのコマンドの状態ごとに 1 ビットがこのフィールドに設定されます。
STATE_GOT_BUS – バスの取得
STATE_GOT_TARGET – ターゲットの選択
STATE_SENT_CMD – コマンドの送信
STATE_XFERRED_DATA – データの転送 (適切な場合)
STATE_GOT_STATUS – デバイスからのステータスの受信
ホストバスアダプタドライバによって設定されたトランスポート関連の統計情報が格納されます。
完了ルーチンが呼び出された理由を示します。完了ルーチンがこのフィールドをデコードします。ルーチンはその後、適切な処理を実行します。トランスポートエラーが発生せず、コマンドが完了すると、このフィールドは CMD_CMPLT に設定されます。このフィールドにほかの値がある場合はエラーを示します。コマンドが完了したら、ターゲットドライバは pkt_scbp フィールドでチェック条件のステータスを調べる必要があります。詳細については、scsi_pkt(9S) のマニュアルページを参照してください。