基于消息的设备

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 指针