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