基于消息的设备

融合消息设备

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 请求;一个用于扫描/DV 请求。

如果成功,则返回 u8 值“handle”,范围为(和 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 请求帧。

返回指向 MPT 请求帧的指针,如果无可用帧或 IOC 未激活,则返回 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 请求帧的指针

使用高优先级请求队列向 IOC 发送协议特定的 MPT 请求帧。

此例程将 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

总共的固件字节数

如果已分配内存,则返回相同(缓存)的值。

成功返回 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)

返回物理磁盘第零页

参数

MPT_ADAPTER *ioc

指向适配器结构的指针

u8 phys_disk_num

ioc 生成的 I/O 单元唯一的物理磁盘编号

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

ioc 生成的 I/O 单元唯一的物理磁盘编号

返回

返回路径数量

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

返回物理磁盘第 1 页

参数

MPT_ADAPTER *ioc

指向适配器结构的指针

u8 phys_disk_num

ioc 生成的 I/O 单元唯一的物理磁盘编号

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

指向配置结构的指针。Struct 包含操作、页面地址、方向、物理地址和指向配置页眉的指针。页面页眉已更新。

成功返回 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 内容?

此例程将代表 IOC 信息摘要的(英文可读的)ASCII 文本写入缓冲区。

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。

基于输入参数值发出 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

重置的逻辑目标 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 例程)

返回成功或失败。

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 例程)

返回成功或失败。

int mptscsih_target_reset(struct scsi_cmnd *SCpnt)

执行 SCSI TARGET_RESET!

参数

struct scsi_cmnd * SCpnt

指向 scsi_cmnd 结构的指针,重置归因于的 IO

(linux scsi_host_template.eh_target_reset_handler 例程)

返回成功或失败。

int mptscsih_bus_reset(struct scsi_cmnd *SCpnt)

执行 SCSI 总线复位!新的 eh 变体

参数

struct scsi_cmnd * SCpnt

指向 scsi_cmnd 结构的指针,重置归因于的 IO

(Linux scsi_host_template.eh_bus_reset_handler 例程)

返回成功或失败。

int mptscsih_host_reset(struct scsi_cmnd *SCpnt)

执行 SCSI 主机适配器复位(新的 eh 变体)

参数

struct scsi_cmnd *SCpnt

指向 scsi_cmnd 结构的指针,重置归因于的 IO

(Linux scsi_host_template.eh_host_reset_handler 例程)

返回成功或失败。

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,表示应释放已分配的请求帧指针。

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

检索 scmd 条目

参数

MPT_ADAPTER *ioc

指向 MPT_ADAPTER 结构的指针

int i

数组的索引

描述

返回 scsi_cmd 指针