編寫 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 驅動程式

引數

struct ccw_driver *cdriver

要註冊的驅動程式

描述

此函式主要是 driver_register() 的一個包裝器。

返回值

成功時返回 0,失敗時返回負錯誤值。

void ccw_driver_unregister(struct ccw_driver *cdriver)

登出一個 ccw 驅動程式

引數

struct ccw_driver *cdriver

要登出的驅動程式

描述

此函式主要是 driver_unregister() 的一個包裝器。

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 組驅動程式

引數

struct ccwgroup_driver *cdriver

要註冊的驅動程式

描述

此函式主要是 driver_register() 的一個包裝器。

void ccwgroup_driver_unregister(struct ccwgroup_driver *cdriver)

登出 ccw 組驅動程式

引數

struct ccwgroup_driver *cdriver

要登出的驅動程式

描述

此函式主要是 driver_unregister() 的一個包裝器。

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。