📄 mptbase.h
字号:
/* * 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; /* bit field, 0 if WDTR/SDTR/QAS allowed */ u8 raidVolume; /* set, if RAID Volume */#ifdef ABORT_FIX u8 numAborts;#else u8 rsvd;#endif 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 inq00_data[20]; u8 pad1[4]; /* IEEE Registered Extended Identifier obtained via INQUIRY VPD page 0x83 */ /* NOTE: Do not separate uniq_prepad and uniq_data as they are treateed as a single entity in the code */ u8 uniq_prepad[8]; 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 0x02#define MPT_TARGET_NO_NEGO_QAS 0x04typedef 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_IOCRESET 0x01 /* IOC Reset occurred on the current*/#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 */#define MPT_IOCTL_STATUS_TMTIMER_ACTIVE 0x20 /* The TM timer is running */#define MPT_IOCTL_STATUS_TM_FAILED 0x40 /* User TM request failed */#define MPTCTL_RESET_OK 0x01 /* Issue Bus Reset */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 rsvd; u8 status; /* current command status */ u8 reset; /* 1 if bus reset allowed */ u8 target; /* target for reset */ void *tmPtr; struct timer_list TMtimer; /* timer function for this adapter */} 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 */ /* dvStatus defines: */#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_NOT_DONE 0x08 /* DV has not been performed */#define MPT_SCSICFG_BLK_NEGO 0x10 /* WriteSDP1 with WDTR and SDTR disabled */ /* Args passed to writeSDP1: */#define MPT_SCSICFG_USE_NVRAM 0x01 /* WriteSDP1 using NVRAM */#define MPT_SCSICFG_ALL_IDS 0x02 /* WriteSDP1 to all IDS *//* #define MPT_SCSICFG_BLK_NEGO 0x10 WriteSDP1 with WDTR and SDTR disabled */typedef struct _ScsiCfgData { int *nvram; /* table of device NVRAM values */ IOCPage3_t *pIocPg3; /* table of physical disks */ u8 dvStatus[MPT_MAX_SCSI_DEVICES]; u8 iocntr[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 noQas; /* Disable QAS for this adapter */ u8 rsvd[2];} ScsiCfgData;typedef struct _fw_image { char *fw; dma_addr_t fw_dma; u32 size; u32 rsvd;} fw_image_t;/* * 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 */ fw_image_t **cached_fw; /* Pointer to FW SG List */ Q_TRACKER configQ; /* linked list of config. requests */ int num_fw_frags; /* Number of SGE in FW SG List */ 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 upload_fw; /* If set, do a fw upload */ u8 pad1[6];} 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/* Define the generic types based on the size * of the dma_addr_t type. */typedef struct _mpt_sge { u32 FlagsLength; dma_addr_t Address;} MptSge_t;#define mpt_addr_size() \ ((sizeof(dma_addr_t) == sizeof(u64)) ? MPI_SGE_FLAGS_64_BIT_ADDRESSING : \ MPI_SGE_FLAGS_32_BIT_ADDRESSING)#define mpt_msg_flags() \ ((sizeof(dma_addr_t) == sizeof(u64)) ? MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_64 : \ MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_32)/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*//* * 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#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -