LE 挂起检测
某些固件具有可以检测固件挂起的监视器计时器。 某些 IHV 驱动程序 (LE) 具有用于检测固件是否没有向前推进的逻辑。 UE 允许 LE 指示此类条件。
指示应位于适配器端口 (例如 portid=0xFFFF) 。 默认情况下,指示会触发 LE 执行完全重置恢复过程 - 调用诊断、收集调试信息以及请求 PLDR。
当 LE 或固件监视器计时器检测到固件停止时,来自 UE 的预期如下所示。
如果在 D0 中,
- LE 指示 NDIS_STATUS_WDI_INDICATION_FIRMWARE_STALLED。
- 在从指示返回时,LE 返回 (如果有任何) 停止的 WDI 命令。
- UE 启动重置恢复 (RR) 过程。
如果在 Dx 中,则只能在检测到固件停止时发生此情况。
- 固件引发唤醒中断。
- 收到 D0 命令时,指示固件停止的唤醒原因。
- 返回 D0 WDI OID 后,LE 指示 NDIS_STATUS_WDI_INDICATION_FIRMWARE_STALLED。
- 完成过程,如 D0:1a、1b 和 1c 中所示。
Dx 中的挂起检测
固件可能在 Dx 中停止进度。 在本例中,对于 PCIe NIC,Dx 为 D3Hot,对于 USB 和 SDIO 为 D2。 NIC 已准备好唤醒,并预期会自主维护接入点关联,或者扫描 NLO(如果未关联)。
当 NIC 处于 Dx 中时,与主机的通信将被阻止,因为总线可能处于关机状态。 因此,LE 无法检测已停止的固件。 固件本身必须检测条件并引发唤醒线 (如果代码的唤醒部分仍然处于活动状态,) 通过 ACPI 或总线完成间接将堆栈带到 D0,NDIS wait_wake_irp。 因此,NDIS 将 D0 设置为 NIC。
固件断言此类情况的唤醒。 LE 应指示固件停止的唤醒原因。 唤醒原因WDI_WAKE_REASON_CODE_FIRMWARE_STALLED定义为具有其他唤醒原因的枚举。
若要在此方案中运行“重置恢复”,固件的至少两个部分必须仍能正常工作。
- 挂起检测代码。
- 用于断言唤醒中断的代码。
如果缺少任一项,主机端不知道固件是否停止并且不会发生 RR。 此方案不是设计目标的一部分。
OS 模块触发的重置恢复
这是针对 IHV 的信息。 除了 UE 和 LE 检测到的挂起外,其他 OS 组件可能检测到挂起和/或触发 UE 以调用重置恢复过程。 目前,Windows 10 中的用户模式 wlansvc 组件可能会在检测到与 Internet 连接的连接时请求重置为 UE,并随后在一段时间内失去访问 DNS 服务器而不取消关联的能力。 将来,Microsoft 可能会发现其他情况来触发重置恢复以增强最终用户体验。