JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
デバイスドライバの記述     Oracle Solaris 11.1 Information Library (日本語)
このドキュメントの評価
search filter icon
search icon

ドキュメントの情報

はじめに

パート I Oracle Solaris プラットフォーム用デバイスドライバの設計

1.  Oracle Solaris デバイスドライバの概要

2.  Oracle Solaris カーネルとデバイスツリー

3.  マルチスレッド

4.  プロパティー

5.  イベントの管理とタスクのキュー

6.  ドライバの自動構成

7.  デバイスアクセス: プログラム式入出力

8.  割り込みハンドラ

9.  ダイレクトメモリーアクセス (DMA)

10.  デバイスメモリーおよびカーネルメモリーのマッピング

11.  デバイスコンテキスト管理

12.  電源管理

13.  Oracle Solaris ドライバの強化

14.  階層化ドライバインタフェース (LDI)

パート II 特定の種類のデバイスドライバの設計

15.  文字デバイスのドライバ

16.  ブロックデバイスのドライバ

17.  SCSI ターゲットドライバ

ターゲットデバイスの概要

Sun Common SCSI Architecture の概要

一般的な制御フロー

SCSA 関数

ハードウェア構成ファイル

宣言とデータ構造体

scsi_device 構造体

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

SCSI ターゲットドライバの自動構成

probe() エントリポイント (SCSI ターゲットドライバ)

attach() エントリポイント (SCSI ターゲットドライバ)

detach() エントリポイント (SCSI ターゲットドライバ)

getinfo() エントリポイント (SCSI ターゲットドライバ)

資源割り当て

scsi_init_pkt() 関数

scsi_sync_pkt() 関数

scsi_destroy_pkt() 関数

scsi_alloc_consistent_buf() 関数

scsi_free_consistent_buf() 関数

コマンドの構築とトランスポート

コマンドの構築

ターゲット機能の設定

コマンドのトランスポート

同期 scsi_transport() 関数

コマンドの完了

パケットの再利用

自動要求検知モード

ダンプの処理

SCSI オプション

18.  SCSI ホストバスアダプタドライバ

19.  ネットワークデバイスのドライバ

20.  USB ドライバ

21.  SR-IOV ドライバ

パート III デバイスドライバの構築

22.  ドライバのコンパイル、ロード、パッケージ化、およびテスト

23.  デバイスドライバのデバッグ、テスト、およびチューニング

24.  推奨されるコーティング方法

パート IV 付録

A.  ハードウェアの概要

B.  Oracle Solaris DDI/DKI サービスのサマリー

C.  64 ビットデバイスドライバの準備

D.  コンソールフレームバッファードライバ

E.  pci.conf ファイル

索引

ドキュメントの品質向上のためのご意見をください
簡潔すぎた
読みづらかった、または難し過ぎた
重要な情報が欠けていた
内容が間違っていた
翻訳版が必要
その他
Your rating has been updated
貴重なご意見を有り難うございました!

あなたの貴重なご意見はより良いドキュメント作成の手助けとなります 内容の品質向上と追加コメントのためのアンケートに参加されますか?

宣言とデータ構造体

ターゲットドライバでは、ヘッダーファイル <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) を呼び出すことで、この構造体へのポインタを取得できます。


注意

注意 - ホストバスアダプタドライバは、ターゲットデバイスの 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 の詳細については、第 3 章マルチスレッドを参照してください。

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 フィールドは、ホストバスアダプタが処理を完了したときに呼び出される completion callback ルーチンを指します。また、現在使用できない資源が利用可能になりそうなときに呼び出される resource callback ルーチンが用意されています。scsi_init_pkt(9F) のマニュアルページを参照してください。


pkt_flags

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

pkt_time

タイムアウト値 (秒単位) です。コマンドがこの時間内に完了しない場合、ホストバスアダプタは pkt_reasonCMD_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) のマニュアルページを参照してください。