编写设备驱动程序

获取错误状态

如果发生的故障影响到通过句柄映射的资源,则会更新错误状态结构,以反映在总线或 I/O 数据路径中的其他设备驱动程序在处理错误期间捕获的错误信息。

void ddi_fm_dma_err_get(ddi_dma_handle_t handle, ddi_fm_error_t *de, int version)

void ddi_fm_acc_err_get(ddi_acc_handle_t handle, ddi_fm_error_t *de, int version)

ddi_fm_dma_err_get(9F) 和 ddi_fm_acc_err_get(9F) 函数分别为 DMA 或访问句柄返回错误状态。应将版本字段设置为 DDI_FME_VERSION。

访问句柄错误意味着已检测到一种错误,该错误影响到达使用该访问句柄的设备或来自该设备的 PIO 事务。该驱动程序接收到的任何数据(例如,通过最新的 ddi_get8(9F) 调用)均应被视为可能已损坏。发送到设备的任何数据(例如,通过最新的 ddi_put32(9F) 调用)也都可能已损坏,或根本未被接收。然而,基本故障可能是瞬态的,因而驱动程序可以通过调用 ddi_fm_acc_err_clear(9F)、将设备重置为已知状态、重试任何可能出错的事务来尝试进行恢复。

如果指示 DMA 句柄出现错误,则意味着检测到错误已经(或将要)影响设备和当前绑定到句柄(如果句柄当前未绑定,则为最近绑定)的内存之间的 DMA 事务。可能的原因包括 DMA 数据路径中的组件出现故障,或设备尝试进行无效的 DMA 访问。驱动程序通过重试和重新分配内存可能能够继续。应将当前(或以前)绑定到句柄的内存的内容视为不确定的,并应将其释放回系统。一旦绑定或重新绑定句柄,与当前事务关联的故障指示便会丢失,但由于故障可能持续存在,因此将来的 DMA 操作可能不会成功。