编写设备驱动程序

访问属性结构

DDI_FM_ACCCHK_CAPABLE 设备驱动程序必须设置其访问属性,以指示它能够处理寄存器读取或写入期间发生的程控 I/O (programmed I/O, PIO) 访问错误。应将 ddi_device_acc_attr(9S) 结构中的 devacc_attr_access 字段设置为驱动程序可以检查和处理数据路径错误的系统的指示器。ddi_device_acc_attr 结构包含以下成员:

ushort_t devacc_attr_version;
uchar_t devacc_attr_endian_flags;
uchar_t devacc_attr_dataorder;
uchar_t devacc_attr_access;             /* access error protection */

在到设备或来自设备的数据路径中检测到的错误可由设备驱动程序的一个或多个父结点来处理。

devacc_attr_version 字段必须至少设置为 DDI_DEVICE_ATTR_V1。如果 devacc_attr_version 字段未设置为 DDI_DEVICE_ATTR_V1,则将忽略 devacc_attr_access 字段。

可将 devacc_attr_access 字段设置为以下值:

DDI_DEFAULT_ACC

此标志指示当出现错误时系统将采取缺省操作(如果合适,则进入紧急状态)。DDI_FM_ACCCHK_CAPABLE 驱动程序不能使用此属性。

DDI_FLAGERR_ACC

此标志指示系统将尝试处理与访问句柄关联的错误并从该错误中恢复。驱动程序应使用用于 Solaris 设备驱动程序的防御性编程方法中介绍的技术,并应使用 ddi_fm_acc_err_get(9F) 定期检查错误,之后才能允许数据回传给调用应用程序。

DDI_FLAGERR_ACC 标志可提供:

  • 通过驱动程序回调收到的错误通知

  • 通过 ddi_fm_acc_err_get(9F) 注册的驱动程序回调获得的错误通知

DDI_CAUTIOUS_ACC

DDI_CAUTIOUS_ACC 标志可为驱动程序进行的每个程控 I/O 访问提供高级别的保护。


注 –

使用此标志将对驱动程序的性能造成重大影响。


DDI_CAUTIOUS_ACC 标志指示访问驱动程序可以预见错误。系统尝试尽可能正常地处理与此句柄关联的错误并从该错误中恢复。最终不会生成错误报告,但句柄的 fme_status 标志将设置为 DDI_FM_NONFATAL。此标志在功能上与 ddi_peek(9F)ddi_poke(9F) 等效。

使用 DDI_CAUTIOUS_ACC 可提供:

  • 对总线的独占访问

  • 陷阱 (On trap) 保护-(ddi_peek()ddi_poke()

  • 通过使用 ddi_fm_handler_register(9F) 注册的驱动程序回调获得的错误通知

  • 通过 ddi_fm_acc_err_get(9F) 注册的驱动程序回调获得的错误通知

通常,驱动程序应在代码路径中的适当接合点处检查数据路径错误,以确保数据一致并确保 I/O 软件堆栈中显示正确的错误状态。

DDI_FM_ACCCHK_CAPABLE 设备驱动程序必须将其 devacc_attr_access 字段设置为 DDI_FLAGERR_ACC 或 DDI_CAUTIOUS_ACC。