Freigeben über


Wiederholungsroutine des Speicherklassentreibers

Der zugrunde liegende Speicherporttreiber ist für die Wiederholung von Anforderungen verantwortlich, wenn Gerätefehler auftreten, die die Übertragung von Daten auf dem Bus beinhalten, einschließlich Busparitätsfehlern, Auswahltimeouts und Ziel-/Controller-Beschäftigt-Fehlern. Wenn Wiederholungsversuche fehlschlagen, schließt der Speicherporttreiber die Anforderung mit einem entsprechenden Fehler ab und protokolliert auch den E/A-Fehler.

Ein Speicherklassentreiber sollte niemals versuchen, eine Anforderung zu wiederholen, dass der Porttreiber aufgrund eines der vorherigen Fehler bereits fehlgeschlagen ist.

Ein Speicherklassentreiber ist für wiederholungsbezogene Anforderungen verantwortlich, die aufgrund gerätespezifischer Fehler, anderer Ziel-/Controllerfehler als Target/Controller-Busy, Busrücksetzungen oder Anforderungstimeouts fehlschlagen. Im Allgemeinen kann eine RetryRequest-Routine einen solchen IRP erneut an den nächstniedrigen Treiber übermitteln und anweisen, dass der SRB an der Spitze der LU-spezifischen Warteschlange des Porttreibers platziert wird.

Insbesondere sollte eine RetryRequest-Routine folgendes ausführen:

  1. Stellen Sie sicher, dass für eine Teilübertragungsanforderung die richtigen Werte für die Startadresse und die Länge festgelegt sind.

  2. Null der SrbStatus- und ScsiStatus-Member des SRB.

  3. Richten Sie den SrbFlags-Member nach Bedarf für das Gerät ein.

  4. Richten Sie den E/A-Stapelspeicherort für den Porttreiber im IRP ein, wie bereits unter Verteilungsroutinen des Speicherklassentreibers über die SplitTransferRequest-Routine des Speicherklassentreibers beschrieben.

  5. Rufen Sie IoSetCompletionRoutine für den IRP auf, da die IoCompletion-Routine des Treibers den SRB freigeben muss, bevor der IRP zurückgegeben wird. Die IoCompletion-Routine muss die Anforderung möglicherweise auch mehrmals wiederholen oder die InterpretRequestSense - oder ReleaseQueue-Routine des Treibers aufrufen.

  6. Übergeben Sie die Anforderung mit IoCallDriver an den nächstniedrigen Treiber.