scsi_init_pkt(9F) ルーチンは scsi_pkt(9S) 構造体を割り当てて 0 に設定します。 scsi_init_pkt() は、pkt_private、 *pkt_scbp、および *pkt_cdbp へのポインタも設定します。さらに、scsi_init_pkt () はリソースを使用できない場合を処理するコールバックメカニズムを提供します。この関数の構文は次のとおりです。
struct scsi_pkt *scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pktp, struct buf *bp, int cmdlen, int statuslen, int privatelen, int flags, int (*callback)(caddr_t), caddr_t arg)
ここでは:
scsi_address 構造体へのポインタです。ap は、デバイスのscsi_device(9S) 構造体の sd_address フィールドです。
初期化するscsi_pkt (9S) 構造体へのポインタです。このポインタが NULL に設定されている場合、新しいパケットが割り当てられます。
buf(9S) 構造体へのポインタです。このポインタが NULL ではなく、有効なバイトカウントがある場合、DMA リソースが割り当てられます。
SCSI コマンド記述子ブロックの長さ (バイト単位) です。
SCSI ステータス完了ブロックの必要な長さ (バイト単位) です。
pkt_private フィールドのために割り当てるバイト数です。
フラグのセットです。
PKT_CONSISTENT – scsi_alloc_consistent_buf(9F) を使用して DMA バッファーが割り当てられた場合は、このビットを設定する必要があります。この場合、ホストバスアダプタドライバによって、ターゲットドライバのコマンド完了コールバックを実行する前にデータ転送が適切に同期されることが保証されます。
PKT_DMA_PARTIAL – ドライバが部分的な DMA マッピングを受け入れる場合、このビットを設定できます。設定されている場合、scsi_init_pkt(9F) は DDI_DMA_PARTIAL フラグを設定して、DMA リソースを割り当てます。scsi_pkt(9S) 構造体の pkt_resid フィールドは、ゼロ以外の未処理の内容を格納して復帰できます。ゼロ以外の値は、 scsi_init_pkt(9F) が DMA リソースを割り当てることができなかったバイト数を示します。
リソースを使用できない場合に実行する処理を指定します。NULL_FUNC に設定されている場合、scsi_init_pkt (9F) はすぐに値 NULL を返します。SLEEP_FUNC に設定されている場合、リソースが使用可能になるまで scsi_init_pkt() は復帰しません。その他すべての有効なカーネルアドレスは、リソースが使用可能になる可能性が高いときに呼び出される関数のアドレスとして解釈されます。
コールバック関数に渡されるパラメータです。
scsi_init_pkt() ルーチンはトランスポート前にデータを同期します。トランスポート後にドライバがデータにアクセスする必要がある場合は、ドライバで scsi_sync_pkt(9F) を呼び出して、中間キャッシュをすべてフラッシュする必要があります。scsi_sync_pkt () ルーチンを使用すると、キャッシュされているすべてのデータを同期できます。