使用注册的回调处理函数来接收回调操作,接收特定于要处理的各操作的参数。
typedef int (*ddi_cb_func_t)(dev_info_t *dip, ddi_cb_action_t cbaction, void *cbarg, void *arg1, void *arg2);
cbaction 参数指定驱动程序接收到的回调要处理哪种操作。
typedef enum { DDI_CB_INTR_ADD, DDI_CB_INTR_REMOVE } ddi_cb_action_t;
DDI_CB_INTR_ADD 操作表示驱动程序中断可用数量增加。DDI_CB_INTR_REMOVE 操作表示驱动程序中断可用数量减少。将 cbarg 参数的类型强制转换为 int,以确定添加或删除的中断数量。cbarg 值表示可用中断数量的变化。
例如,获得可用中断数量的变化:
count = (int)(uintptr_t)cbarg;
如果 cbaction 为 DDI_CB_INT _ADD,则应添加 cbarg 数量的中断向量。如果 cbaction 为 DDI_CB_INT _REMOVE,则应释放 cbarg 数量的中断向量。
有关 arg1 和 arg2 的说明, 请参见 ddi_cb_registe (9F)。
回调处理函数必须能够在函数注册的整个时间段内正确执行。回调函数不能依赖任何可能会在回调函数成功取消注册之前销毁的数据结构。
回调处理函数必须返回以下值之一:
DDI_SUCCESS(如果正确处理了操作)
DDI_FAILURE(如果遇到内部错误)
DDI_ENOTSUP(如果接收到无法识别的操作)