基于消息的设备¶
融合消息设备¶
-
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 指针