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

印刷ビューの終了

更新: 2014 年 9 月
 
 

GLDv2 ドライバの要件

GLDv2 ベースのドライバでは、ヘッダーファイル <sys/gld.h> をインクルードする必要があります。

また、GLDv2 ベースのドライバは、次のように –N"misc/gld" オプションを使用してリンクする必要があります。

%ld -r -N"misc/gld" xx.o -o xx

GLDv2 では、デバイス固有ドライバのために次の関数が実装されています。

module_info(9S) 構造体の mi_idname 要素は、ドライバの名前を指定する文字列です。この文字列は、ファイルシステムで定義されたドライバモジュールの名前と完全に一致する必要があります。

読み取り側の qinit(9S) 構造体では、次の要素を指定します。

qi_putp

NULL

qi_srvp

gld_rsrv

qi_qopen

gld_open

qi_qclose

gld_close

書き込み側の qinit (9S) 構造体では、次の要素を指定します。

qi_putp

gld_wput

qi_srvp

gld_wsrv

qi_qopen

NULL

qi_qclose

NULL

dev_ops(9S) 構造体の devo_getinfo 要素では、getinfo(9E) ルーチンとして gld_getinfo を指定します。

ドライバの attach(9E) 関数は、ハードウェア固有デバイスドライバを GLDv2 の機能と関連付けます。attach() はその後、デバイスおよびドライバを使用できるように準備します。

attach(9E) 関数は、gld_mac_alloc() を使用して gld_mac_info(9S) 構造体を割り当てます。ドライバは通常、macinfo 構造体で定義されているよりも多くの情報をデバイスごとに保存する必要があります。ドライバで、必要な追加のデータ構造体を割り当て、その構造体へのポインタを gld_mac_info(9S) 構造体の gldm_private メンバーに保存します。

attach(9E) ルーチンは、gld_mac_info(9S) のマニュアルページの説明に従って macinfo 構造体を初期化する必要があります。その後、attach() ルーチンは gld_register() を呼び出して、ドライバを GLDv2 モジュールとリンクします。ドライバでは必要に応じてレジスタをマップし、完全に初期化して、gld_register() を呼び出す前に割り込みを受け付けるように準備してください。attach(9E ) 関数は割り込みを追加しますが、デバイスによってこれらの割り込みを生成させてはなりません。ドライバでは、ハードウェアが静止状態であることを保証するために、gld_register() を呼び出す前にハードウェアをリセットしてください。gld_register() が呼び出される前にデバイスが割り込みを生成する可能性がある状態にデバイスが陥らないようにする必要があります。デバイスはあとから、GLDv2 がドライバの gldm_start() エントリポイント (gld (9E) のマニュアルページで説明) を呼び出したときに起動されます。gld_register() が成功したあとであれば、GLDv2 によって gld(9E) エントリポイントをいつでも呼び出すことができます。

gld_register() が成功した場合、attach(9E) ルーチンは DDI_SUCCESS を返します。gld_register() が失敗した場合、DDI_FAILURE が返されます。エラーが発生した場合、attach(9E) ルーチンは、gld_register() が呼び出される前に割り当てられたすべてのリソースを解放します。さらにその後、attach ルーチンは DDI_FAILURE を返します。エラーの起きた macinfo 構造体は決して再利用しないでください。そのような構造体は、gld_mac_free() を使用して解放してください。

detach(9E) 関数は、gld_unregister() を呼び出すことによって、ドライバを GLDv2 から登録解除することを試みます。gld_unregister() の詳細は、gld(9F) のマニュアルページを参照してください。detach(9E) ルーチンは ddi_get_driver_private(9F) を使用することで、必要な gld_mac_info(9S) 構造体へのポインタをデバイスの非公開データから取得できます。gld_unregister() は、ドライバを切り離すことのできない特定の条件をチェックします。チェックに失敗した場合、gld_unregister()DDI_FAILURE を返します。この場合、ドライバの detach (9E) ルーチンはデバイスを動作状態にしたまま DDI_FAILURE を返す必要があります。

チェックに成功した場合、gld_unregister() はデバイスの割り込み中止を確認します。必要に応じて、ドライバの gldm_stop() ルーチンが呼び出されます。ドライバは GLDv2 フレームワークからリンク解除され、その後、gld_unregister()DDI_SUCCESS を返します。この場合、detach(9E) ルーチンは割り込みを削除し、attach(9E) ルーチンで割り当てられたすべての macinfo データ構造体を gld_mac_free() を使用して解放します。その後、detach() ルーチンは DDI_SUCCESS を返します。ルーチンでは gld_mac_free() を呼び出す前に割り込みを削除する必要があります。