eeh_init_multifunc 内核服务
用途
此内核服务在 PCI/PCI-E 总线上注册用于 EEH 功能的多功能适配器插槽。
语法
#include <sys/eeh.h>
eeh_handle_t eeh_init_multifunc(gpbid, pbid, slot, flag, delay_seconds,
callback_ptr, dds_ptr)
long gpbid;
long pbid;
long slot;
long flag;
long delay_seconds;
long (*callback_ptr)();
void *dds_ptr;参数
| 项 | 描述 |
|---|---|
| Gpbid | 祖父代总线的总线标识。 |
| 普比德 | 父总线的总线标识。 |
| 插槽 (slot) | 父总线上的插槽 (device*8+function)。 这与设备的 CuDv 中的 "connwhere" 属性相同。 |
| 标记 | 用于启用 eeh、检查插槽是否已被占用等的标志。 |
| delay_seconds | 重置后的时间延迟 (以秒计)。 |
| callback_ptr | 设备驱动程序回调例程。 |
| dds_ptr | 指向通常是指向适配器结构的指针的目标设备驱动程序的 cookie。 |
描述
此内核服务是为支持共享 EEH 域的系统提供的,其中一个或多个适配器中的一个或多个 PCI 功能可能属于同一个 EEH 恢复域。 在过去,这被称为 "多功能适配器"。 共享 EEH 域是一个比仅多功能适配器更一般的概念。 此外,还建议单个功能适配器使用共享 EEH 模型。 所有 PCI-E 设备,单一或多功能都必须使用共享 EEH 模型,因此此内核服务必须注册 EEH (而不是 eeh_init ())。 在共享 EEH 域中,设备驱动程序的多个实例可能正在运行。 这些实例相互独立,因此对彼此的存在不闻不问。 因此,从 EEH 事件中恢复槽时,需要在它们之间协调恢复过程。 与 eeh_init ()一样,此服务也会将 eeh_handle 返回到调用设备驱动程序。
存在两种类型的适配器: 桥接和非桥接。 桥接适配器在卡上具有网桥,例如 PCI 到 PCI 或 PCIX 到 PCIX 或 PCI 到 E 交换机。 对于 PCI 和 PCI-X 桥接适配器, 普比德 是父代总线的总线标识,而 Gpbid 是祖父代总线的总线标识。 桥接适配器的父总线是由该适配器上的网桥/交换机生成的总线。 投标 标识了总线号和类型。 对于 PCI 和 PCI-X 总线,总线类型为 IO_PCI; 对于 PCI-E 总线,总线类型为 IO_PCIE。 总线号是在总线配置期间确定的唯一标识。 ioacc.h 中定义的 BID_VAL 宏用于生成 投标。 对于非桥接适配器, 普比德 和 Gpbid 是相同的,并且是父总线的总线标识。 因此,当 普比德 和 Gpbid 对于 PCI 或 PCI-X 设备具有不同的值时,内核知道这是桥接适配器,并且需要作为 EEH 恢复的一部分对网桥进行恢复。 不需要知道 PCI-E 设备是桥接的还是不用于 EEH 的目的。 因此, 普比德 和 Gpbid 必须与父总线投标相同且等于父总线投标。
- PCI/PCI-X 非桥接适配器和所有 PCI-E 适配器: Gpbid 和 普比德 与父总线 投标相同且等于父总线。
- PCI/PCI-X 桥接适配器, Gpbid 是祖父总线 投标,而 普比德 是父总线投标。
槽 自变量是设备/函数组合 ((设备 * 8) + 函数) ,如 PCI 寻址方案中一样。 这与设备的 connwhere ODM 值相同。
| 项 | 描述 |
|---|---|
| EEH_ENABLE_FLAG/EEH_DISABLE_FLAG | 当此服务由该插槽上的第一个驱动程序调用时,始终对 EEH 启用该插槽。 通过 EEH_ENABLE 标志启用槽的所有后续请求都将被忽略。 因此, EEH_ENABLE 的标志参数是可选的,并且将忽略 已禁用 EEH_XX_ENCODE_CASE_CAPS_LOCK_ON disable 的标志。 |
| EEH_CHECK_SLOT | EEH_CHECK_SLOT 的标志参数验证是否已注册给定的插槽。 这将返回值 EEH_SLOT_ACTIVE 或 EEH_SLOT_FREE 。 未使用 EEH_CHECK_SLOT 标志进行注册,并且它将取代所有其他标志。 此标志仅检查槽并返回而不执行任何其他操作。 |
| EEH_ENABLE_NO_SUPPORT_RC | 如果标记设置为 "eeh_enable_noo_support_rc,"eeh_enable_pio()和 "eeh_enable_dma()在特定条件下会返回 "EEH_NO_SUPPORT。 更多信息请参见 "eeh_enable_dma 内核服务和 "eeh_enable_pio 内核服务"。 |
多个标志可以逻辑 OR 合并。
当此服务由该插槽上的第一个驱动程序调用时,始终对 EEH 启用该插槽。 随后所有通过 EEH_ENABLE 标志启用插槽的请求都将被忽略。 因此,EEH_ENABLE标志参数是可选的,EEH_DISABLE 标志将被忽略。 EEH_CHECK_SLOT 的标志参数用于验证给定插槽是否已被注册。 返回 EEH_SLOT_ACTIVE 或 EEH_SLOT_FREE 的值。 使用 EEH_CHECK_SLOT 标志不会进行任何注册,该标志取代所有其他标志。 该标志只检查插槽并返回,不做任何其他操作。 如果标志设置为 EEH_ENABLE_NO_SUPPORT_RC,"eeh_enable_pio()和 "eeh_enable_dma()在某些条件下会返回 EEH_NO_SUPPORT。 更多信息请参见 "eeh_enable_pio()和 "eeh_enable_dma()"。 允许将多个标志逻辑地 OR 在一起。
delay_seconds 参数允许设备驱动程序设置从完成 PCI 重置到在适配器上配置网桥之间的时间延迟。 即使未桥接适配器,也会强制实施延迟。 如果为 delay_seconds指定的值为 0 ,那么将设置缺省 1 时间 1 秒。 当多个驱动程序在同一 普比德 (共享 EEH 域下) 上注册时,将使用所有已注册驱动程序中的最长延迟时间。
callback_ptr 自变量是一个指向 EEH 回调例程的函数指针。 该处理程序由设备驱动程序定义,并由内核调用以协调同一插槽上的不同驱动程序之间的恢复。 该驱动程序在其回调例程中处理来自内核的各种消息。 这些消息会触发恢复中的下一个步骤。 在 INTIODONE 中断级别按顺序调用回调例程。
dds_ptr 参数是在调用回调例程时传递到驱动程序的 cookie。 驱动程序通常指定指向设备驱动程序的适配器结构的指针。
EEH_SAFE 方式: 桥接适配器需要在 PCI 复位结束后重新配置其网桥。 但是,如果平台固件不支持对网桥进行重新配置,那么内核会将适配器标记为 EEH_SAFE。 由于未满足固件依赖关系, EEH_SAFE 适配器无法在 EEH 事件后完成错误恢复。 有关如何在 EEH_SAFE 方式下处理错误恢复的信息,请参阅 eeh_reset_slot 。
为设备驱动程序提供了宏 EEH_INIT_MULTIPUNC(Gpbid, 普比德, 槽, 旗, delay_seconds, callback_ptr和 dds_ptr) ,以便调用此服务。 这是导出的内核服务。
执行环境
此内核服务只能从进程环境进行调用。
返回值
| 项 | 描述 |
|---|---|
| EHEH_FAIL | 无法分配 EEH 句柄。 |
| EEH_NO_SUPPORT | 在此系统上不支持 EEH ,未分配任何句柄。 |
| EEH_SLOT_ACTIVE | 给定插槽已注册。 |
| EEH_SLOT_FREE | 给定可用插槽。 |
| EEH_BUSY | 由于插槽处于错误恢复过程中,因此无法继续。 |
| struct eeh_handle * | 成功时。 |