UE 停止回應偵測:步驟 1-14
以下說明 UE 停止回應偵測的步驟 1 到 14。 這些步驟會對應至 UE 停止回應偵測和復原流程中顯示的圖表。
此範例使用 OID_SET_POWER。
NDIS 會接收系統電源 IRP 或 NIC 作用中參考下降至 0。
NDIS 會產生OID_SET_POWER D3 給 WDI 驅動程式。
WDI 會設定 WDI 命令的計時器 (M1) ,包括工作,再將 WDI OID 向下傳送至 LE。 如果命令是工作,也會設定工作的其他計時器。 這兩個計時器最多可以逾時,但最多隻能觸發重設復原。
WDI 會將 WDI 命令傳送至 LE。 LE 的建議是,如果需要韌體命令來完成 OID,請記得配接器結構中的 WDI OID。 當韌體完成 WDI OID 的工作時,LE 會完成 OID,並從配接器結構中移除它。 由於 WDI 會將 OID 序列化為 LE,因此 LE 只需要一個位置才能記住擱置的 WDI OID。 如果韌體命令無回應,LE 可以隨時傳回 OID,但晚于意外移除 (它可能位於已停用韌體的步驟 17 的意外移除) 內容中。 對於任何其他情況,LE 只會在韌體完成對應的作業時完成 WDI OID,而不論它是否在診斷回呼之前或之後。 如果 LE 需要在診斷之後記住 WDI OID,則需要另一個位置來記住它。 不過,針對診斷之後收到的 OID,LE 不應該觸碰韌體,以避免串聯停止回應。
LE 會將命令傳送至韌體。
如果韌體命令逾時,可能是因為韌體擱置或花費太多時間。
- 如果韌體在逾時之後只需要太長的時間才能完成命令,則 LE 可以完成 WDI 命令。 UE 會適當地處理它。
- 如果韌體已無回應,WDI 命令很快就會完成。 當硬體重設時,LE 必須在步驟 16 意外移除時完成,因此安全完成,而不需要針對潛在的競爭狀況進行特殊處理。
WDI 計時器會引發以產生 WDI 診斷命令。 此 WDI 命令是 LE 驅動程式 MiniportWdiAdapterHangDiagnose的呼叫,而不是 WDI OID。
LE 會收集硬體控制暫存器狀態,並選擇性地收集完整的韌體狀態。
- IHV 驅動程式預期會收集限制為 1KB 的硬體暫存器內容,並在函式傳回中傳回它。 此外,在生產前環境中,LE 也應該嘗試將韌體內容傾印到檔案中,讓 IHV 可以徹底進行事後偵錯。 參數可以實作為登錄機碼,以控制硬體暫存器和韌體映射的集合。
- LE 也會標記目前的命令以進行取消。 如果命令完成比對診斷進行競爭,如果 LE 對此命令沒有執行任何動作,就可接受。
- 當此命令擱置中時,UE 可能會傳送進一步的 WDI 命令,因為重設的結果。 這些是執行中的命令或清除命令。 診斷呼叫之後,LE 應該處理它們,而不需觸碰韌體。
WDI 會接收控制項暫存器狀態。
WDI 會標示停止回應的 WDI 命令,以便稍後由 LE 指出。
WDI 會傳回 (完成) NDIS 命令,而不完成 WDI。 這是安全的,因為 WDI 雙緩衝區 NDIS 命令。
WDI 會呼叫 NDIS 來重設,並呼叫NdisWriteErrorLogEntry,錯誤碼為 NDIS_ERROR_CODE_HARDWARE_FAILURE (0xc000138a) 。 這會導致系統事件記錄檔中記錄的事件,其模組名稱為 LE。 錯誤事件識別碼會自動快顯為 (0xc000138a |0xffff) – 0n5002。 如果 LE 也使用相同的錯誤碼來寫入錯誤記錄檔,則資料的第一個 DWORD 應該包含高位集 (0x80000000) ,以輕鬆地以 LE 分隔事件。 WDI 會使用0x00000000來0x7fffffff第一個 DWORD 資料。
呼叫會傳回 。
NDIS 完成 IRP。
此時,NDIS 會呼叫公車,以意外移除並重新列舉我們。 請務必注意,WDI 雙緩衝區 NDIS 命令,因此不需要等候 WDI 命令返回完成 NDIS 命令。 這可消除 LE 執行取消邏輯的需求,這很不復雜。
必須完成 NDIS OID_SET_POWER,以避免 PnP 作業死結。 所有 PnP 和電源狀態變更事件都會序列化。 這表示如果 Set 電源 OID 未傳回,NDIS 就無法傳回 Set power IRP,這表示重設復原會鎖定 Surprise-Remove IRP。