基於訊息的裝置

Fusion 訊息裝置

u8 mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass, char *func_name)

註冊協議特定的主回撥處理程式。

引數

MPT_CALLBACK cbfunc

回撥函式指標

MPT_DRIVER_CLASS dclass

協議驅動程式的類(MPT_DRIVER_CLASS 列舉值)

char *func_name

呼叫函式的名稱

此例程由協議特定的驅動程式(SCSI 主機、LAN、SCSI 目標)呼叫,以註冊其回覆回撥例程。每個協議特定的驅動程式必須在能夠使用任何 IOC 資源(例如獲取請求幀)之前執行此操作。

注意

SCSI 協議驅動程式目前呼叫此例程三次

以便註冊單獨的回撥;一個用於“正常”SCSI IO;一個用於 MptScsiTaskMgmt 請求;一個用於 Scan/DV 請求。

如果成功,則返回 u8 值的“控制代碼”,範圍為(並且 S.O.D. 順序){N,...,7,6,5,...,1}。呼叫者應將 MPT_MAX_PROTOCOL_DRIVERS(包括零!)的返回值視為錯誤。

void mpt_deregister(u8 cb_idx)

登出協議驅動程式資源。

引數

u8 cb_idx

先前註冊的回撥控制代碼

每個協議特定的驅動程式都應在其模組解除安裝時呼叫此例程。

int mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc)

註冊協議特定的事件回撥處理程式。

引數

u8 cb_idx

先前註冊的(透過 mpt_register)回撥控制代碼

MPT_EVHANDLER ev_cbfunc

回撥函式

如果一個或多個協議特定的驅動程式選擇接收 MPT 事件的通知,則可以呼叫此例程。

成功返回 0。

void mpt_event_deregister(u8 cb_idx)

登出協議特定的事件回撥處理程式

引數

u8 cb_idx

先前註冊的回撥控制代碼

每個協議特定的驅動程式都應在其不處理(或無法再處理)事件時,或者在其模組解除安裝時呼叫此例程。

int mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func)

註冊協議特定的 IOC 重置處理程式。

引數

u8 cb_idx

先前註冊的(透過 mpt_register)回撥控制代碼

MPT_RESETHANDLER reset_func

重置函式

如果一個或多個協議特定的驅動程式選擇接收 IOC 重置的通知,則可以呼叫此例程。

成功返回 0。

void mpt_reset_deregister(u8 cb_idx)

登出協議特定的 IOC 重置處理程式。

引數

u8 cb_idx

先前註冊的回撥控制代碼

每個協議特定的驅動程式都應在其不處理(或無法再處理)IOC 重置處理時,或者在其模組解除安裝時呼叫此例程。

int mpt_device_driver_register(struct mpt_pci_driver *dd_cbfunc, u8 cb_idx)

註冊裝置驅動程式鉤子

引數

struct mpt_pci_driver * dd_cbfunc

驅動程式回撥結構

u8 cb_idx

MPT 協議驅動程式索引

void mpt_device_driver_deregister(u8 cb_idx)

登出裝置驅動程式鉤子

引數

u8 cb_idx

MPT 協議驅動程式索引

MPT_FRAME_HDR *mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc)

從池中獲取 MPT 請求幀

引數

u8 cb_idx

已註冊的 MPT 協議驅動程式的控制代碼

MPT_ADAPTER *ioc

指向 MPT 介面卡結構的指標

從每個 MPT 介面卡分配的池(1024 個)中獲取 MPT 請求幀。

如果沒有任何可用或 IOC 未啟用,則返回指向 MPT 請求幀的指標或 NULL

void mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)

將協議特定的 MPT 請求幀傳送到 IOC

引數

u8 cb_idx

已註冊的 MPT 協議驅動程式的控制代碼

MPT_ADAPTER *ioc

指向 MPT 介面卡結構的指標

MPT_FRAME_HDR *mf

指向 MPT 請求幀的指標

此例程將 MPT 請求幀釋出到特定 MPT 介面卡的請求釋出 FIFO。

void mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)

傳送高優先順序協議特定的 MPT 請求幀

引數

u8 cb_idx

已註冊的 MPT 協議驅動程式的控制代碼

MPT_ADAPTER *ioc

指向 MPT 介面卡結構的指標

MPT_FRAME_HDR *mf

指向 MPT 請求幀的指標

使用高優先順序請求佇列將協議特定的 MPT 請求幀傳送到 IOC。

此例程將 MPT 請求幀釋出到特定 MPT 介面卡的請求釋出 FIFO。

void mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)

將 MPT 請求幀放回 FreeQ。

引數

MPT_ADAPTER *ioc

指向 MPT 介面卡結構的指標

MPT_FRAME_HDR *mf

指向 MPT 請求幀的指標

此例程將 MPT 請求幀放回 MPT 介面卡的 FreeQ。

int mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)

透過門鈴握手方法傳送 MPT 請求。

引數

u8 cb_idx

已註冊的 MPT 協議驅動程式的控制代碼

MPT_ADAPTER *ioc

指向 MPT 介面卡結構的指標

int reqBytes

請求的大小(以位元組為單位)

u32 *req

指向 MPT 請求幀的指標

int sleepFlag

如果 CAN_SLEEP 則使用 schedule,否則使用 udelay。

此例程專門用於傳送 MptScsiTaskMgmt 請求,因為它們需要透過門鈴握手傳送。

注意

呼叫者有責任交換請求中大小大於 1 位元組的欄位的位元組。

請求中大小大於 1 位元組的欄位的位元組。

成功返回 0,失敗返回非零。

int mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)

給定 IOC 識別符號,設定指向其介面卡結構的指標。

引數

int iocid

IOC 唯一識別符號(整數)

MPT_ADAPTER **iocpp

指向 IOC 介面卡的指標的指標

給定唯一的 IOC 識別符號,設定指向關聯的 MPT 介面卡結構的指標。

如果找到 iocid,則返回 iocid 並設定 iocpp。如果未找到 iocid,則返回 -1。

int mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)

安裝 PCI 智慧 MPT 介面卡。

引數

struct pci_dev *pdev

指向 pci_dev 結構的指標

const struct pci_device_id *id

PCI 裝置 ID 資訊

此例程執行將 MPT 介面卡的 IOC 變為 OPERATIONAL 狀態所需的所有步驟。這包括註冊記憶體區域、註冊中斷以及分配請求和回覆記憶體池。

此例程還預取光纖通道 MPT 介面卡的 LAN MAC 地址。

成功返回 0,失敗返回非零。

TODO:新增對輪詢控制器的支援

void mpt_detach(struct pci_dev *pdev)

刪除 PCI 智慧 MPT 介面卡。

引數

struct pci_dev *pdev

指向 pci_dev 結構的指標

int mpt_suspend(struct pci_dev *pdev, pm_message_t state)

Fusion MPT 基本驅動程式掛起例程。

引數

struct pci_dev *pdev

指向 pci_dev 結構的指標

pm_message_t state

要進入的新狀態

int mpt_resume(struct pci_dev *pdev)

Fusion MPT 基本驅動程式恢復例程。

引數

struct pci_dev *pdev

指向 pci_dev 結構的指標

u32 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked)

獲取 MPT 介面卡的當前狀態。

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

int cooked

請求原始或處理過的 IOC 狀態

如果 cooked==0,則返回所有 IOC 門鈴暫存器位;否則,僅返回 MPI_IOC_STATE_MASK 中的門鈴位。

int mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size)

分配韌體記憶體

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

int size

總 FW 位元組數

如果已分配記憶體,則返回相同(快取)的值。

成功返回 0,失敗返回非零值

void mpt_free_fw_memory(MPT_ADAPTER *ioc)

釋放韌體記憶體

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

如果 alt_img 為 NULL,則從 ioc 結構中刪除。否則,刪除相同格式的輔助映像。

int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode)

對 SAS 持久表執行操作

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

u8 persist_opcode

見下文

MPI_SAS_OP_CLEAR_NOT_PRESENT

釋放當前不存在的裝置的所有持久 TargetID 對映。

MPI_SAS_OP_CLEAR_ALL_PERSISTENT

清除所有持久 TargetID 對映

注意

請勿在中斷期間使用此函式。

成功返回 0,非零值表示錯誤

int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, RaidPhysDiskPage0_t *phys_disk)

返回物理磁碟 page zero

引數

MPT_ADAPTER *ioc

指向介面卡結構的指標

u8 phys_disk_num

io 單元唯一的 phys disk num 由 ioc 生成

RaidPhysDiskPage0_t *phys_disk

返回請求的有效負載資料

返回

成功時返回 0;如果讀取配置頁面頭失敗或資料指標不為 NULL,則返回 -EFAULT;如果 pci_alloc 失敗,則返回 -ENOMEM

int mpt_raid_phys_disk_get_num_paths(MPT_ADAPTER *ioc, u8 phys_disk_num)

返回與此 phys_num 關聯的路徑數

引數

MPT_ADAPTER *ioc

指向介面卡結構的指標

u8 phys_disk_num

io 單元唯一的 phys disk num 由 ioc 生成

返回

返回路徑數

int mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num, RaidPhysDiskPage1_t *phys_disk)

返回物理磁碟 page 1

引數

MPT_ADAPTER *ioc

指向介面卡結構的指標

u8 phys_disk_num

io 單元唯一的 phys disk num 由 ioc 生成

RaidPhysDiskPage1_t *phys_disk

返回請求的有效負載資料

返回

成功時返回 0;如果讀取配置頁面頭失敗或資料指標不為 NULL,則返回 -EFAULT;如果 pci_alloc 失敗,則返回 -ENOMEM

int mpt_findImVolumes(MPT_ADAPTER *ioc)

識別隱藏磁碟和 RAID 卷的 ID

引數

MPT_ADAPTER *ioc

指向介面卡結構的指標

返回

成功時返回 0;如果讀取配置頁面頭失敗或資料指標不為 NULL,則返回 -EFAULT;如果 pci_alloc 失敗,則返回 -ENOMEM

int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)

用於發出配置訊息的通用函式

引數

MPT_ADAPTER *ioc

指向介面卡結構的指標

CONFIGPARMS *pCfg

指向配置結構的指標。結構包含操作、頁面地址、方向、物理地址以及指向配置頁面頭的指標。頁面頭已更新。

成功返回 0;如果沒有可用的訊息幀,則返回 -EAGAIN;如果回覆不成功或沒有回覆(超時),則返回 -EFAULT

void mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buffer, int *size, int len, int showlan)

將 IOC 的 ASCII 摘要寫入緩衝區。

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

char *buffer

指向應寫入 IOC 摘要資訊的緩衝區的指標

int *size

指向我們寫入的位元組數的指標(由該例程設定)

int len

在緩衝區中開始寫入的偏移量

int showlan

顯示 LAN 內容?

此例程將(英語可讀的)ASCII 文字(表示 IOC 資訊的摘要)寫入緩衝區。

int mpt_set_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc)

設定與任務管理相關的標誌

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

成功返回 0,失敗返回 -1。

如果返回 -1,則表示無法設定標誌

void mpt_clear_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc)

清除與任務管理相關的標誌

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

void __noreturn mpt_halt_firmware(MPT_ADAPTER *ioc)

如果韌體正在執行,則停止韌體並使核心崩潰

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

int mpt_Soft_Hard_ResetHandler(MPT_ADAPTER *ioc, int sleepFlag)

嘗試成本較低的重置

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

int sleepFlag

指示是否必須呼叫 sleep 或 schedule。

成功返回 0,失敗返回 -1。首先嚐試軟重置,僅當失敗時才進行成本高昂的硬重置。

int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)

通用重置處理程式

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

int sleepFlag

指示是否必須呼叫 sleep 或 schedule。

根據輸入 arg 值發出 SCSI 任務管理呼叫。如果 TaskMgmt 失敗,則返回關聯的 SCSI 請求。

備註:_HardResetHandler 可以從中斷執行緒(定時器)或非中斷執行緒呼叫。在前一種情況下,不得呼叫 schedule()。

注意

返回 -1 是致命錯誤情況,因為它表示

FW 重新載入/初始化失敗。

成功返回 0,失敗返回 -1。

const char *mptscsih_info(struct Scsi_Host *SChost)

返回有關 MPT 介面卡的資訊

引數

struct Scsi_Host *SChost

指向 Scsi_Host 結構的指標

(linux scsi_host_template.info 例程)

返回指向寫入資訊的緩衝區的指標。

int mptscsih_qcmd(struct scsi_cmnd *SCpnt)

主 Fusion MPT SCSI 發起程式 IO 啟動例程。

引數

struct scsi_cmnd *SCpnt

指向 scsi_cmnd 結構的指標

(linux scsi_host_template.queuecommand 例程)這是主要的 SCSI IO 啟動例程。從 linux scsi_cmnd 請求建立一個 MPI SCSIIORequest 並將其傳送到 IOC。

返回 0。(rtn 值被 linux scsi 中間層丟棄)

int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, u64 lun, int ctx2abort, ulong timeout)

通用傳送任務管理函式。

引數

MPT_SCSI_HOST *hd

指向 MPT_SCSI_HOST 結構的指標

u8 type

任務管理型別

u8 channel

任務管理的通道號

u8 id

重置的邏輯 Target ID(如果適用)

u64 lun

重置的邏輯單元(如果適用)

int ctx2abort

要中止的任務的上下文(如果適用)

ulong timeout

任務管理控制的超時時間

備註:_HardResetHandler 可以從中斷執行緒(定時器)或非中斷執行緒呼叫。在前一種情況下,不得呼叫 schedule()。

並非所有欄位都對所有任務型別有意義。

成功返回 0,失敗返回非零值。

int mptscsih_abort(struct scsi_cmnd *SCpnt)

中止 linux scsi_cmnd 例程,new_eh 變體

引數

struct scsi_cmnd * SCpnt

指向 scsi_cmnd 結構的指標,要中止的 IO

(linux scsi_host_template.eh_abort_handler 例程)

成功返回 0,失敗返回非零值。

int mptscsih_dev_reset(struct scsi_cmnd *SCpnt)

執行 SCSI LOGICAL_UNIT_RESET!

引數

struct scsi_cmnd * SCpnt

指向 scsi_cmnd 結構的指標,IO 導致重置

(linux scsi_host_template.eh_dev_reset_handler 例程)

成功返回 0,失敗返回非零值。

int mptscsih_bus_reset(struct scsi_cmnd *SCpnt)

執行 SCSI BUS_RESET!new_eh 變體

引數

struct scsi_cmnd * SCpnt

指向 scsi_cmnd 結構的指標,IO 導致重置

(linux scsi_host_template.eh_bus_reset_handler 例程)

成功返回 0,失敗返回非零值。

int mptscsih_host_reset(struct scsi_cmnd *SCpnt)

執行 SCSI 主機介面卡 RESET(new_eh 變體)

引數

struct scsi_cmnd *SCpnt

指向 scsi_cmnd 結構的指標,IO 導致重置

(linux scsi_host_template.eh_host_reset_handler 例程)

成功返回 0,失敗返回非零值。

int mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)

在 Fusion MPT 基礎驅動程式中註冊

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

MPT_FRAME_HDR *mf

指向 SCSI 任務管理請求幀的指標

MPT_FRAME_HDR *mr

指向 SCSI 任務管理回覆幀的指標

此例程在任何 SCSI 任務管理請求完成時從 mptbase.c::mpt_interrupt() 呼叫。此例程在驅動程式載入/初始化時透過 mpt_register() API 呼叫在 MPT(基礎)驅動程式中註冊。

返回 1,指示應釋放 alloc'd 請求幀 ptr。

struct scsi_cmnd *mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i)

檢索 scmd 條目

引數

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 結構的指標

int i

陣列中的索引

描述

返回 scsi_cmd 指標