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

印刷ビューの終了

更新: 2014 年 9 月
 
 

ターゲットドライバインスタンスの初期化

以降のセクションでは、ターゲットエントリポイントについて説明します。

tran_tgt_init() エントリポイント

tran_tgt_init(9E) エントリポイントを使用すると、HBA はターゲットごとのリソースを割り当てて初期化できます。また、tran_tgt_init() を使用すると、HBA はデバイスのアドレスをその特定の HBA で有効かつサポート可能であるとみなすことができます。DDI_FAILURE を返すことにより、そのデバイスのターゲットドライバのインスタンスにはプローブも接続も行われません。

tran_tgt_init() は必須ではありません。tran_tgt_init() を指定しない場合、フレームワークでは該当するターゲットドライバの可能なインスタンスをすべてプローブおよび接続しようとします。

static int
isp_tran_tgt_init(
    dev_info_t            *hba_dip,
    dev_info_t            *tgt_dip,
    scsi_hba_tran_t       *tran,
    struct scsi_device    *sd)
{
    return ((sd->sd_address.a_target < N_ISP_TARGETS_WIDE &&
        sd->sd_address.a_lun < 8) ? DDI_SUCCESS : DDI_FAILURE);
}

tran_tgt_probe() エントリポイント

tran_tgt_probe(9E) エントリポイントを使用すると、HBA は必要に応じてscsi_probe(9F) の動作をカスタマイズできます。このエントリポイントは、ターゲットドライバが scsi_probe() を呼び出した場合にのみ呼び出されます。

HBA ドライバは、scsi_hba_probe(9F) を呼び出し、その戻り値を返すことで、scsi_probe() の通常の動作を維持できます。

このエントリポイントは必須ではありません。必要がない場合、HBA ドライバは、scsi_hba_tran(9S) 構造体の tran_tgt_probe ベクトルが scsi_hba_probe() を指すように設定します。

scsi_probe() は、scsi_inquiry(9S) 構造体を割り当て、scsi_device(9S) 構造体の sd_inq フィールドが scsi_inquiry のデータを指すように設定します。scsi_hba_probe() はこのタスクを自動的に処理します。次に、 scsi_unprobe(9F) は scsi_inquiry データを解放します。

scsi_inquiry データの割り当てを除き、同じ SCSI デバイスが tran_tgt_probe() を何度も呼び出す可能性があるため、tran_tgt_probe() をステートレスにする必要があります。通常、scsi_inquiry データの割り当ては scsi_hba_probe () によって処理されます。


注 - scsi_inquiry (9S) 構造体の割り当ては scsi_hba_probe() によって自動的に処理されます。この情報は、カスタムの scsi_probe() 処理が必要な場合にだけ関係があります。
static int
isp_tran_tgt_probe(
    struct scsi_device    *sd,
    int                   (*callback)())
{
    /*
     * Perform any special probe customization needed.
     * Normal probe handling.
     */
    return (scsi_hba_probe(sd, callback));
}

tran_tgt_free() エントリポイント

tran_tgt_free(9E) エントリポイントを使用すると、HBA はターゲットのインスタンスに対して解放またはクリーンアップの手順を実行できます。このエントリポイントはオプションです。

static void
isp_tran_tgt_free(
    dev_info_t            *hba_dip,
    dev_info_t            *tgt_dip,
    scsi_hba_tran_t       *hba_tran,
    struct scsi_device    *sd)
{
    /*
     * Undo any special per-target initialization done
     * earlier in tran_tgt_init(9F) and tran_tgt_probe(9F)
     */
}