Message-based devices¶
Fusion message devices¶
-
u8 mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass, char *func_name)¶
Register protocol-specific main callback handler.
Parameters
MPT_CALLBACK cbfunc
callback function pointer
MPT_DRIVER_CLASS dclass
Protocol driver's class (
MPT_DRIVER_CLASS
enum value)char *func_name
call function's name
This routine is called by a protocol-specific driver (SCSI host, LAN, SCSI target) to register its reply callback routine. Each protocol-specific driver must do this before it will be able to use any IOC resources, such as obtaining request frames.
NOTES
- The SCSI protocol driver currently calls this routine thrice
in order to register separate callbacks; one for "normal" SCSI IO; one for MptScsiTaskMgmt requests; one for Scan/DV requests.
Returns u8 valued "handle" in the range (and S.O.D. order) {N,...,7,6,5,...,1} if successful. A return value of MPT_MAX_PROTOCOL_DRIVERS (including zero!) should be considered an error by the caller.
-
void mpt_deregister(u8 cb_idx)¶
Deregister a protocol drivers resources.
Parameters
u8 cb_idx
previously registered callback handle
Each protocol-specific driver should call this routine when its module is unloaded.
-
int mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc)¶
Register protocol-specific event callback handler.
Parameters
u8 cb_idx
previously registered (via mpt_register) callback handle
MPT_EVHANDLER ev_cbfunc
callback function
This routine can be called by one or more protocol-specific drivers if/when they choose to be notified of MPT events.
Returns 0 for success.
-
void mpt_event_deregister(u8 cb_idx)¶
Deregister protocol-specific event callback handler
Parameters
u8 cb_idx
previously registered callback handle
Each protocol-specific driver should call this routine when it does not (or can no longer) handle events, or when its module is unloaded.
-
int mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func)¶
Register protocol-specific IOC reset handler.
Parameters
u8 cb_idx
previously registered (via mpt_register) callback handle
MPT_RESETHANDLER reset_func
reset function
This routine can be called by one or more protocol-specific drivers if/when they choose to be notified of IOC resets.
Returns 0 for success.
-
void mpt_reset_deregister(u8 cb_idx)¶
Deregister protocol-specific IOC reset handler.
Parameters
u8 cb_idx
previously registered callback handle
Each protocol-specific driver should call this routine when it does not (or can no longer) handle IOC reset handling, or when its module is unloaded.
-
int mpt_device_driver_register(struct mpt_pci_driver *dd_cbfunc, u8 cb_idx)¶
Register device driver hooks
Parameters
struct mpt_pci_driver * dd_cbfunc
driver callbacks struct
u8 cb_idx
MPT protocol driver index
-
void mpt_device_driver_deregister(u8 cb_idx)¶
DeRegister device driver hooks
Parameters
u8 cb_idx
MPT protocol driver index
-
MPT_FRAME_HDR *mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc)¶
Obtain an MPT request frame from the pool
Parameters
u8 cb_idx
Handle of registered MPT protocol driver
MPT_ADAPTER *ioc
Pointer to MPT adapter structure
Obtain an MPT request frame from the pool (of 1024) that are allocated per MPT adapter.
Returns pointer to a MPT request frame or
NULL
if none are available or IOC is not active.
-
void mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)¶
Send a protocol-specific MPT request frame to an IOC
Parameters
u8 cb_idx
Handle of registered MPT protocol driver
MPT_ADAPTER *ioc
Pointer to MPT adapter structure
MPT_FRAME_HDR *mf
Pointer to MPT request frame
This routine posts an MPT request frame to the request post FIFO of a specific MPT adapter.
-
void mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)¶
Send a hi-pri protocol-specific MPT request frame
Parameters
u8 cb_idx
Handle of registered MPT protocol driver
MPT_ADAPTER *ioc
Pointer to MPT adapter structure
MPT_FRAME_HDR *mf
Pointer to MPT request frame
Send a protocol-specific MPT request frame to an IOC using hi-priority request queue.
This routine posts an MPT request frame to the request post FIFO of a specific MPT adapter.
-
void mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)¶
Place MPT request frame back on FreeQ.
Parameters
MPT_ADAPTER *ioc
Pointer to MPT adapter structure
MPT_FRAME_HDR *mf
Pointer to MPT request frame
This routine places a MPT request frame back on the MPT adapter's FreeQ.
-
int mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)¶
Send MPT request via doorbell handshake method.
Parameters
u8 cb_idx
Handle of registered MPT protocol driver
MPT_ADAPTER *ioc
Pointer to MPT adapter structure
int reqBytes
Size of the request in bytes
u32 *req
Pointer to MPT request frame
int sleepFlag
Use schedule if CAN_SLEEP else use udelay.
This routine is used exclusively to send MptScsiTaskMgmt requests since they are required to be sent via doorbell handshake.
NOTE
- It is the callers responsibility to byte-swap fields in the
request which are greater than 1 byte in size.
Returns 0 for success, non-zero for failure.
-
int mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp)¶
Given IOC identifier, set pointer to its adapter structure.
Parameters
int iocid
IOC unique identifier (integer)
MPT_ADAPTER **iocpp
Pointer to pointer to IOC adapter
Given a unique IOC identifier, set pointer to the associated MPT adapter structure.
Returns iocid and sets iocpp if iocid is found. Returns -1 if iocid is not found.
-
int mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)¶
Install a PCI intelligent MPT adapter.
Parameters
struct pci_dev *pdev
Pointer to pci_dev structure
const struct pci_device_id *id
PCI device ID information
This routine performs all the steps necessary to bring the IOC of a MPT adapter to a OPERATIONAL state. This includes registering memory regions, registering the interrupt, and allocating request and reply memory pools.
This routine also pre-fetches the LAN MAC address of a Fibre Channel MPT adapter.
Returns 0 for success, non-zero for failure.
TODO: Add support for polled controllers
-
void mpt_detach(struct pci_dev *pdev)¶
Remove a PCI intelligent MPT adapter.
Parameters
struct pci_dev *pdev
Pointer to pci_dev structure
-
int mpt_suspend(struct pci_dev *pdev, pm_message_t state)¶
Fusion MPT base driver suspend routine.
Parameters
struct pci_dev *pdev
Pointer to pci_dev structure
pm_message_t state
new state to enter
-
int mpt_resume(struct pci_dev *pdev)¶
Fusion MPT base driver resume routine.
Parameters
struct pci_dev *pdev
Pointer to pci_dev structure
-
u32 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked)¶
Get the current state of a MPT adapter.
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
int cooked
Request raw or cooked IOC state
Returns all IOC Doorbell register bits if cooked==0, else just the Doorbell bits in MPI_IOC_STATE_MASK.
-
int mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size)¶
allocate firmware memory
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
int size
total FW bytes
If memory has already been allocated, the same (cached) value is returned.
Return 0 if successful, or non-zero for failure
-
void mpt_free_fw_memory(MPT_ADAPTER *ioc)¶
free firmware memory
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
If alt_img is NULL, delete from ioc structure. Else, delete a secondary image in same format.
-
int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode)¶
Perform operation on SAS Persistent Table
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
u8 persist_opcode
see below
MPI_SAS_OP_CLEAR_NOT_PRESENT
Free all persist TargetID mappings for devices not currently present.
MPI_SAS_OP_CLEAR_ALL_PERSISTENT
Clear al persist TargetID mappings
NOTE
Don't use not this function during interrupt time.
Returns 0 for success, non-zero error
-
int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, RaidPhysDiskPage0_t *phys_disk)¶
returns phys disk page zero
Parameters
MPT_ADAPTER *ioc
Pointer to a Adapter Structure
u8 phys_disk_num
io unit unique phys disk num generated by the ioc
RaidPhysDiskPage0_t *phys_disk
requested payload data returned
Return
0 on success -EFAULT if read of config page header fails or data pointer not NULL -ENOMEM if pci_alloc failed
-
int mpt_raid_phys_disk_get_num_paths(MPT_ADAPTER *ioc, u8 phys_disk_num)¶
returns number paths associated to this phys_num
Parameters
MPT_ADAPTER *ioc
Pointer to a Adapter Structure
u8 phys_disk_num
io unit unique phys disk num generated by the ioc
Return
returns number paths
-
int mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num, RaidPhysDiskPage1_t *phys_disk)¶
returns phys disk page 1
Parameters
MPT_ADAPTER *ioc
Pointer to a Adapter Structure
u8 phys_disk_num
io unit unique phys disk num generated by the ioc
RaidPhysDiskPage1_t *phys_disk
requested payload data returned
Return
0 on success -EFAULT if read of config page header fails or data pointer not NULL -ENOMEM if pci_alloc failed
-
int mpt_findImVolumes(MPT_ADAPTER *ioc)¶
Identify IDs of hidden disks and RAID Volumes
Parameters
MPT_ADAPTER *ioc
Pointer to a Adapter Strucutre
Return
0 on success -EFAULT if read of config page header fails or data pointer not NULL -ENOMEM if pci_alloc failed
-
int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)¶
Generic function to issue config message
Parameters
MPT_ADAPTER *ioc
Pointer to an adapter structure
CONFIGPARMS *pCfg
Pointer to a configuration structure. Struct contains action, page address, direction, physical address and pointer to a configuration page header Page header is updated.
Returns 0 for success -EAGAIN if no msg frames currently available -EFAULT for non-successful reply or no reply (timeout)
-
void mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buffer, int *size, int len, int showlan)¶
Write ASCII summary of IOC to a buffer.
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
char *buffer
Pointer to buffer where IOC summary info should be written
int *size
Pointer to number of bytes we wrote (set by this routine)
int len
Offset at which to start writing in buffer
int showlan
Display LAN stuff?
This routine writes (english readable) ASCII text, which represents a summary of IOC information, to a buffer.
-
int mpt_set_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc)¶
set flags associated with task management
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
Returns 0 for SUCCESS or -1 if FAILED.
If -1 is return, then it was not possible to set the flags
-
void mpt_clear_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc)¶
clear flags associated with task management
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
-
void __noreturn mpt_halt_firmware(MPT_ADAPTER *ioc)¶
Halts the firmware if it is operational and panic the kernel
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
-
int mpt_Soft_Hard_ResetHandler(MPT_ADAPTER *ioc, int sleepFlag)¶
Try less expensive reset
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
int sleepFlag
Indicates if sleep or schedule must be called.
Returns 0 for SUCCESS or -1 if FAILED. Try for softreset first, only if it fails go for expensive HardReset.
-
int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)¶
Generic reset handler
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
int sleepFlag
Indicates if sleep or schedule must be called.
Issues SCSI Task Management call based on input arg values. If TaskMgmt fails, returns associated SCSI request.
Remark: _HardResetHandler can be invoked from an interrupt thread (timer) or a non-interrupt thread. In the former, must not call schedule().
Note
- A return of -1 is a FATAL error case, as it means a
FW reload/initialization failed.
Returns 0 for SUCCESS or -1 if FAILED.
-
const char *mptscsih_info(struct Scsi_Host *SChost)¶
Return information about MPT adapter
Parameters
struct Scsi_Host *SChost
Pointer to Scsi_Host structure
(linux scsi_host_template.info routine)
Returns pointer to buffer where information was written.
-
int mptscsih_qcmd(struct scsi_cmnd *SCpnt)¶
Primary Fusion MPT SCSI initiator IO start routine.
Parameters
struct scsi_cmnd *SCpnt
Pointer to scsi_cmnd structure
(linux scsi_host_template.queuecommand routine) This is the primary SCSI IO start routine. Create a MPI SCSIIORequest from a linux scsi_cmnd request and send it to the IOC.
Returns 0. (rtn value discarded by linux scsi mid-layer)
-
int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, u64 lun, int ctx2abort, ulong timeout)¶
Generic send Task Management function.
Parameters
MPT_SCSI_HOST *hd
Pointer to MPT_SCSI_HOST structure
u8 type
Task Management type
u8 channel
channel number for task management
u8 id
Logical Target ID for reset (if appropriate)
u64 lun
Logical Unit for reset (if appropriate)
int ctx2abort
Context for the task to be aborted (if appropriate)
ulong timeout
timeout for task management control
Remark: _HardResetHandler can be invoked from an interrupt thread (timer) or a non-interrupt thread. In the former, must not call schedule().
Not all fields are meaningfull for all task types.
Returns 0 for SUCCESS, or FAILED.
-
int mptscsih_abort(struct scsi_cmnd *SCpnt)¶
Abort linux scsi_cmnd routine, new_eh variant
Parameters
struct scsi_cmnd * SCpnt
Pointer to scsi_cmnd structure, IO to be aborted
(linux scsi_host_template.eh_abort_handler routine)
Returns SUCCESS or FAILED.
-
int mptscsih_dev_reset(struct scsi_cmnd *SCpnt)¶
Perform a SCSI LOGICAL_UNIT_RESET!
Parameters
struct scsi_cmnd * SCpnt
Pointer to scsi_cmnd structure, IO which reset is due to
(linux scsi_host_template.eh_dev_reset_handler routine)
Returns SUCCESS or FAILED.
-
int mptscsih_target_reset(struct scsi_cmnd *SCpnt)¶
Perform a SCSI TARGET_RESET!
Parameters
struct scsi_cmnd * SCpnt
Pointer to scsi_cmnd structure, IO which reset is due to
(linux scsi_host_template.eh_target_reset_handler routine)
Returns SUCCESS or FAILED.
-
int mptscsih_bus_reset(struct scsi_cmnd *SCpnt)¶
Perform a SCSI BUS_RESET! new_eh variant
Parameters
struct scsi_cmnd * SCpnt
Pointer to scsi_cmnd structure, IO which reset is due to
(linux scsi_host_template.eh_bus_reset_handler routine)
Returns SUCCESS or FAILED.
-
int mptscsih_host_reset(struct scsi_cmnd *SCpnt)¶
Perform a SCSI host adapter RESET (new_eh variant)
Parameters
struct scsi_cmnd *SCpnt
Pointer to scsi_cmnd structure, IO which reset is due to
(linux scsi_host_template.eh_host_reset_handler routine)
Returns SUCCESS or FAILED.
-
int mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)¶
Registered with Fusion MPT base driver
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
MPT_FRAME_HDR *mf
Pointer to SCSI task mgmt request frame
MPT_FRAME_HDR *mr
Pointer to SCSI task mgmt reply frame
This routine is called from mptbase.c::mpt_interrupt() at the completion of any SCSI task management request. This routine is registered with the MPT (base) driver at driver load/init time via the
mpt_register()
API call.Returns 1 indicating alloc'd request frame ptr should be freed.
-
struct scsi_cmnd *mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i)¶
retrieves scmd entry
Parameters
MPT_ADAPTER *ioc
Pointer to MPT_ADAPTER structure
int i
index into the array
Description
Returns the scsi_cmd pointer