编写设备驱动程序

故障管理数据和状态结构

驱动程序错误处理回调会被传递一个指向数据结构的指针,该数据结构包含常见的故障管理数据和错误处理状态。

数据结构 ddi_fm_error 包含用于当前错误的 FMA 协议 ENA、错误处理程序回调的状态、错误预期标志以及与父结点检测到的错误关联的任何潜在访问或 DMA 句柄。

fme_ena

此字段通过调用父结点来进行初始化,并可能在达到驱动程序的已注册回调例程之前随着错误处理传播链不断增大。如果驱动程序检测到自身的相关错误,它应在调用 ddi_fm_ereport_post() 之前使此 ENA 增大。

fme_acc_handlefme_dma_handle

如果父级能够将在其级别上检测到的错误与设备驱动程序映射或绑定的句柄相关联,则这些字段中包含有效的访问或 DMA 句柄。

fme_flag

如果调用父级确定错误是由于 DDI_CAUTIOUS_ACC 受保护的操作引起的,fme_flag 将设置为 DDI_FM_ERR_EXPECTED。在这种情况下,fme_acc_handle 有效,并且驱动程序应只检查并报告不与 DDI_CAUTIOUS_ACC 受保护操作关联的错误。否则,fme_flag 将设置为 DDI_FM_ERR_UNEXPECTED,并且驱动程序必须执行完整的错误处理任务。

fme_status

从其错误处理程序回调返回后,驱动程序必须立即将 fme_status 设置为以下值之一:

  • DDI_FM_OK-未检测到任何错误,此设备实例的操作状态一直保持不变。

  • DDI_FM_FATAL-出现错误,并且驱动程序将其视为对系统致命的错误。例如,对 pci_ereport_post(9F) 的调用可能已检测到系统致命错误。在这种情况下,驱动程序应报告驱动程序的上下文中可能存在的任何其他错误信息。

  • DDI_FM_NONFATAL-驱动程序已检测到错误,但不将其视为对系统致命的错误。驱动程序已确定错误,并且已隔离该错误或者确认将隔离该错误。

  • DDI_FM_UNKNOWN-已检测到错误,但驱动程序无法隔离设备或确定错误对系统操作状态的影响。