編寫 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 ==
1res16保留
-
struct erw_eadm¶
EADM 子通道擴充套件報告字
定義:
struct erw_eadm {
__u32 : 16;
__u32 b : 1;
__u32 r : 1;
__u32 : 14;
};
成員
baob 錯誤
rarsb 錯誤
-
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輔助錯誤
ioerri/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 *cdevccw 裝置
描述
此函式用於在通道子系統中呼叫依賴於模型的日誌記錄。
-
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 *cdevccw 裝置
描述
如果存在路徑組,則返回非零值;否則,返回零。
-
int ccw_device_is_multipath(struct ccw_device *cdev)¶
確定裝置是否以多路徑模式執行
引數
struct ccw_device *cdevccw 裝置
描述
如果裝置以多路徑模式執行,則返回非零值;否則,返回零。
-
int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)¶
終止 I/O 請求處理
引數
struct ccw_device *cdev目標 ccw 裝置
unsigned long intparmcsch 結束後要返回的中斷引數
描述
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 intparmhsch 結束後要返回的中斷引數
描述
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_countssch 和 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。