SCSI ポートによって提供される機能
SCSI ポート ドライバーには、次のものが用意されています。
Microsoft Windows では、異なる種類の I/O バスや、同じ種類の複数の I/O バスを含むシステムがサポートされています。 この多様性を処理するには、一般的なアドレス指定スキームが必要です。
PCI デバイスは、I/O ポートとメモリ レジスタ リソースの両方を持つことができます。 論理アドレスは、この区別をポート ドライバーに対して透過的にするために役立ちます。
一部のシステムには、複数のバスに接続されている HBA が含まれています。このような HBA では、複数のアドレス変換セットが必要になる場合があります。
CISC ベースおよび RISC ベースのマシン間の移植性には、論理アドレスが必要です。
デバイスがビジー状態のときに IRP を処理し直します。
記憶域クラス ドライバーは、デバイスがビジー状態で処理できない場合に IRP を再試行するためのアルゴリズムを実装する必要はありません。 SCSI ポート ドライバーは、この機能を実装します。
要求のタイムアウト値を適用します。
クラス ドライバーは要求のタイムアウト値を設定し、SCSI ポートは要求の適用を担当します。 ただし、SCSI ポート ドライバーは、バスの状態を考慮に入れて、クラス ドライバーのタイムアウト値を柔軟に適用できます。 たとえば、SCSI ポートによって管理されているファイバー チャネル リンクが 20 秒間ドロップした場合、SCSI ポートはダウンタイム中にタイムアウト カウンターを中断する可能性があります。そのため、たとえば、タイムアウトが 10 秒の要求は、リンクがバックアップされてから 10 秒後まではエラーになりません。 SCSI ポートは、I/O トラフィックの増加に応じて要求に割り当てられるタイムアウト値を増やします。I/O トラフィックが多い場合、デバイスは要求を完了するためにより多くの時間を必要とするためです。
ターゲット エラーとコントローラービジー エラー、トランスポート エラー状態 (つまり、バス上のデータの実際の転送に関連するエラー) の処理。 次に例を示します。
- bus-parity エラー
- 選択タイムアウト
ホスト アダプターの制限事項に関する情報をクラス ドライバーに提供します。
クラス ドライバーは、ホスト バス アダプター (HBA) の制限に合わせてデータ転送のサイズを調整する必要があります。 ただし、SCSI ポートは、このタスクを実行するために必要な情報をクラス ドライバーに提供します。 SCSI ポートは、IOCTL_STORAGE_QUERY_PROPERTY IOCTL 要求に応答してアダプター記述子 (STORAGE_ADAPTER_DESCRIPTOR) にこの情報を提供します。 クラス ドライバーは、この記述子で報告された情報に基づいて、要求を適切なサイズのチャンクに分割します。
バスの相対アドレスを論理アドレスに変換します。
照会されると、アダプターは、I/O ポート、コマンド・レジスター、制御状況レジスターのバス相対アドレスを提供します。 ただし、ミニポート ドライバーは、ホスト バス アダプター (HBA) と通信するバス相対アドレスを使用できません。 SCSI ポートは、ミニポート ドライバーが透過的な方法でバス アドレスにアクセスできるように、論理アドレスにバスの相対アドレスを変換します。 それには、いくつかの理由があります。
デバイスが起動する前に、デバイスとその基になるすべてのデバイスが (D0 デバイスの電源状態で) 電源がオンになっていることを確認します。
デバイスの電源を入れる準備ができていない場合、SCSI ポートはデバイスの準備ができるまで、そのデバイスの D0 要求をキューに入れます。
クラス ドライバーからの非同期要求をキューに格納し、ターゲット デバイスに同期的に転送します。
クラス ドライバーは、次の要求を送信する前に、要求が完了するまで待機する必要はありません。 SCSI ポートは、基になるハードウェアの処理能力を超えないように、これらの要求をキューに入れます。
内部 I/O 要求キューの内部管理と外部管理の両方をサポートします。
ほとんどのキュー管理操作は、SCSI ポート自体によって開始されます。 たとえば、SCSI ポートは、エラーが発生したときにキューを固定し、クラス ドライバーにエラー状態を報告して、さらに要求が処理される前にクラス ドライバーが応答できるようにします。 ただし、SCSI ポートは、クラス ドライバーまたはその他の上位レベルのドライバーからの要求にも応答して、内部要求キューをロック、ロック解除、固定、固定解除のいずれかを行います。 上位レベルのドライバーは、SRB_FUNCTION_RELEASE_QUEUE 要求を使用して、SCSI ポートの内部キューの固定を解除することを強制できます。 キューの "固定"、"ロック"、"ロック解除" の意味については、「SCSI ポート ドライバーのキュー管理」を参照してください。
デバイスによって報告されたエラーを SCSI-2 センス データ形式に変換して、クラス ドライバーで処理します。
SCSI ポートは、SCSI ポート ライブラリ ルーチンを使用してミニポート ドライバーにサービスを提供します。 ミニポート ドライバーのライターは、単一のモノリシック ポート ドライバーに提供する機能をコーディングするのではなく、これらのルーチンを呼び出すことができます。 これらのルーチンを使用して提供される最も重要なサービスの一部を次に示します。
SCSI ポート ミニポート ドライバーは、SCSI ポートの ScsiPortInitialize ライブラリ ルーチンに多くの OS に依存する初期化操作を委譲できます。 これにより、オペレーティング システムの異なるバージョン間で SCSI ポート ミニポート ドライバーの移植性が高くなります。 SCSI ポート ミニポート ドライバーの初期化作業の説明については、「SCSI ミニポート ドライバーの DriverEntry ルーチン」を参照してください。
PnP 以外のデバイスの SCSI ポート ミニポート ドライバーは、アダプターを検索し、PnP マネージャーにそのリソースを報告するタスクを免除されます。 これは ScsiPortInitialize で行われます。
SCSI ポート ミニポート ドライバーは、ドライバー オブジェクトのディスパッチ エントリ ポイントを初期化しません。 ミニポート ドライバーが ScsiPortInitialize を呼び出すとき、SCSI ポート ドライバーは、ミニポート ドライバーの代わりにこれを行います。
SCSI ポート ミニポート ドライバーは、HalTranslateBusAddress を使用して、バス相対アドレスを論理アドレスに変換しません。 SCSI ポート ミニポート ドライバーは、ScsiPortGetDeviceBase の呼び出しによってこれを行います。
SCSI ポート ミニポート ドライバーで SCSI ポートを使用できるライブラリ ルーチンの概要については、「SCSI ポート ドライバーのサポート ルーチン」を参照してください。