📄 mptbase.h
字号:
#define PATHINFO_FLAGS_AVAILABLE 0x04#define PATHINFO_FLAGS_SECONDARY 0x08#define PFLAGS_EXISTS_AND_AVAIL (PATHINFO_FLAGS_EXISTS|PATHINFO_FLAGS_AVAILABLE)#define PFLAGS_AVAIL_AND_OWNED (PATHINFO_FLAGS_AVAILABLE|PATHINFO_FLAGS_OWNED)typedef struct _ScsiCmndTracker { void *head; void *tail;} ScsiCmndTracker;/* * VirtDevice - FC LUN device or SCSI target device * (used to be FCSCSI_TARGET) */typedef struct _VirtDevice { struct _VirtDevice *forw; struct _VirtDevice *back; rwlock_t VdevLock; int ref_cnt; u8 tflags; u8 ioc_id; u8 target_id; u8 bus_id; u8 minSyncFactor; /* 0xFF is async */ u8 maxOffset; /* 0 if async */ u8 maxWidth; /* 0 if narrow, 1 if wide*/ u8 negoFlags; /* 0 if WDTR/SDTR allowed */ u8 raidVolume; /* set, if RAID Volume */ u8 rsvd; /* alignment */ u16 rsvd1raid; int npaths; u16 fc_phys_lun; u16 fc_xlat_lun; int stall_detected; PathInfo path[DMP_MAX_PATHS]; struct timer_list stall_timer; struct timer_list retry_timer; struct timer_list gone_timer; ScsiCmndTracker WaitQ; ScsiCmndTracker SentQ; ScsiCmndTracker DoneQ;//--- LUN split here? u8 sense[SCSI_STD_SENSE_BYTES]; /* 18 */ u8 rsvd2[2]; /* alignment */ u32 luns; /* Max LUNs is 32 */ u8 inq_data[SCSI_STD_INQUIRY_BYTES]; /* 36 */ u8 pad0[4]; u8 uniq_prepad[8]; u8 inq00_data[20]; u8 pad1[4]; /* IEEE Registered Extended Identifier obtained via INQUIRY VPD page 0x83 */ u8 uniq_data[20]; u8 pad2[4]; u8 inqC3_data[12]; u8 pad3[4]; u8 inqC9_data[12]; u8 pad4[4]; u8 dev_vol_name[64];} VirtDevice;/* * Fibre Channel (SCSI) target device and associated defines... */#define MPT_TARGET_DEFAULT_DV_STATUS 0#define MPT_TARGET_FLAGS_VALID_NEGO 0x01#define MPT_TARGET_FLAGS_VALID_INQUIRY 0x02#define MPT_TARGET_FLAGS_VALID_SENSE 0x04#define MPT_TARGET_FLAGS_Q_YES 0x08#define MPT_TARGET_NO_NEGO_WIDE 0x01#define MPT_TARGET_NO_NEGO_SYNC 0x02typedef struct _VirtDevTracker { struct _VirtDevice *head; struct _VirtDevice *tail; rwlock_t VlistLock; int pad;} VirtDevTracker;/* * /proc/mpt interface */typedef struct { const char *name; mode_t mode; int pad; read_proc_t *read_proc; write_proc_t *write_proc;} mpt_proc_entry_t;#define MPT_PROC_READ_RETURN(buf,start,offset,request,eof,len) \do { \ len -= offset; \ if (len < request) { \ *eof = 1; \ if (len <= 0) \ return 0; \ } else \ len = request; \ *start = buf + offset; \ return len; \} while (0)/* * IOCTL structure and associated defines */#define MPT_IOCTL_STATUS_DID_TIMEOUT 0x01 /* The current IOCTL timed out */#define MPT_IOCTL_STATUS_RF_VALID 0x02 /* The Reply Frame is VALID */#define MPT_IOCTL_STATUS_TIMER_ACTIVE 0x04 /* The timer is running */#define MPT_IOCTL_STATUS_SENSE_VALID 0x08 /* Sense data is valid */#define MPT_IOCTL_STATUS_COMMAND_GOOD 0x10 /* Command Status GOOD */typedef struct _MPT_IOCTL { struct _MPT_ADAPTER *ioc; struct timer_list timer; /* timer function for this adapter */ u8 ReplyFrame[MPT_DEFAULT_FRAME_SIZE]; /* reply frame data */ u8 sense[MPT_SENSE_BUFFER_ALLOC]; int wait_done; /* wake-up value for this ioc */ u8 cmd; /* current command */ u8 status; /* current command status */ u8 pad[2];} MPT_IOCTL;/* * Event Structure and define */#define MPTCTL_EVENT_LOG_SIZE (0x0000000A)typedef struct _mpt_ioctl_events { u32 event; /* Specified by define above */ u32 eventContext; /* Index or counter */ int data[2]; /* First 8 bytes of Event Data */} MPT_IOCTL_EVENTS;/* * CONFIGPARM status defines */#define MPT_CONFIG_GOOD MPI_IOCSTATUS_SUCCESS#define MPT_CONFIG_ERROR 0x002F/* * Substructure to store SCSI specific configuration page data */#define MPT_SCSICFG_NEGOTIATE 0x01 /* Negotiate on next IO */#define MPT_SCSICFG_NEED_DV 0x02 /* Schedule DV */#define MPT_SCSICFG_DV_PENDING 0x04 /* DV on this physical id pending */#define MPT_SCSICFG_DV_DONE 0x08 /* DV on this physical id complete */#define MPT_SCSICFG_USE_NVRAM 0x01 /* WriteSDP1 using NVRAM */#define MPT_SCSICFG_ALL_IDS 0x02 /* WriteSDP1 to all IDS */typedef struct _ScsiCfgData { int *nvram; /* table of device NVRAM values */ IOCPage3_t *pIocPg3; /* table of physical disks */ u8 dvStatus[MPT_MAX_SCSI_DEVICES]; int isRaid; /* bit field, 1 if RAID */ u8 minSyncFactor; /* 0xFF if async */ u8 maxSyncOffset; /* 0 if async */ u8 maxBusWidth; /* 0 if narrow, 1 if wide */ u8 busType; /* SE, LVD, HD */ u8 sdp1version; /* SDP1 version */ u8 sdp1length; /* SDP1 length */ u8 sdp0version; /* SDP0 version */ u8 sdp0length; /* SDP0 length */ u8 dvScheduled; /* 1 if scheduled */ u8 forceDv; /* 1 to force DV scheduling */ u8 rsvd[2];} ScsiCfgData;/* * Adapter Structure - pci_dev specific. Maximum: MPT_MAX_ADAPTERS */typedef struct _MPT_ADAPTER{ struct _MPT_ADAPTER *forw; struct _MPT_ADAPTER *back; int id; /* Unique adapter id N {0,1,2,...} */ int pci_irq; /* This irq */ char name[MPT_NAME_LENGTH]; /* "iocN" */ char *prod_name; /* "LSIFC9x9" */ volatile SYSIF_REGS *chip; /* == c8817000 (mmap) */ volatile SYSIF_REGS *pio_chip; /* Programmed IO (downloadboot) */ u32 mem_phys; /* == f4020000 (mmap) */ u32 pio_mem_phys; /* Programmed IO (downloadboot) */ int mem_size; /* mmap memory size */ int alloc_total; u32 last_state; int active; u8 *reply_alloc; /* Reply frames alloc ptr */ dma_addr_t reply_alloc_dma; MPT_FRAME_HDR *reply_frames; /* Reply msg frames - rounded up! */ dma_addr_t reply_frames_dma; u32 reply_frames_low_dma; int reply_depth; /* Num Allocated reply frames */ int reply_sz; /* Reply frame size */ CHIP_TYPE chip_type; /* We (host driver) get to manage our own RequestQueue! */ u8 *req_alloc; /* Request frames alloc ptr */ dma_addr_t req_alloc_dma; MPT_FRAME_HDR *req_frames; /* Request msg frames - rounded up! */ dma_addr_t req_frames_dma; u32 req_frames_low_dma; int req_depth; /* Number of request frames */ int req_sz; /* Request frame size (bytes) */ spinlock_t FreeQlock; MPT_Q_TRACKER FreeQ; /* Pool of SCSI sense buffers for commands coming from * the SCSI mid-layer. We have one 256 byte sense buffer * for each REQ entry. */ u8 *sense_buf_pool; dma_addr_t sense_buf_pool_dma; u32 sense_buf_low_dma; int mtrr_reg; void *pcidev; /* struct pci_dev pointer */ u8 *memmap; /* mmap address */ struct Scsi_Host *sh; /* Scsi Host pointer */ ScsiCfgData spi_data; /* Scsi config. data */ MPT_IOCTL *ioctl; /* ioctl data pointer */ struct proc_dir_entry *ioc_dentry; struct _MPT_ADAPTER *alt_ioc; /* ptr to 929 bound adapter port */ spinlock_t diagLock; /* diagnostic reset lock */ int diagPending; u32 biosVersion; /* BIOS version from IO Unit Page 2 */ int eventTypes; /* Event logging parameters */ int eventContext; /* Next event context */ int eventLogSize; /* Max number of cached events */ struct _mpt_ioctl_events *events; /* pointer to event log */ u8 *FWImage; /* Pointer to FW */ dma_addr_t FWImage_dma; Q_TRACKER configQ; /* linked list of config. requests */ int hs_reply_idx;#ifndef MFCNT u32 pad0;#else u32 mfcnt;#endif u32 hs_req[MPT_MAX_FRAME_SIZE/sizeof(u32)]; u16 hs_reply[MPT_MAX_FRAME_SIZE/sizeof(u16)]; IOCFactsReply_t facts; PortFactsReply_t pfacts[2]; FCPortPage0_t fc_port_page0[2]; LANPage0_t lan_cnfg_page0; LANPage1_t lan_cnfg_page1; u8 FirstWhoInit; u8 pad1[7];} MPT_ADAPTER;typedef struct _MPT_ADAPTER_TRACKER { MPT_ADAPTER *head; MPT_ADAPTER *tail;} MPT_ADAPTER_TRACKER;/* * New return value convention: * 1 = Ok to free associated request frame * 0 = not Ok ... */typedef int (*MPT_CALLBACK)(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply);typedef int (*MPT_EVHANDLER)(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply);typedef int (*MPT_RESETHANDLER)(MPT_ADAPTER *ioc, int reset_phase);/* reset_phase defs */#define MPT_IOC_PRE_RESET 0#define MPT_IOC_POST_RESET 1/* * Invent MPT host event (super-set of MPI Events) * Fitted to 1030's 64-byte [max] request frame size */typedef struct _MPT_HOST_EVENT { EventNotificationReply_t MpiEvent; /* 8 32-bit words! */ u32 pad[6]; void *next;} MPT_HOST_EVENT;#define MPT_HOSTEVENT_IOC_BRINGUP 0x91#define MPT_HOSTEVENT_IOC_RECOVER 0x92/* 32 vs 64 bit SGL code. * */#if defined(__ia64__)typedef SGESimple64_t MptSge_t;typedef SGEChain64_t MptChain_t;#define cpu_to_leXX(y, p) { \ u32 low = (u32) (y & 0xFFFFFFFF); \ u32 high = (u32) (y >> 32); \ p.Low = cpu_to_le32(low); \ p.High = cpu_to_le32(high); \}#define leXX_to_cpu(y, p) { \ y = (dma_addr_t) le32_to_cpu(p.High); \ y = (y << 32); \ y |= le32_to_cpu(p.Low); \}#define MPT_SGE_ADDRESS_SIZE MPI_SGE_FLAGS_64_BIT_ADDRESSING#define MPT_SCSIIO_MSG_FLAGS MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_64#elsetypedef SGESimple32_t MptSge_t;typedef SGEChain32_t MptChain_t;#define cpu_to_leXX(y,p) { \ p = cpu_to_le32(y); \}#define leXX_to_cpu(y,p) { \ y = le32_to_cpu(p); \}#define MPT_SGE_ADDRESS_SIZE MPI_SGE_FLAGS_32_BIT_ADDRESSING#define MPT_SCSIIO_MSG_FLAGS MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_32#endif/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*//* * Funky (private) macros... */#ifdef MPT_DEBUG#define dprintk(x) printk x#else#define dprintk(x)#endif#ifdef MPT_DEBUG_HANDSHAKE#define dhsprintk(x) printk x#else#define dhsprintk(x)#endif//#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -