eeh_read_slot_state 内核服务
用途
此服务返回与 EEH 操作相关的插槽的状态和功能。
语法
long eeh_read_slot_state(handle, state, support)
eeh_handle_t handle;
long *state;
long *support;
参数
| 项 | 描述 |
|---|---|
| 句柄 (handle) | 从 eeh_init 或 eeh_init_multifunc 获取的 EEH 句柄 |
| state | 与 EEH 相关的插槽的状态 |
| 支持 | 指示 EEH 是否受此插槽支持 |
描述
该服务用于查询插槽的硬件状态,并确定给定插槽是否支持 EEH。 如果驱动程序怀疑 PIO 数据无效 (例如,从读取寄存器中获取所有 Fs) ,那么应该调用此命令以确认 EEH 事件。 此服务返回 状态 中的硬件状态,并指示 支持中的插槽是否支持 EEH。 状态 和 支持 参数是整数值,如下所示:
有效的 状态 值如下所示:
| 项 | 描述 |
|---|---|
| EEH_NSTOPPED_RST_DEA | 重置已取消激活,并且适配器未处于已停止状态。 |
| EEH_NSTOPPED_RST_ACT | 重置已激活,并且适配器未处于已停止状态。 |
| EEH_STOPPED_LS_DIS | 适配器处于已停止状态,并且已取消激活复位信号并禁用 "装入/存储"。 |
| EEH_STOPPED_LS_ENA | 适配器处于已停止状态,已取消激活重置信号并启用 "装入/存储"。 |
| EH_UNAVAILABLE | 适配器永久或暂时不可用。 |
有效的 支持 值如下所示:
| 项 | 描述 |
|---|---|
| 0 | EEH 不受支持。 |
| 1 | 支持 EEH。 |
如果驱动程序可能在适配器上发生 EEH 事件,那么应该调用此服务并检查 EEH_STOPPED_LS_DIS 和 EEH_STOPPED_LS_ENA 作为 状态 值。 如果 状态 是这些值中的任何一个,那么表示该槽已冻结。
单功能驱动程序: 一个单功能适配器驱动程序调用此服务来查询插槽的状态。 如果由于硬件或固件原因导致服务失败,那么会记录错误。 如果服务失败,那么将取消定义 状态 和 支持 值,并返回 EEH_FAIL。
多功能驱动程序: 对于多功能适配器驱动程序,此服务会分析 状态 以确定是否:
- 状态已冻结,或者
- 它永久不可用 (即,插槽从此处开始不可用) ,或者
- 它暂时不可用。
如果插槽处于已冻结或暂时不可用状态,那么将向此插槽上的所有已注册驱动程序广播 EEH_DD_SUSPEND 消息。 如果插槽永久不可用 (即,已失效) ,那么将广播 EEH_DD_DEAD 消息。 在收到此消息后,驱动程序将暂挂所有进一步的 DMA , PIO ,中断和配置循环等,直到插槽恢复为止。 如果由于硬件或固件原因而导致服务失败,那么将记录错误,广播 EEH_DD_DEAD ,并返回 EEH_FAIL。
临时或永久不可用状态
除了 状态 和 支持之外,如果 状态 为 EH_UNAVAILABLE ,那么此服务还会在 eeh_handle 结构中返回有效的 retry_delay 值。 如果 retry_delay 为 0 ,那么它将永久不可用。 如果 retry_delay 为非零值,那么它暂时不可用。 永久不可用状态意味着在执行热插拔操作或分区重新引导之前,插槽不可用。 因此,驱动程序在接收到 EH_UNAVAILABLE 消息 (单功能) 或接收到 EEH_DD_DEAD 消息 (多功能) 时将其适配器标记为不可用。 暂时不可用的状态意味着插槽的当前 状态 是瞬态的,可能需要几分钟时间才能稳定下来。 在该时间之前,设备驱动程序无法开始恢复,因为它不知道最终状态将是什么。 临时不可用状态由单功能和多功能驱动程序以不同方式处理,如下所示:
单功能驱动程序: 由于单功能驱动程序驱动其自身的恢复,因此如果 状态 设置为 EH_UNAVAILABLE ,那么需要检查 retry_delay 。 如果 retry_delay 不为零,那么它表示驱动程序在再次调用此内核服务之前应等待的秒数。 只要 状态 为 EH_UNAVAILABLE 且 retry_delay 为非零值,它就会继续重复调用此服务。 最终, 状态 将以下列其中一项为最终结果:
- EEH_NSTOPPED_RST_ACT
- EEH_STOPPED_LS_DIS
- EH_UNAVAILABLE w/"retry_delay" 设置为 0 (即永久不可用)
此时,对于给定状态,驱动程序可以继续执行其正常操作过程。
多功能驱动程序: 当状态为 EH_UNAVAILABLE 时,多功能驱动程序不需要检查 retry_delay 字段,因为 EH_UNAVAILABLE 仅意味着永久不可用。 在暂时不可用的情况下,多功能驱动程序将在一段时间后接收到 EEH_DD_SUSPEND 或 EEH_DD_DEAD 消息,具体取决于插槽的最终 状态 。 如果最终状态为 EEH_NSTOPPED_RST_ACT 或 EEH_STOPPED_LS_DIS ,那么将广播 EEH_DD_SUSPEND; 如果是 EH_UNDED ,那么将广播 EEH_DD_DEAD。 因此,从多功能驱动程序的观点来看,冻结和临时不可用之间没有区别。
为设备驱动程序提供了宏 EEH_READ_SLOT_STATE(处理, 状态, 支持) 以调用此服务。
执行环境
可以从进程或中断环境中调用此内核服务。
返回值
| 项 | 描述 |
|---|---|
| EEH_SUCC | 已成功读取插槽状态和功能 |
| EHEH_FAIL | 无法读取插槽的状态和功能 |