编写 s390 通道设备驱动程序¶
- 作者:
- Cornelia Huck 
简介¶
本文档描述了可用于驱动基于 s390 的通道连接 I/O 设备的设备驱动程序的接口。这包括用于与硬件交互的接口和用于与通用驱动程序核心交互的接口。这些接口由 s390 通用 I/O 层提供。
本文档假定熟悉与 s390 通道 I/O 架构相关的技术术语。有关此架构的描述,请参阅 IBM 出版物 SA22-7832,“z/Architecture:操作原理”。
虽然 s390 系统上的大多数 I/O 设备通常通过此处描述的通道 I/O 机制驱动,但还有各种其他方法(如 diag 接口)。这些不在本文档的范围之内。
s390 通用 I/O 层还提供对一些严格来说不被认为是 I/O 设备的设备的访问。这里也考虑了它们,尽管它们不是本文档的重点。
一些其他信息也可以在 S/390 驱动程序模型接口 下的内核源代码中找到。
css 总线¶
css 总线包含系统上可用的子通道。它们分为几个类别
- 标准 I/O 子通道,供系统使用。它们在 ccw 总线上有一个子设备,如下所述。 
- 绑定到 vfio-ccw 驱动程序的 I/O 子通道。请参阅 vfio-ccw:基本基础设施。 
- 消息子通道。当前不存在 Linux 驱动程序。 
- CHSC 子通道(最多一个)。chsc 子通道驱动程序可用于发送异步 chsc 命令。 
- eADM 子通道。用于与存储类内存通信。 
ccw 总线¶
ccw 总线通常包含 s390 系统可用的大多数设备。以通道命令字 (ccw) 命名,ccw 是用于寻址其设备的基本命令结构,ccw 总线包含所谓的通道连接设备。它们通过 I/O 子通道寻址,这些子通道在 css 总线上可见。但是,用于通道连接设备的设备驱动程序永远不会直接与子通道交互,而只会通过 ccw 总线上的 I/O 设备(ccw 设备)交互。
通道连接设备的 I/O 功能¶
一些硬件结构已被转换为 C 结构,供通用 I/O 层和设备驱动程序使用。有关此处表示的硬件结构的更多信息,请参阅《操作原理》。
- 
struct ccw1¶
- 通道命令字 
定义:
struct ccw1 {
    __u8 cmd_code;
    __u8 flags;
    __u16 count;
    dma32_t cda;
};
成员
- cmd_code
- 命令代码 
- flags
- 标志,如 IDA 寻址等。 
- count
- 字节计数 
- cda
- 数据地址 
描述
ccw 是构建通道程序以执行设备或控制单元操作的基本结构。仅支持格式 1 通道命令字。
- 
struct ccw0¶
- 通道命令字 
定义:
struct ccw0 {
    __u8 cmd_code;
    __u32 cda : 24;
    __u8 flags;
    __u8 reserved;
    __u16 count;
};
成员
- cmd_code
- 命令代码 
- cda
- 数据地址 
- flags
- 标志,如 IDA 寻址等。 
- 保留
- 将被忽略 
- count
- 字节计数 
描述
格式 0 ccw 结构。
- 
struct erw¶
- 扩展报告字 
定义:
struct erw {
    __u32 res0  : 3;
    __u32 auth  : 1;
    __u32 pvrf  : 1;
    __u32 cpt   : 1;
    __u32 fsavf : 1;
    __u32 cons  : 1;
    __u32 scavf : 1;
    __u32 fsaf  : 1;
    __u32 scnt  : 6;
    __u32 res16 : 16;
};
成员
- res0
- 保留 
- auth
- 授权检查 
- pvrf
- 路径验证必需标志 
- cpt
- 通道路径超时 
- fsavf
- 故障存储地址有效性标志 
- cons
- 并发感知 
- scavf
- 辅助 ccw 地址有效性标志 
- fsaf
- 故障存储地址格式 
- scnt
- 感知计数,如果 cons == - 1
- res16
- 保留 
- 
struct erw_eadm¶
- EADM 子通道扩展报告字 
定义:
struct erw_eadm {
    __u32 : 16;
    __u32 b : 1;
    __u32 r : 1;
    __u32 : 14;
};
成员
- b
- aob 错误 
- r
- arsb 错误 
- 
struct sublog¶
- 子通道注销区域 
定义:
struct sublog {
    __u32 res0  : 1;
    __u32 esf   : 7;
    __u32 lpum  : 8;
    __u32 arep  : 1;
    __u32 fvf   : 5;
    __u32 sacc  : 2;
    __u32 termc : 2;
    __u32 devsc : 1;
    __u32 serr  : 1;
    __u32 ioerr : 1;
    __u32 seqc  : 3;
};
成员
- res0
- 保留 
- esf
- 扩展状态标志 
- lpum
- 上次使用的路径掩码 
- arep
- 辅助报告 
- fvf
- 字段有效性标志 
- sacc
- 存储访问代码 
- termc
- 终止代码 
- devsc
- 设备状态检查 
- serr
- 辅助错误 
- ioerr
- i/o 错误警报 
- seqc
- 序列代码 
- 
struct esw0¶
- 格式 0 扩展状态字 (ESW) 
定义:
struct esw0 {
    struct sublog sublog;
    struct erw erw;
    dma32_t faddr[2];
    dma32_t saddr;
};
成员
- sublog
- 子通道注销 
- erw
- 扩展报告字 
- faddr
- 故障存储地址 
- saddr
- 辅助 ccw 地址 
- 
struct esw1¶
- 格式 1 扩展状态字 (ESW) 
定义:
struct esw1 {
    __u8 zero0;
    __u8 lpum;
    __u16 zero16;
    struct erw erw;
    __u32 zeros[3];
};
成员
- zero0
- 保留零 
- lpum
- 上次使用的路径掩码 
- zero16
- 保留零 
- erw
- 扩展报告字 
- 零
- 三个全字零 
- 
struct esw2¶
- 格式 2 扩展状态字 (ESW) 
定义:
struct esw2 {
    __u8 zero0;
    __u8 lpum;
    __u16 dcti;
    struct erw erw;
    __u32 zeros[3];
};
成员
- zero0
- 保留零 
- lpum
- 上次使用的路径掩码 
- dcti
- 设备连接时间间隔 
- erw
- 扩展报告字 
- 零
- 三个全字零 
- 
struct esw3¶
- 格式 3 扩展状态字 (ESW) 
定义:
struct esw3 {
    __u8 zero0;
    __u8 lpum;
    __u16 res;
    struct erw erw;
    __u32 zeros[3];
};
成员
- zero0
- 保留零 
- lpum
- 上次使用的路径掩码 
- res
- 保留 
- erw
- 扩展报告字 
- 零
- 三个全字零 
- 
struct esw_eadm¶
- EADM 子通道扩展状态字 (ESW) 
定义:
struct esw_eadm {
    __u32 sublog;
    struct erw_eadm erw;
    __u32 : 32;
    __u32 : 32;
    __u32 : 32;
};
成员
- sublog
- 子通道注销 
- erw
- 扩展报告字 
- 
struct irb¶
- 中断响应块 
定义:
struct irb {
    union scsw scsw;
    union {
        struct esw0 esw0;
        struct esw1 esw1;
        struct esw2 esw2;
        struct esw3 esw3;
        struct esw_eadm eadm;
    } esw;
    __u8 ecw[32];
};
成员
- scsw
- 子通道状态字 
- esw
- 扩展状态字 
- ecw
- 扩展控制字 
描述
中断发生时传递给设备驱动程序的 irb。对于请求的中断,通用 I/O 层已经执行检查以验证字段是否有效;无效字段始终作为 0 传递。如果发生单元检查,ecw 可能包含感知数据;如果设备不支持并发感知,则通用 I/O 层本身会检索此数据(以便设备驱动程序永远不需要执行基本感知)。对于未经请求的中断,irb 按原样传递(适用时感知数据除外)。
- 
struct ciw¶
- 命令信息字 (CIW) 布局 
定义:
struct ciw {
    __u32 et       :  2;
    __u32 reserved :  2;
    __u32 ct       :  4;
    __u32 cmd      :  8;
    __u32 count    : 16;
};
成员
- et
- 条目类型 
- 保留
- 保留位 
- ct
- 命令类型 
- cmd
- 命令代码 
- count
- 命令计数 
- 
struct ccw_dev_id¶
- ccw 设备的唯一标识符 
定义:
struct ccw_dev_id {
    u8 ssid;
    u16 devno;
};
成员
- ssid
- 子通道集 ID 
- devno
- 设备号 
描述
此结构不直接基于任何硬件结构。硬件通过其设备号和子通道标识设备,而子通道又通过其 ID 标识。为了获得跨子通道集的 ccw 设备的唯一标识符,引入了 struct ccw_dev_id。
- 
int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1, struct ccw_dev_id *dev_id2)¶
- 比较两个 ccw_dev_id 
参数
- struct ccw_dev_id *dev_id1
- 一个 ccw_dev_id 
- struct ccw_dev_id *dev_id2
- 另一个 ccw_dev_id 
返回值
如果两个结构按字段相等,则返回
1,否则返回0。
上下文
任何
- 
u8 pathmask_to_pos(u8 mask)¶
- 查找路径掩码中最左侧位的位置 
参数
- u8 mask
- 路径掩码,至少设置一位 
ccw 设备¶
想要启动通道 I/O 的设备需要连接到 ccw 总线。与驱动程序核心的交互通过通用 I/O 层完成,该层提供 ccw 设备和 ccw 设备驱动程序的抽象。
启动或终止通道 I/O 的函数都作用于 ccw 设备结构。设备驱动程序不得绕过这些函数,否则可能会发生奇怪的副作用。
- 
struct ccw_device¶
- 通道连接设备 
定义:
struct ccw_device {
    spinlock_t *ccwlock;
    struct ccw_device_id id;
    struct ccw_driver *drv;
    struct device dev;
    int online;
    void (*handler) (struct ccw_device *, unsigned long, struct irb *);
};
成员
- ccwlock
- 指向设备锁的指针 
- id
- 此设备的 ID 
- drv
- 此设备的 ccw 驱动程序 
- dev
- 嵌入式设备结构 
- online
- 设备的在线状态 
- handler
- 中断处理程序 
描述
由于驱动程序可以为不同的 ccw 设备(多子通道驱动程序)具有不同的中断处理程序,因此 handler 是设备而不是驱动程序的成员。
- 
struct ccw_driver¶
- 通道连接设备的设备驱动程序 
定义:
struct ccw_driver {
    struct ccw_device_id *ids;
    int (*probe) (struct ccw_device *);
    void (*remove) (struct ccw_device *);
    int (*set_online) (struct ccw_device *);
    int (*set_offline) (struct ccw_device *);
    int (*notify) (struct ccw_device *, int);
    void (*path_event) (struct ccw_device *, int *);
    void (*shutdown) (struct ccw_device *);
    enum uc_todo (*uc_handler) (struct ccw_device *, struct irb *);
    struct device_driver driver;
    enum interruption_class int_class;
};
成员
- ids
- 此驱动程序支持的 ID 
- probe
- 探测时调用的函数 
- remove
- 删除时调用的函数 
- set_online
- 设置设备在线时调用 
- set_offline
- 设置设备离线时调用 
- notify
- 通知驱动程序设备状态更改 
- path_event
- 通知驱动程序通道路径事件 
- shutdown
- 设备关闭时调用 
- uc_handler
- 单元检查处理程序的回调 
- driver
- 嵌入式设备驱动程序结构 
- int_class
- 用于计算中断的中断类 
- 
int ccw_device_set_offline(struct ccw_device *cdev)¶
- 禁用 ccw 设备以进行 I/O 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
描述
此函数为 cdev 调用驱动程序的 set_offline() 函数(如果给定),然后禁用 cdev。
返回值
成功时返回
0,失败时返回负错误值。
上下文
已启用,未持有 ccw 设备锁
- 
int ccw_device_set_online(struct ccw_device *cdev)¶
- 启用 ccw 设备以进行 I/O 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
描述
此函数首先启用 cdev,然后为 cdev 调用驱动程序的 set_online() 函数(如果给定)。如果 set_online() 返回错误,则再次禁用 cdev。
返回值
成功时返回
0,失败时返回负错误值。
上下文
已启用,未持有 ccw 设备锁
- 
struct ccw_device *get_ccwdev_by_dev_id(struct ccw_dev_id *dev_id)¶
- 从 ccw 设备 ID 获取设备 
参数
- struct ccw_dev_id *dev_id
- 要搜索的设备的 ID 
描述
此函数搜索连接到 ccw 总线的所有设备,以查找与 dev_id 匹配的设备。
返回值
如果找到设备,则其引用计数会增加并返回;否则,返回
NULL。
- 
struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv, const char *bus_id)¶
- 从总线 ID 获取设备 
参数
- struct ccw_driver *cdrv
- 设备所属的驱动程序 
- const char *bus_id
- 要搜索的设备的总线 ID 
描述
此函数搜索 cdrv 拥有的所有设备,以查找总线 ID 与 bus_id 匹配的设备。
返回值
如果找到匹配项,则找到的设备的引用计数会增加并返回;否则,返回
NULL。
- 
int ccw_driver_register(struct ccw_driver *cdriver)¶
- 注册一个 ccw 驱动程序 
- 
void ccw_driver_unregister(struct ccw_driver *cdriver)¶
- 注销一个 ccw 驱动程序 
- 
int ccw_device_siosl(struct ccw_device *cdev)¶
- 启动日志记录 
参数
- struct ccw_device *cdev
- ccw 设备 
描述
此函数用于在通道子系统中调用依赖于模型的日志记录。
- 
int ccw_device_set_options_mask(struct ccw_device *cdev, unsigned long flags)¶
- 设置一些选项并取消设置其余选项 
参数
- struct ccw_device *cdev
- 要为其设置选项的设备 
- unsigned long flags
- 要设置的选项 
描述
设置 flags 中指定的所有标志,清除 flags 中未指定的所有标志。
返回值
成功时返回
0,如果标志组合无效,则返回 -EINVAL。
- 
int ccw_device_set_options(struct ccw_device *cdev, unsigned long flags)¶
- 设置一些选项 
参数
- struct ccw_device *cdev
- 要为其设置选项的设备 
- unsigned long flags
- 要设置的选项 
描述
设置 flags 中指定的所有标志,其余部分保持不变。
返回值
成功时返回
0,如果出现无效的标志组合,则返回 -EINVAL。
- 
void ccw_device_clear_options(struct ccw_device *cdev, unsigned long flags)¶
- 清除一些选项 
参数
- struct ccw_device *cdev
- 要为其清除选项的设备 
- unsigned long flags
- 要清除的选项 
描述
清除 flags 中指定的所有标志,其余部分保持不变。
- 
int ccw_device_is_pathgroup(struct ccw_device *cdev)¶
- 确定到此设备的路径是否已分组 
参数
- struct ccw_device *cdev
- ccw 设备 
描述
如果存在路径组,则返回非零值;否则,返回零。
- 
int ccw_device_is_multipath(struct ccw_device *cdev)¶
- 确定设备是否以多路径模式运行 
参数
- struct ccw_device *cdev
- ccw 设备 
描述
如果设备以多路径模式运行,则返回非零值;否则,返回零。
- 
int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)¶
- 终止 I/O 请求处理 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
- unsigned long intparm
- csch 结束后要返回的中断参数 
描述
ccw_device_clear() 在 cdev 的子通道上调用 csch。
返回值
成功时返回
0,设备未运行时返回 -ENODEV,设备状态无效时返回 -EINVAL。
上下文
禁用中断,持有 ccw 设备锁
- 
int ccw_device_start_timeout_key(struct ccw_device *cdev, struct ccw1 *cpa, unsigned long intparm, __u8 lpm, __u8 key, unsigned long flags, int expires)¶
- 使用超时和密钥启动一个 s390 通道程序 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
- struct ccw1 *cpa
- 通道程序的逻辑起始地址 
- unsigned long intparm
- 用户特定的中断参数;将返回给 cdev 的中断处理程序。允许设备驱动程序将中断与特定的 I/O 请求相关联。 
- __u8 lpm
- 定义要用于特定 I/O 请求的通道路径。值为 0 将使 cio 使用 opm。 
- __u8 key
- 用于 I/O 的存储密钥 
- unsigned long flags
- 其他标志;定义要为 I/O 处理执行的操作。 
- int expires
- 以节拍为单位的超时值 
描述
启动 S/390 通道程序。当中断到达时,将立即、延迟(缺少 dev-end 或需要感应)或从不(未注册 IRQ 处理程序)调用 IRQ 处理程序。如果在 expires 指定的时间内通道程序未完成,则此函数会通知设备驱动程序。如果发生超时,则通道程序将通过 xsch、hsch 或 csch 终止,并且设备的 中断处理程序将使用包含 ERR_PTR(-ETIMEDOUT) 的 irb 进行调用。除非通过后续调用 ccw_device_halt() 或 ccw_device_clear() 来指定另一个中断参数,否则中断处理程序将回显此处指定的 intparm。
返回值
如果操作成功,则返回
0;如果设备繁忙或状态挂起,则返回 -EBUSY;如果 lpm 中未指定任何运行路径,则返回 -EACCES;如果设备未运行,则返回 -ENODEV。
上下文
禁用中断,持有 ccw 设备锁
- 
int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa, unsigned long intparm, __u8 lpm, __u8 key, unsigned long flags)¶
- 使用密钥启动一个 s390 通道程序 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
- struct ccw1 *cpa
- 通道程序的逻辑起始地址 
- unsigned long intparm
- 用户特定的中断参数;将返回给 cdev 的中断处理程序。允许设备驱动程序将中断与特定的 I/O 请求相关联。 
- __u8 lpm
- 定义要用于特定 I/O 请求的通道路径。值为 0 将使 cio 使用 opm。 
- __u8 key
- 用于 I/O 的存储密钥 
- unsigned long flags
- 其他标志;定义要为 I/O 处理执行的操作。 
描述
启动 S/390 通道程序。当中断到达时,将立即、延迟(缺少 dev-end 或需要感应)或从不(未注册 IRQ 处理程序)调用 IRQ 处理程序。除非通过后续调用 ccw_device_halt() 或 ccw_device_clear() 来指定另一个中断参数,否则中断处理程序将回显此处指定的 intparm。
返回值
如果操作成功,则返回
0;如果设备繁忙或状态挂起,则返回 -EBUSY;如果 lpm 中未指定任何运行路径,则返回 -EACCES;如果设备未运行,则返回 -ENODEV。
上下文
禁用中断,持有 ccw 设备锁
- 
int ccw_device_start(struct ccw_device *cdev, struct ccw1 *cpa, unsigned long intparm, __u8 lpm, unsigned long flags)¶
- 启动一个 s390 通道程序 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
- struct ccw1 *cpa
- 通道程序的逻辑起始地址 
- unsigned long intparm
- 用户特定的中断参数;将返回给 cdev 的中断处理程序。允许设备驱动程序将中断与特定的 I/O 请求相关联。 
- __u8 lpm
- 定义要用于特定 I/O 请求的通道路径。值为 0 将使 cio 使用 opm。 
- unsigned long flags
- 其他标志;定义要为 I/O 处理执行的操作。 
描述
启动 S/390 通道程序。当中断到达时,将立即、延迟(缺少 dev-end 或需要感应)或从不(未注册 IRQ 处理程序)调用 IRQ 处理程序。除非通过后续调用 ccw_device_halt() 或 ccw_device_clear() 来指定另一个中断参数,否则中断处理程序将回显此处指定的 intparm。
返回值
如果操作成功,则返回
0;如果设备繁忙或状态挂起,则返回 -EBUSY;如果 lpm 中未指定任何运行路径,则返回 -EACCES;如果设备未运行,则返回 -ENODEV。
上下文
禁用中断,持有 ccw 设备锁
- 
int ccw_device_start_timeout(struct ccw_device *cdev, struct ccw1 *cpa, unsigned long intparm, __u8 lpm, unsigned long flags, int expires)¶
- 使用超时启动一个 s390 通道程序 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
- struct ccw1 *cpa
- 通道程序的逻辑起始地址 
- unsigned long intparm
- 用户特定的中断参数;将返回给 cdev 的中断处理程序。允许设备驱动程序将中断与特定的 I/O 请求相关联。 
- __u8 lpm
- 定义要用于特定 I/O 请求的通道路径。值为 0 将使 cio 使用 opm。 
- unsigned long flags
- 其他标志;定义要为 I/O 处理执行的操作。 
- int expires
- 以节拍为单位的超时值 
描述
启动 S/390 通道程序。当中断到达时,将立即、延迟(缺少 dev-end 或需要感应)或从不(未注册 IRQ 处理程序)调用 IRQ 处理程序。如果在 expires 指定的时间内通道程序未完成,则此函数会通知设备驱动程序。如果发生超时,则通道程序将通过 xsch、hsch 或 csch 终止,并且设备的 中断处理程序将使用包含 ERR_PTR(-ETIMEDOUT) 的 irb 进行调用。除非通过后续调用 ccw_device_halt() 或 ccw_device_clear() 来指定另一个中断参数,否则中断处理程序将回显此处指定的 intparm。
返回值
如果操作成功,则返回
0;如果设备繁忙或状态挂起,则返回 -EBUSY;如果 lpm 中未指定任何运行路径,则返回 -EACCES;如果设备未运行,则返回 -ENODEV。
上下文
禁用中断,持有 ccw 设备锁
- 
int ccw_device_halt(struct ccw_device *cdev, unsigned long intparm)¶
- 暂停 I/O 请求处理 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
- unsigned long intparm
- hsch 结束后要返回的中断参数 
描述
ccw_device_halt() 在 cdev 的子通道上调用 hsch。除非通过后续调用 ccw_device_clear() 来指定另一个中断参数,否则中断处理程序将回显此处指定的 intparm。
返回值
成功时返回
0,设备未运行时返回 -ENODEV,设备状态无效时返回 -EINVAL,设备繁忙或中断挂起时返回 -EBUSY。
上下文
禁用中断,持有 ccw 设备锁
- 
int ccw_device_resume(struct ccw_device *cdev)¶
- 恢复通道程序的执行 
参数
- struct ccw_device *cdev
- 目标 ccw 设备 
描述
ccw_device_resume() 在 cdev 的子通道上调用 rsch。
返回值
成功时返回
0,设备未运行时返回 -ENODEV,设备状态无效时返回 -EINVAL,设备繁忙或中断挂起时返回 -EBUSY。
上下文
禁用中断,持有 ccw 设备锁
- 
struct ciw *ccw_device_get_ciw(struct ccw_device *cdev, __u32 ct)¶
- 在扩展的传感数据中搜索 CIW 命令。 
参数
- struct ccw_device *cdev
- 要检查的 ccw 设备 
- __u32 ct
- 要查找的命令类型 
描述
在 SenseID 期间,描述设备可用的特殊命令的命令信息字 (CIW) 可能已存储在扩展的传感数据中。此函数在扩展的传感数据中搜索指定命令类型的 CIW。
返回值
如果未存储扩展的传感数据,或者未找到指定命令类型的 CIW,则返回
NULL。否则,返回指向指定命令类型的 CIW 的指针。
- 
__u8 ccw_device_get_path_mask(struct ccw_device *cdev)¶
- 获取当前可用的路径 
参数
- struct ccw_device *cdev
- 要查询的 ccw 设备 
返回值
如果设备没有子通道,则返回
0。否则,返回 ccw 设备子通道当前可用路径的掩码。
- 
struct channel_path_desc_fmt0 *ccw_device_get_chp_desc(struct ccw_device *cdev, int chp_idx)¶
- 返回新分配的通道路径描述符 
参数
- struct ccw_device *cdev
- 要获取描述符的设备 
- int chp_idx
- 通道路径的索引 
描述
成功时,返回与给定通道路径关联的通道路径描述数据的新分配的副本。 发生错误时,返回 NULL。
- 
u8 *ccw_device_get_util_str(struct ccw_device *cdev, int chp_idx)¶
- 返回新分配的实用程序字符串 
参数
- struct ccw_device *cdev
- 要获取实用程序字符串的设备 
- int chp_idx
- 通道路径的索引 
描述
成功时,返回与给定通道路径关联的实用程序字符串的新分配的副本。 发生错误时,返回 NULL。
- 
void ccw_device_get_id(struct ccw_device *cdev, struct ccw_dev_id *dev_id)¶
- 获取 ccw 设备 ID 
参数
- struct ccw_device *cdev
- 要获取 ID 的设备 
- struct ccw_dev_id *dev_id
- 在哪里填充值 
- 
int ccw_device_tm_start_timeout_key(struct ccw_device *cdev, struct tcw *tcw, unsigned long intparm, u8 lpm, u8 key, int expires)¶
- 执行启动功能 
参数
- struct ccw_device *cdev
- 要在其上执行启动功能的 ccw 设备 
- struct tcw *tcw
- 要启动的传输命令字 
- unsigned long intparm
- 要传递给中断处理程序的用户定义参数 
- u8 lpm
- 要使用的路径的掩码 
- u8 key
- 用于存储访问的存储键 
- int expires
- 在中止请求之后的时间跨度,以 jiffies 为单位 
描述
在给定的 ccw 设备上启动 tcw。 成功时返回零,否则返回非零值。
- 
int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw, unsigned long intparm, u8 lpm, u8 key)¶
- 执行启动功能 
参数
- struct ccw_device *cdev
- 要在其上执行启动功能的 ccw 设备 
- struct tcw *tcw
- 要启动的传输命令字 
- unsigned long intparm
- 要传递给中断处理程序的用户定义参数 
- u8 lpm
- 要使用的路径的掩码 
- u8 key
- 用于存储访问的存储键 
描述
在给定的 ccw 设备上启动 tcw。 成功时返回零,否则返回非零值。
- 
int ccw_device_tm_start(struct ccw_device *cdev, struct tcw *tcw, unsigned long intparm, u8 lpm)¶
- 执行启动功能 
参数
- struct ccw_device *cdev
- 要在其上执行启动功能的 ccw 设备 
- struct tcw *tcw
- 要启动的传输命令字 
- unsigned long intparm
- 要传递给中断处理程序的用户定义参数 
- u8 lpm
- 要使用的路径的掩码 
描述
在给定的 ccw 设备上启动 tcw。 成功时返回零,否则返回非零值。
- 
int ccw_device_tm_start_timeout(struct ccw_device *cdev, struct tcw *tcw, unsigned long intparm, u8 lpm, int expires)¶
- 执行启动功能 
参数
- struct ccw_device *cdev
- 要在其上执行启动功能的 ccw 设备 
- struct tcw *tcw
- 要启动的传输命令字 
- unsigned long intparm
- 要传递给中断处理程序的用户定义参数 
- u8 lpm
- 要使用的路径的掩码 
- int expires
- 在中止请求之后的时间跨度,以 jiffies 为单位 
描述
在给定的 ccw 设备上启动 tcw。 成功时返回零,否则返回非零值。
- 
int ccw_device_get_mdc(struct ccw_device *cdev, u8 mask)¶
- 累积最大数据计数 
参数
- struct ccw_device *cdev
- 为其累积最大数据计数的 ccw 设备 
- u8 mask
- 要使用的路径的掩码 
描述
返回所有路径至少支持的传输命令的 64K 字节块的数量。 返回值 0 表示失败。
- 
int ccw_device_tm_intrg(struct ccw_device *cdev)¶
- 执行询问功能 
参数
- struct ccw_device *cdev
- 要在其上执行询问功能的 ccw 设备 
描述
在给定的 ccw 设备上执行询问功能。 成功时返回零,否则返回非零值。
- 
void ccw_device_get_schid(struct ccw_device *cdev, struct subchannel_id *schid)¶
- 获取子通道 ID 
参数
- struct ccw_device *cdev
- 要获取 ID 的设备 
- struct subchannel_id *schid
- 在哪里填充值 
- 
int ccw_device_pnso(struct ccw_device *cdev, struct chsc_pnso_area *pnso_area, u8 oc, struct chsc_pnso_resume_token resume_token, int cnc)¶
- 执行网络子通道操作 
参数
- struct ccw_device *cdev
- 执行 PNSO 的设备 
- struct chsc_pnso_area *pnso_area
- 操作的请求和响应块 
- u8 oc
- 操作码 
- struct chsc_pnso_resume_token resume_token
- 多块响应的恢复令牌 
- int cnc
- 布尔更改通知控制 
描述
pnso_area 必须由调用者使用 get_zeroed_page(GFP_KERNEL) 分配
成功时返回 0。
- 
int ccw_device_get_cssid(struct ccw_device *cdev, u8 *cssid)¶
- 获取通道子系统 ID 
参数
- struct ccw_device *cdev
- 要获取 CSSID 的设备 
- u8 *cssid
- 生成的通道子系统 ID 
- 
int ccw_device_get_iid(struct ccw_device *cdev, u8 *iid)¶
- 获取 MIF 映像 ID 
参数
- struct ccw_device *cdev
- 要获取 MIF 映像 ID 的设备 
- u8 *iid
- 生成的 MIF 映像 ID 
- 
int ccw_device_get_chpid(struct ccw_device *cdev, int chp_idx, u8 *chpid)¶
- 获取通道路径 ID 
参数
- struct ccw_device *cdev
- 要获取通道路径 ID 的设备 
- int chp_idx
- 通道路径的索引 
- u8 *chpid
- 生成的通道路径 ID 
- 
int ccw_device_get_chid(struct ccw_device *cdev, int chp_idx, u16 *chid)¶
- 获取与指定 CHPID 关联的通道 ID 
参数
- struct ccw_device *cdev
- 要获取通道 ID 的设备 
- int chp_idx
- 通道路径的索引 
- u16 *chid
- 生成的通道 ID 
通道测量设施¶
通道测量设施提供了一种收集测量数据的方法,这些测量数据由通道子系统为每个连接的通道设备提供。
- 
struct cmbdata¶
- 用户空间的通道测量块数据 
定义:
struct cmbdata {
    __u64 size;
    __u64 elapsed_time;
    __u64 ssch_rsch_count;
    __u64 sample_count;
    __u64 device_connect_time;
    __u64 function_pending_time;
    __u64 device_disconnect_time;
    __u64 control_unit_queuing_time;
    __u64 device_active_only_time;
    __u64 device_busy_time;
    __u64 initial_command_response_time;
};
成员
- 大小
- 存储数据的大小 
- elapsed_time
- 自上次采样以来的时间 
- ssch_rsch_count
- ssch 和 rsch 的数量 
- sample_count
- 样本数 
- device_connect_time
- 设备连接时间 
- function_pending_time
- 功能挂起的时间 
- device_disconnect_time
- 设备断开连接的时间 
- control_unit_queuing_time
- 控制单元排队的时间 
- device_active_only_time
- 设备仅活动的时间 
- device_busy_time
- 设备忙碌的时间(扩展格式) 
- initial_command_response_time
- 初始命令响应时间(扩展格式) 
描述
为了简单起见,所有值都存储为 64 位,尤其是在 32 位模拟模式下。 所有时间值都已归一化为纳秒。 目前,已知两种格式,它们的结构大小不同,即仅当激活了扩展通道测量设施(首次在 z990 机器中提供)时,才设置最后两个成员。 潜在地,可以添加更多字段,这将导致新的 ioctl 编号。
- 
int enable_cmf(struct ccw_device *cdev)¶
- 打开特定设备的通道测量 
参数
- struct ccw_device *cdev
- 要启用的 ccw 设备 - 启用 cdev 的通道测量。 如果在已启用通道测量的设备上调用此函数,则会触发测量数据的重置。 
返回值
成功时返回 0,否则返回负错误值。
上下文
非原子
- 
int disable_cmf(struct ccw_device *cdev)¶
- 关闭特定设备的通道测量 
参数
- struct ccw_device *cdev
- 要禁用的 ccw 设备 
返回值
成功时返回 0,否则返回负错误值。
上下文
非原子
- 
u64 cmf_read(struct ccw_device *cdev, int index)¶
- 从当前通道测量块中读取一个值 
参数
- struct ccw_device *cdev
- 要读取的通道 
- int index
- 要读取的值的索引 
返回值
读取的值,或者如果无法读取,则为 0。
上下文
任何
- 
int cmf_readall(struct ccw_device *cdev, struct cmbdata *data)¶
- 读取当前的通道测量块 
参数
- struct ccw_device *cdev
- 要读取的通道 
- struct cmbdata *data
- 指向将被填充的数据块的指针 
返回值
成功时为 0,否则为负的错误值。
上下文
任何
ccwgroup 总线¶
ccwgroup 总线仅包含由用户创建的人工设备。 许多网络设备(例如 qeth)实际上由几个 ccw 设备组成(例如 qeth 的读取、写入和数据通道)。 ccwgroup 总线提供了一种机制来创建元设备,该元设备包含这些 ccw 设备作为从设备,并且可以与 netdevice 相关联。
ccw 组设备¶
- 
struct ccwgroup_device¶
- ccw 组设备 
定义:
struct ccwgroup_device {
    enum {
        CCWGROUP_OFFLINE,
        CCWGROUP_ONLINE,
    } state;
    unsigned int count;
    struct device   dev;
    struct work_struct ungroup_work;
    struct ccw_device *cdev[];
};
成员
- 状态
- 在线/离线状态 
- count
- 连接的从设备数量 
- dev
- 嵌入式设备结构 
- ungroup_work
- 用于取消 ccwgroup 设备的组合 
- cdev
- 可变数量的从设备,根据需要分配 
- 
struct ccwgroup_driver¶
- ccw 组设备的驱动程序 
定义:
struct ccwgroup_driver {
    int (*setup) (struct ccwgroup_device *);
    void (*remove) (struct ccwgroup_device *);
    int (*set_online) (struct ccwgroup_device *);
    int (*set_offline) (struct ccwgroup_device *);
    void (*shutdown)(struct ccwgroup_device *);
    struct device_driver driver;
    struct ccw_driver *ccw_driver;
};
成员
- setup
- 在设备创建期间调用的函数,用于设置设备 
- remove
- 删除时调用的函数 
- set_online
- 设备设置为在线时调用的函数 
- set_offline
- 设备设置为离线时调用的函数 
- shutdown
- 设备关闭时调用的函数 
- driver
- 嵌入式驱动程序结构 
- ccw_driver
- 支持的 ccw_driver(可选) 
- 
int ccwgroup_set_online(struct ccwgroup_device *gdev)¶
- 启用 ccwgroup 设备 
参数
- struct ccwgroup_device *gdev
- 目标 ccwgroup 设备 
描述
此函数尝试将 ccwgroup 设备置于在线状态。
返回值
成功时返回
0,失败时返回负错误值。
- 
int ccwgroup_set_offline(struct ccwgroup_device *gdev, bool call_gdrv)¶
- 禁用 ccwgroup 设备 
参数
- struct ccwgroup_device *gdev
- 目标 ccwgroup 设备 
- bool call_gdrv
- 调用注册的 gdrv set_offline 函数 
描述
此函数尝试将 ccwgroup 设备置于离线状态。
返回值
成功时返回
0,失败时返回负错误值。
- 
int ccwgroup_create_dev(struct device *parent, struct ccwgroup_driver *gdrv, int num_devices, const char *buf)¶
- 创建并注册 ccw 组设备 
参数
- struct device *parent
- 新设备的父设备 
- struct ccwgroup_driver *gdrv
- 新组设备的驱动程序 
- int num_devices
- 从设备数量 
- const char *buf
- 包含以逗号分隔的从设备总线 ID 的缓冲区 
描述
创建并注册一个新的 ccw 组设备作为 parent 的子设备。 从设备从 buf 中给出的总线 ID 列表中获取。
返回值
成功时为
0,失败时为错误代码。
上下文
非原子
- 
int ccwgroup_driver_register(struct ccwgroup_driver *cdriver)¶
- 注册 ccw 组驱动程序 
- 
void ccwgroup_driver_unregister(struct ccwgroup_driver *cdriver)¶
- 注销 ccw 组驱动程序 
- 
int ccwgroup_probe_ccwdev(struct ccw_device *cdev)¶
- 从设备的探测函数 
参数
- struct ccw_device *cdev
- 要探测的 ccw 设备 
描述
这是一个用于 ccw 设备的虚拟探测函数,这些 ccw 设备是 ccw 组设备中的从设备。
返回值
始终为
0
- 
void ccwgroup_remove_ccwdev(struct ccw_device *cdev)¶
- 从设备的删除函数 
参数
- struct ccw_device *cdev
- 要删除的 ccw 设备 
描述
这是一个用于 ccw 设备的删除函数,这些 ccw 设备是 ccw 组设备中的从设备。 它将 ccw 设备设置为离线,并取消注册嵌入式 ccw 组设备。
通用接口¶
以下部分包含的接口不仅由处理 ccw 设备的驱动程序使用,还由各种其他 s390 硬件的驱动程序使用。
适配器中断¶
公共 I/O 层提供了用于处理适配器中断和中断向量的辅助函数。
- 
int register_adapter_interrupt(struct airq_struct *airq)¶
- 注册适配器中断处理程序 
参数
- struct airq_struct *airq
- 指向适配器中断描述符的指针 
描述
成功时返回 0,或 -EINVAL。
- 
void unregister_adapter_interrupt(struct airq_struct *airq)¶
- 注销适配器中断处理程序 
参数
- struct airq_struct *airq
- 指向适配器中断描述符的指针 
- 
struct airq_iv *airq_iv_create(unsigned long bits, unsigned long flags, unsigned long *vec)¶
- 创建中断向量 
参数
- unsigned long bits
- 中断向量中的位数 
- unsigned long flags
- 分配标志 
- unsigned long *vec
- 如果 AIRQ_IV_GUESTVEC,则指向固定的访客内存 
描述
返回指向中断向量结构的指针
- 
void airq_iv_release(struct airq_iv *iv)¶
- 释放中断向量 
参数
- struct airq_iv *iv
- 指向中断向量结构的指针 
- 
unsigned long airq_iv_alloc(struct airq_iv *iv, unsigned long num)¶
- 从中斷向量分配 irq 位 
参数
- struct airq_iv *iv
- 指向中断向量结构的指针 
- unsigned long num
- 要分配的连续 irq 位数 
描述
返回分配的 irq 块中第一个 irq 的位号,如果该位不可用或未指定 AIRQ_IV_ALLOC 标志,则返回 -1UL
- 
void airq_iv_free(struct airq_iv *iv, unsigned long bit, unsigned long num)¶
- 释放中断向量的 irq 位 
参数
- struct airq_iv *iv
- 指向中断向量结构的指针 
- unsigned long bit
- 要释放的第一个 irq 位的编号 
- unsigned long num
- 要释放的连续 irq 位数 
- 
unsigned long airq_iv_scan(struct airq_iv *iv, unsigned long start, unsigned long end)¶
- 扫描中断向量中的非零位 
参数
- struct airq_iv *iv
- 指向中断向量结构的指针 
- unsigned long start
- 开始搜索的位号 
- unsigned long end
- 结束搜索的位号 
描述
返回下一个非零中断位的位号,如果扫描完成没有找到任何其他非零位,则返回 -1UL。