📄 mptbase.h
字号:
//#if defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)#if defined(MPT_DEBUG_MSG_FRAME)#define dmfprintk(x) printk x#else#define dmfprintk(x)#endif#ifdef MPT_DEBUG_IRQ#define dirqprintk(x) printk x#else#define dirqprintk(x)#endif#ifdef MPT_DEBUG_SG#define dsgprintk(x) printk x#else#define dsgprintk(x)#endif#if defined(MPT_DEBUG_DL) || defined(MPT_DEBUG)#define ddlprintk(x) printk x#else#define ddlprintk(x)#endif#ifdef MPT_DEBUG_DV#define ddvprintk(x) printk x#else#define ddvprintk(x)#endif#if defined(MPT_DEBUG_DV) || defined(MPT_DEBUG_DV_TINY)#define ddvtprintk(x) printk x#else#define ddvtprintk(x)#endif#ifdef MPT_DEBUG_IOCTL#define dctlprintk(x) printk x#else#define dctlprintk(x)#endif#ifdef MPT_DEBUG_RESET#define dtmprintk(x) printk x#else#define dtmprintk(x)#endif#ifdef MPT_DEBUG_NEH#define nehprintk(x) printk x#else#define nehprintk(x)#endif#if defined(MPT_DEBUG_CONFIG) || defined(MPT_DEBUG)#define dcprintk(x) printk x#else#define dcprintk(x)#endif#if defined(MPT_DEBUG_SCSI) || defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)#define dsprintk(x) printk x#else#define dsprintk(x)#endif#define MPT_INDEX_2_MFPTR(ioc,idx) \ (MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) )#define MFPTR_2_MPT_INDEX(ioc,mf) \ (int)( ((u8*)mf - (u8*)(ioc)->req_frames) / (ioc)->req_sz )#define MPT_INDEX_2_RFPTR(ioc,idx) \ (MPT_FRAME_HDR*)( (u8*)(ioc)->reply_frames + (ioc)->req_sz * (idx) )#define Q_INIT(q,type) (q)->head = (q)->tail = (type*)(q)#define Q_IS_EMPTY(q) ((Q_ITEM*)(q)->head == (Q_ITEM*)(q))#define Q_ADD_TAIL(qt,i,type) { \ Q_TRACKER *_qt = (Q_TRACKER*)(qt); \ Q_ITEM *oldTail = _qt->tail; \ (i)->forw = (type*)_qt; \ (i)->back = (type*)oldTail; \ oldTail->forw = (Q_ITEM*)(i); \ _qt->tail = (Q_ITEM*)(i); \}#define Q_ADD_HEAD(qt,i,type) { \ Q_TRACKER *_qt = (Q_TRACKER*)(qt); \ Q_ITEM *oldHead = _qt->head; \ (i)->forw = (type*)oldHead; \ (i)->back = (type*)_qt; \ oldHead->back = (Q_ITEM*)(i); \ _qt->head = (Q_ITEM*)(i); \}#define Q_DEL_ITEM(i) { \ Q_ITEM *_forw = (Q_ITEM*)(i)->forw; \ Q_ITEM *_back = (Q_ITEM*)(i)->back; \ _back->forw = _forw; \ _forw->back = _back; \}#define SWAB4(value) \ (u32)( (((value) & 0x000000ff) << 24) \ | (((value) & 0x0000ff00) << 8) \ | (((value) & 0x00ff0000) >> 8) \ | (((value) & 0xff000000) >> 24) )#if defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)#define DBG_DUMP_REPLY_FRAME(mfp) \ { u32 *m = (u32 *)(mfp); \ int i, n = (le32_to_cpu(m[0]) & 0x00FF0000) >> 16; \ printk(KERN_INFO " "); \ for (i=0; i<n; i++) \ printk(" %08x", le32_to_cpu(m[i])); \ printk("\n"); \ }#define DBG_DUMP_REQUEST_FRAME_HDR(mfp) \ { int i, n = 3; \ u32 *m = (u32 *)(mfp); \ printk(KERN_INFO " "); \ for (i=0; i<n; i++) \ printk(" %08x", le32_to_cpu(m[i])); \ printk("\n"); \ }#else#define DBG_DUMP_REPLY_FRAME(mfp)#define DBG_DUMP_REQUEST_FRAME_HDR(mfp)#endif/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*//* * MPT_SCSI_HOST defines - Used by the IOCTL and the SCSI drivers * Private to the driver. *//* LOCAL structure and fields used when processing * internally generated commands. These include: * bus scan, dv and config requests. */typedef struct _MPT_LOCAL_REPLY { ConfigPageHeader_t header; int completion; u8 sense[SCSI_STD_SENSE_BYTES]; u8 scsiStatus; u8 skip; u32 pad;} MPT_LOCAL_REPLY;#define MPT_HOST_BUS_UNKNOWN (0xFF)#define MPT_HOST_TOO_MANY_TM (0x05)#define MPT_HOST_NVRAM_INVALID (0xFFFFFFFF)#define MPT_HOST_NO_CHAIN (0xFFFFFFFF)#define MPT_NVRAM_MASK_TIMEOUT (0x000000FF)#define MPT_NVRAM_SYNC_MASK (0x0000FF00)#define MPT_NVRAM_SYNC_SHIFT (8)#define MPT_NVRAM_DISCONNECT_ENABLE (0x00010000)#define MPT_NVRAM_ID_SCAN_ENABLE (0x00020000)#define MPT_NVRAM_LUN_SCAN_ENABLE (0x00040000)#define MPT_NVRAM_TAG_QUEUE_ENABLE (0x00080000)#define MPT_NVRAM_WIDE_DISABLE (0x00100000)#define MPT_NVRAM_BOOT_CHOICE (0x00200000)/* The TM_STATE variable is used to provide strict single threading of TM * requests as well as communicate TM error conditions. */#define TM_STATE_NONE (0)#define TM_STATE_IN_PROGRESS (1)#define TM_STATE_ERROR (2)typedef struct _MPT_SCSI_HOST { MPT_ADAPTER *ioc; int port; u32 pad0; struct scsi_cmnd **ScsiLookup; /* Pool of buffers for chaining. ReqToChain * and ChainToChain track index of chain buffers. * ChainBuffer (DMA) virt/phys addresses. * FreeChainQ (lock) locking mechanisms. */ int *ReqToChain; int *ChainToChain; u8 *ChainBuffer; dma_addr_t ChainBufferDMA; MPT_Q_TRACKER FreeChainQ; spinlock_t FreeChainQlock; u32 qtag_tick; VirtDevice **Targets; MPT_LOCAL_REPLY *pLocal; /* used for internal commands */ struct timer_list timer; struct timer_list TMtimer; /* Timer for TM commands ONLY */ /* Pool of memory for holding SCpnts before doing * OS callbacks. freeQ is the free pool. */ u8 *memQ; DONE_Q_TRACKER freeQ; DONE_Q_TRACKER doneQ; /* Holds Linux formmatted requests */ DONE_Q_TRACKER pendingQ; /* Holds MPI formmatted requests */ MPT_Q_TRACKER taskQ; /* TM request Q */ spinlock_t freedoneQlock; int taskQcnt; int num_chain; /* Number of chain buffers */ int max_sge; /* Max No of SGE*/ u8 numTMrequests; u8 tmPending; u8 resetPending; u8 is_spi; /* Parallel SCSI i/f */ u8 negoNvram; /* DV disabled, nego NVRAM */ u8 is_multipath; /* Multi-path compatible */ u8 tmState; u8 rsvd[1]; MPT_FRAME_HDR *tmPtr; /* Ptr to TM request*/ MPT_FRAME_HDR *cmdPtr; /* Ptr to nonOS request */ struct scsi_cmnd *abortSCpnt; MPT_LOCAL_REPLY localReply; /* internal cmd reply struct */ unsigned long hard_resets; /* driver forced bus resets count */ unsigned long soft_resets; /* fw/external bus resets count */ unsigned long timeouts; /* cmd timeouts */ ushort sel_timeout[MPT_MAX_FC_DEVICES];} MPT_SCSI_HOST;/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*//* * More Dynamic Multi-Pathing stuff... *//* Forward decl, a strange C thing, to prevent gcc compiler warnings */struct scsi_cmnd;/* * DMP service layer structure / API interface */typedef struct _DmpServices { VirtDevTracker VdevList; struct semaphore *Daemon; int (*ScsiPathSelect) (struct scsi_cmnd *, MPT_SCSI_HOST **hd, int *target, int *lun); int (*DmpIoDoneChk) (MPT_SCSI_HOST *, struct scsi_cmnd *, SCSIIORequest_t *, SCSIIOReply_t *); void (*mptscsih_scanVlist) (MPT_SCSI_HOST *, int portnum); int (*ScsiAbort) (struct scsi_cmnd *); int (*ScsiBusReset) (struct scsi_cmnd *);} DmpServices_t;/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*//* * Generic structure passed to the base mpt_config function. */typedef struct _x_config_parms { Q_ITEM linkage; /* linked list */ struct timer_list timer; /* timer function for this request */ ConfigPageHeader_t *hdr; dma_addr_t physAddr; int wait_done; /* wait for this request */ u32 pageAddr; /* properly formatted */ u8 action; u8 dir; u8 timeout; /* seconds */ u8 pad1; u16 status; u16 pad2;} CONFIGPARMS;/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*//* * Public entry points... */extern int mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass);extern void mpt_deregister(int cb_idx);extern int mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc);extern void mpt_event_deregister(int cb_idx);extern int mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func);extern void mpt_reset_deregister(int cb_idx);extern int mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx);extern void mpt_device_driver_deregister(int cb_idx);extern int mpt_register_ascqops_strings(void *ascqTable, int ascqtbl_sz, const char **opsTable);extern void mpt_deregister_ascqops_strings(void);extern MPT_FRAME_HDR *mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc);extern void mpt_free_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);extern void mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);extern void mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr);extern void mpt_add_chain(char *pAddr, u8 next, u16 length, dma_addr_t dma_addr);extern int mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag);extern int mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes, u32 *req, int replyBytes, u16 *u16reply, int maxwait, int sleepFlag);extern int mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp);extern u32 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked);extern void mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buf, int *size, int len, int showlan);extern int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag);extern int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *cfg);extern int mpt_toolbox(MPT_ADAPTER *ioc, CONFIGPARMS *cfg);extern void mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size);extern void mpt_free_fw_memory(MPT_ADAPTER *ioc);extern int mpt_findImVolumes(MPT_ADAPTER *ioc);extern int mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);/* * Public data decl's... */extern struct list_head ioc_list;extern struct proc_dir_entry *mpt_proc_root_dir;extern DmpServices_t *DmpService;extern int mpt_lan_index; /* needed by mptlan.c */extern int mpt_stm_index; /* needed by mptstm.c */extern void *mpt_v_ASCQ_TablePtr;extern const char **mpt_ScsiOpcodesPtr;extern int mpt_ASCQ_TableSz;/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/#endif /* } __KERNEL__ *//* * More (public) macros... */#ifndef offsetof#define offsetof(t, m) ((size_t) (&((t *)0)->m))#endif#if defined(__alpha__) || defined(__sparc_v9__) || defined(__ia64__) || defined(__x86_64__)#define CAST_U32_TO_PTR(x) ((void *)(u64)x)#define CAST_PTR_TO_U32(x) ((u32)(u64)x)#else#define CAST_U32_TO_PTR(x) ((void *)x)#define CAST_PTR_TO_U32(x) ((u32)x)#endif#define MPT_PROTOCOL_FLAGS_c_c_c_c(pflags) \ ((pflags) & MPI_PORTFACTS_PROTOCOL_INITIATOR) ? 'I' : 'i', \ ((pflags) & MPI_PORTFACTS_PROTOCOL_TARGET) ? 'T' : 't', \ ((pflags) & MPI_PORTFACTS_PROTOCOL_LAN) ? 'L' : 'l', \ ((pflags) & MPI_PORTFACTS_PROTOCOL_LOGBUSADDR) ? 'B' : 'b'/* * Shifted SGE Defines - Use in SGE with FlagsLength member. * Otherwise, use MPI_xxx defines (refer to "lsi/mpi.h" header). * Defaults: 32 bit SGE, SYSTEM_ADDRESS if direction bit is 0, read */#define MPT_TRANSFER_IOC_TO_HOST (0x00000000)#define MPT_TRANSFER_HOST_TO_IOC (0x04000000)#define MPT_SGE_FLAGS_LAST_ELEMENT (0x80000000)#define MPT_SGE_FLAGS_END_OF_BUFFER (0x40000000)#define MPT_SGE_FLAGS_LOCAL_ADDRESS (0x08000000)#define MPT_SGE_FLAGS_DIRECTION (0x04000000)#define MPT_SGE_FLAGS_ADDRESSING (mpt_addr_size() << MPI_SGE_FLAGS_SHIFT)#define MPT_SGE_FLAGS_END_OF_LIST (0x01000000)#define MPT_SGE_FLAGS_TRANSACTION_ELEMENT (0x00000000)#define MPT_SGE_FLAGS_SIMPLE_ELEMENT (0x10000000)#define MPT_SGE_FLAGS_CHAIN_ELEMENT (0x30000000)#define MPT_SGE_FLAGS_ELEMENT_MASK (0x30000000)#define MPT_SGE_FLAGS_SSIMPLE_READ \ (MPT_SGE_FLAGS_LAST_ELEMENT | \ MPT_SGE_FLAGS_END_OF_BUFFER | \ MPT_SGE_FLAGS_END_OF_LIST | \ MPT_SGE_FLAGS_SIMPLE_ELEMENT | \ MPT_SGE_FLAGS_ADDRESSING | \ MPT_TRANSFER_IOC_TO_HOST)#define MPT_SGE_FLAGS_SSIMPLE_WRITE \ (MPT_SGE_FLAGS_LAST_ELEMENT | \ MPT_SGE_FLAGS_END_OF_BUFFER | \ MPT_SGE_FLAGS_END_OF_LIST | \ MPT_SGE_FLAGS_SIMPLE_ELEMENT | \ MPT_SGE_FLAGS_ADDRESSING | \ MPT_TRANSFER_HOST_TO_IOC)/*}-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -