LE 挂起检测

某些固件具有可以检测固件挂起的监视器计时器。 某些 IHV 驱动程序 (LE) 具有用于检测固件是否没有向前推进的逻辑。 UE 允许 LE 指示此类条件。

指示应位于适配器端口 (例如 portid=0xFFFF) 。 默认情况下,指示会触发 LE 执行完全重置恢复过程 - 调用诊断、收集调试信息以及请求 PLDR。

当 LE 或固件监视器计时器检测到固件停止时,来自 UE 的预期如下所示。

  1. 如果在 D0 中,

    1. LE 指示 NDIS_STATUS_WDI_INDICATION_FIRMWARE_STALLED
    2. 在从指示返回时,LE 返回 (如果有任何) 停止的 WDI 命令。
    3. UE 启动重置恢复 (RR) 过程。
  2. 如果在 Dx 中,则只能在检测到固件停止时发生此情况。

    1. 固件引发唤醒中断。
    2. 收到 D0 命令时,指示固件停止的唤醒原因。
    3. 返回 D0 WDI OID 后,LE 指示 NDIS_STATUS_WDI_INDICATION_FIRMWARE_STALLED
    4. 完成过程,如 D0:1a、1b 和 1c 中所示。

wdi le hang detection.

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定义为具有其他唤醒原因的枚举。

若要在此方案中运行“重置恢复”,固件的至少两个部分必须仍能正常工作。

  1. 挂起检测代码。
  2. 用于断言唤醒中断的代码。

如果缺少任一项,主机端不知道固件是否停止并且不会发生 RR。 此方案不是设计目标的一部分。

dx 中的 wdi 挂起检测。

OS 模块触发的重置恢复

这是针对 IHV 的信息。 除了 UE 和 LE 检测到的挂起外,其他 OS 组件可能检测到挂起和/或触发 UE 以调用重置恢复过程。 目前,Windows 10 中的用户模式 wlansvc 组件可能会在检测到与 Internet 连接的连接时请求重置为 UE,并随后在一段时间内失去访问 DNS 服务器而不取消关联的能力。 将来,Microsoft 可能会发现其他情况来触发重置恢复以增强最终用户体验。

NDIS_STATUS_WDI_INDICATION_FIRMWARE_STALLED

WDI_TLV_INDICATION_WAKE_REASON