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

印刷ビューの終了

更新: 2014 年 9 月
 
 

getinfo() エントリポイント

システムは、ドライバのみが認識している構成情報を取得するために getinfo(9E) を呼び出します。デバイスインスタンスへのマイナー番号のマッピングは、ドライバによって完全に制御されます。システムは、特定の dev_t がどのデバイスを表すかをドライバに問い合わせることが必要になる場合があります。

getinfo() 関数は、infocmd 引数として DDI_INFO_DEVT2INSTANCE または DDI_INFO_DEVT2DEVINFO のどちらかを取ることができます。DDI_INFO_DEVT2INSTANCE コマンドは、デバイスのインスタンス番号を要求します。DDI_INFO_DEVT2DEVINFO コマンドは、デバイスの dev_info 構造体へのポインタを要求します。

DDI_INFO_DEVT2INSTANCE の場合は、argdev_tであり、getinfo()dev_t 内のマイナー番号をインスタンス番号に変換する必要があります。次の例では、マイナー番号がインスタンス番号と同じであるため、getinfo() はマイナー番号を戻すのみで済みます。この場合は、getinfo()attach() の前に呼び出される可能性があるため、ドライバでは状態構造体が使用できることを前提にしてはいけません。ドライバによって定義されるマイナーデバイス番号とインスタンス番号の間のマッピングは、必ずしも例に示したマッピングに従う必要はありません。ただし、いずれの場合も、マッピングは静的である必要があります。

DDI_INFO_DEVT2DEVINFO の場合も、argdev_t であるため、getinfo() は最初にデバイスのインスタンス番号をデコードします。getinfo() は次に、次の例に示すように、該当するデバイスに対するドライバのソフト状態構造体に保存された dev_info ポインタを戻します。

使用例 6-7  標準的な getinfo() エントリポイント
/*
 * getinfo(9e)
 * Return the instance number or device node given a dev_t
 */
static int
xxgetinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
{
    int error;
    Pio *pio_p;
    int instance = getminor((dev_t)arg);

    switch (infocmd) {
    /*
     * return the device node if the driver has attached the
     * device instance identified by the dev_t value which was passed
     */
    case DDI_INFO_DEVT2DEVINFO:
    pio_p = ddi_get_soft_state(pio_softstate, instance);
    if (pio_p == NULL) {
        *result = NULL;
        error = DDI_FAILURE;
    } else {
        mutex_enter(&pio_p->mutex);
        *result = pio_p->dip;
        mutex_exit(&pio_p->mutex);
        error = DDI_SUCCESS;
    }
    break;
    /*
     * the driver can always return the instance number given a dev_t
     * value, even if the instance is not attached.
     */
    case DDI_INFO_DEVT2INSTANCE:
    *result = (void *)instance;
    error = DDI_SUCCESS;
    break;
    default:
    *result = NULL;
    error = DDI_FAILURE;
    }
    return (error);
}

注 - getinfo() ルーチンは、ドライバが作成するマイナーノードとの同期が維持される必要があります。マイナーノードが同期から外れた場合は、ホットプラグ操作がすべて失敗し、システムパニックが発生することがあります。