以降のセクションでは、ターゲットエントリポイントについて説明します。
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(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 () によって処理されます。
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(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) */ }