📄 megaraid.h
字号:
u32 lDrvSize[FC_MAX_LOGICAL_DRIVES]; /* Size of each log. Drv */ u8 lDrvProp[FC_MAX_LOGICAL_DRIVES]; u8 lDrvState[FC_MAX_LOGICAL_DRIVES]; /* State of Logical Drives */ u8 pDrvState[FC_MAX_PHYSICAL_DEVICES]; /* State of Phys. Drvs. */ u16 physDrvFormat[FC_MAX_PHYSICAL_DEVICES / 16]; u8 targXfer[80]; /* phys device transfer rate */ u8 pad1k[263]; /* 761 + 263reserved = 1024 bytes total size */} __attribute__ ((packed));typedef struct MegaRAID_Enquiry3 mega_Enquiry3;/* Structures */typedef struct _mega_ADP_INFO { u8 MaxConcCmds; u8 RbldRate; u8 MaxTargPerChan; u8 ChanPresent; u8 FwVer[4]; u16 AgeOfFlash; u8 ChipSetValue; u8 DramSize; u8 CacheFlushInterval; u8 BiosVer[4]; u8 resvd[7];} mega_ADP_INFO;typedef struct _mega_LDRV_INFO { u8 NumLDrv; u8 resvd[3]; u32 LDrvSize[MAX_LOGICAL_DRIVES]; u8 LDrvProp[MAX_LOGICAL_DRIVES]; u8 LDrvState[MAX_LOGICAL_DRIVES];} mega_LDRV_INFO;typedef struct _mega_PDRV_INFO { u8 PDrvState[MAX_PHYSICAL_DRIVES]; u8 resvd;} mega_PDRV_INFO;/* RAID inquiry: Mailbox command 0x5*/typedef struct _mega_RAIDINQ { mega_ADP_INFO AdpInfo; mega_LDRV_INFO LogdrvInfo; mega_PDRV_INFO PhysdrvInfo;} mega_RAIDINQ;/* Passthrough command: Mailbox command 0x3*/typedef struct mega_passthru { u8 timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */ u8 ars:1; u8 reserved:3; u8 islogical:1; u8 logdrv; /* if islogical == 1 */ u8 channel; /* if islogical == 0 */ u8 target; /* if islogical == 0 */ u8 queuetag; /* unused */ u8 queueaction; /* unused */ u8 cdb[MAX_CDB_LEN]; u8 cdblen; u8 reqsenselen; u8 reqsensearea[MAX_REQ_SENSE_LEN]; u8 numsgelements; u8 scsistatus; u32 dataxferaddr; u32 dataxferlen;} mega_passthru;/* * Extended passthru: support CDB > 10 bytes */typedef struct { u8 timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */ u8 ars:1; u8 rsvd1:1; u8 cd_rom:1; u8 rsvd2:1; u8 islogical:1; u8 logdrv; /* if islogical == 1 */ u8 channel; /* if islogical == 0 */ u8 target; /* if islogical == 0 */ u8 queuetag; /* unused */ u8 queueaction; /* unused */ u8 cdblen; u8 rsvd3; u8 cdb[16]; u8 numsgelements; u8 status; u8 reqsenselen; u8 reqsensearea[MAX_REQ_SENSE_LEN]; u8 rsvd4; u32 dataxferaddr; u32 dataxferlen;}mega_ext_passthru;struct _mega_mailbox { /* 0x0 */ u8 cmd; /* 0x1 */ u8 cmdid; /* 0x2 */ u16 numsectors; /* 0x4 */ u32 lba; /* 0x8 */ u32 xferaddr; /* 0xC */ u8 logdrv; /* 0xD */ u8 numsgelements; /* 0xE */ u8 resvd; /* 0xF */ u8 busy; /* 0x10 */ u8 numstatus; /* 0x11 */ u8 status; /* 0x12 */ u8 completed[46]; volatile u8 mraid_poll; volatile u8 mraid_ack; u8 pad[16]; /* for alignment purposes */} __attribute__ ((packed));typedef struct _mega_mailbox mega_mailbox;typedef struct { u32 xferSegment_lo; u32 xferSegment_hi; mega_mailbox mailbox;} mega_mailbox64;typedef struct _mega_ioctl_mbox { /* 0x0 */ u8 cmd; /* 0x1 */ u8 cmdid; /* 0x2 */ u8 channel; /* 0x3 */ u8 param; /* 0x4 */ u8 pad[4]; /* 0x8 */ u32 xferaddr; /* 0xC */ u8 logdrv; /* 0xD */ u8 numsgelements; /* 0xE */ u8 resvd; /* 0xF */ u8 busy; /* 0x10 */ u8 numstatus; /* 0x11 */ u8 status; /* 0x12 */ u8 completed[46]; u8 mraid_poll; u8 mraid_ack; u8 malign[16];} mega_ioctl_mbox;typedef struct _mega_64sglist32 { u64 address; u32 length;} __attribute__ ((packed)) mega_64sglist;typedef struct _mega_sglist { u32 address; u32 length;} mega_sglist;/* Queued command data */typedef struct _mega_scb mega_scb;struct _mega_scb { int idx; u32 state; u32 isrcount; u8 mboxData[16];#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) u32 dma_type; dma_addr_t dma_h_bulkdata; /*Dma handle for bulk data transfter */ u32 dma_direction; /*Dma direction */ dma_addr_t dma_h_sgdata; /*Dma handle for the sglist structure */ dma_addr_t dma_h_sglist[MAX_SGLIST]; /*Dma handle for all SGL elements */ u8 sglist_count; dma_addr_t dma_sghandle64; dma_addr_t dma_passthruhandle64; dma_addr_t dma_ext_passthruhandle64; dma_addr_t dma_bounce_buffer; u8 *bounce_buffer;#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) mega_passthru *pthru; mega_ext_passthru *epthru;#else mega_passthru pthru; mega_ext_passthru epthru;#endif Scsi_Cmnd *SCpnt; mega_sglist *sgList; mega_64sglist *sg64List; struct semaphore ioctl_sem; void *buff_ptr; u32 iDataSize; mega_scb *next;};/* internal locking by the queue manipulting routines */#define INTERNAL_LOCK 0/* external locking by the queue manipulting routines */#define EXTERNAL_LOCK 1#define NO_LOCK 2#define INTR_ENB 0 /* do not disable interrupt while manipulating */#define INTR_DIS 1 /* disable interrupt while manipulating *//* Per-controller data */typedef struct _mega_host_config { u8 numldrv; u32 flag;#ifdef __LP64__ u64 base;#else u32 base;#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) dma_addr_t dma_handle64, adjdmahandle64; struct pci_dev *dev;#endif mega_scb *qFreeH; mega_scb *qFreeT; spinlock_t lock_free; mega_scb *qPendingH; mega_scb *qPendingT; spinlock_t lock_pend; Scsi_Cmnd *qCompletedH; Scsi_Cmnd *qCompletedT; spinlock_t lock_scsicmd; u32 qFcnt; u32 qPcnt; u32 qCcnt; unsigned long nReads[FC_MAX_LOGICAL_DRIVES]; unsigned long nReadBlocks[FC_MAX_LOGICAL_DRIVES]; unsigned long nWrites[FC_MAX_LOGICAL_DRIVES]; unsigned long nWriteBlocks[FC_MAX_LOGICAL_DRIVES]; unsigned long nInterrupts; /* Host adapter parameters */ u8 fwVer[7]; u8 biosVer[7]; struct Scsi_Host *host; volatile mega_mailbox64 *mbox64; /* ptr to beginning of 64-bit mailbox */ volatile mega_mailbox *mbox; /* ptr to beginning of standard mailbox */#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)/* ptr to beginning of standard mailbox */ volatile mega_mailbox64 *mailbox64ptr;#else volatile mega_mailbox64 mailbox64;#endif volatile u8 mega_buffer[2 * 1024L]; volatile megaRaidProductInfo productInfo; u8 max_cmds; mega_scb scbList[MAX_COMMANDS];#define PROCBUFSIZE 4096 char procbuf[PROCBUFSIZE]; int procidx; struct proc_dir_entry *controller_proc_dir_entry; struct proc_dir_entry *proc_read, *proc_stat, *proc_status, *proc_mbox; int support_ext_cdb; int boot_ldrv_enabled; int boot_ldrv; int support_random_del; /* Do we support random deletion of logdrvs */ int read_ldidmap; /* set after logical drive deltion. The logical drive number must be read from the map */ int quiescent; /* a stage reached when delete logical drive needs to be done. Stop sending requests to the hba till delete operation is completed */ mega_scb *int_qh; /* commands are queued in the internal queue */ mega_scb *int_qt; /* while the hba is quiescent */ int int_qlen;} mega_host_config;typedef struct _driver_info { int size; ulong version;} mega_driver_info;/* * User ioctl structure. * This structure will be used for Traditional Method ioctl interface * commands (M_RD_IOCTL_CMD),Alternate Buffer Method (M_RD_IOCTL_CMD_NEW) * ioctl commands and the Driver ioctls(M_RD_DRIVER_IOCTL_INTERFACE). * The Driver ioctl interface handles the commands at * the driver level, without being sent to the card. */#define MEGADEVIOC 0x84/* system call imposed limit. Change accordingly */#define IOCTL_MAX_DATALEN 4096#pragma pack(1)struct uioctl_t { u32 inlen; u32 outlen; union { u8 fca[16]; struct { u8 opcode; u8 subopcode; u16 adapno;#if BITS_PER_LONG == 32 u8 *buffer; u8 pad[4];#endif#if BITS_PER_LONG == 64 u8 *buffer;#endif u32 length; } fcs; } ui; u8 mbox[18]; /* 16 bytes + 2 status bytes */ mega_passthru pthru;#if BITS_PER_LONG == 32 char *data; /* buffer <= 4096 for 0x80 commands */ char pad[4];#endif#if BITS_PER_LONG == 64 char *data;#endif};#pragma pack()/* * struct mcontroller is used to pass information about the controllers in the * system. Its upto the application how to use the information. We are passing * as much info about the cards as possible and useful. Before issuing the * call to find information about the cards, the applicaiton needs to issue a * ioctl first to find out the number of controllers in the system. */#define MAX_CONTROLLERS 32struct mcontroller { u64 base; u8 irq; u8 numldrv; u8 pcibus; u16 pcidev; u8 pcifun; u16 pciid; u16 pcivendor; u8 pcislot; u32 uid;};struct mbox_passthru { u8 cmd; u8 cmdid; u16 pad1; u32 pad2; u32 dataxferaddr; u8 pad3; u8 pad4; u8 rsvd; u8 mboxbusy; u8 nstatus; u8 status;};/* * Defines for Driver IOCTL interface, Op-code:M_RD_DRIVER_IOCTL_INTERFACE */#define MEGAIOC_MAGIC 'm'#define MEGAIOCCMD _IOWR(MEGAIOC_MAGIC, 0) /* Mega IOCTL command */#define MEGAIOC_QNADAP 'm' /* Query # of adapters */#define MEGAIOC_QDRVRVER 'e' /* Query driver version */#define MEGAIOC_QADAPINFO 'g' /* Query adapter information */#define MKADAP(adapno) (MEGAIOC_MAGIC << 8 | (adapno) )#define GETADAP(mkadap) ( (mkadap) ^ MEGAIOC_MAGIC << 8 )#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) /*0x20300 */extern struct proc_dir_entry proc_scsi_megaraid;#endif/* For Host Re-Ordering */#define MAX_CONTROLLERS 32struct mega_hbas { int is_bios_enabled; mega_host_config *hostdata_addr;};#define IS_BIOS_ENABLED 0x62#define GET_BIOS 0x01#define CHNL_CLASS 0xA9#define GET_CHNL_CLASS 0x00#define SET_CHNL_CLASS 0x01#define CH_RAID 0x01#define CH_SCSI 0x00#define BIOS_PVT_DATA 0x40#define GET_BIOS_PVT_DATA 0x00#pragma pack(1)struct private_bios_data { u8 geometry:4; /* * bits 0-3 - BIOS geometry * 0x0001 - 1GB * 0x0010 - 2GB * 0x1000 - 8GB * Others values are invalid */ u8 unused:4; /* bits 4-7 are unused */ u8 boot_ldrv; /* * logical drive set as boot drive * 0..7 - for 8LD cards * 0..39 - for 40LD cards */ u8 rsvd[12]; u16 cksum; /* 0-(sum of first 13 bytes of this structure) */};#pragma pack()#define NVIRT_CHAN 4 /* # of virtual channels to represent 60 logical drives *//* * Command for random deletion of logical drives */#define FC_DEL_LOGDRV 0xA4 /* f/w command */#define OP_SUP_DEL_LOGDRV 0x2A /* is feature supported */#define OP_GET_LDID_MAP 0x18 /* get logdrv id and logdrv number map */#define OP_DEL_LOGDRV 0x1C /* delete logical drive *//*================================================================ * * Function prototypes * *================================================================ */const char *megaraid_info (struct Scsi_Host *);int megaraid_detect (Scsi_Host_Template *);int megaraid_release (struct Scsi_Host *);int megaraid_command (Scsi_Cmnd *);int megaraid_abort (Scsi_Cmnd *);int megaraid_reset (Scsi_Cmnd *, unsigned int);int megaraid_queue (Scsi_Cmnd *, void (*done) (Scsi_Cmnd *));int megaraid_biosparam (Disk *, kdev_t, int *);int megaraid_proc_info (char *buffer, char **start, off_t offset, int length, int hostno, int inout);static int megaIssueCmd (mega_host_config * megaCfg, u_char * mboxData, mega_scb * scb, int intr);static int mega_build_sglist (mega_host_config * megaCfg, mega_scb * scb, u32 * buffer, u32 * length);static int mega_busyWaitMbox (mega_host_config *);static int mega_runpendq (mega_host_config *);static void mega_rundoneq (mega_host_config *);static void mega_cmd_done (mega_host_config *, mega_scb *, int);static inline void mega_freeSgList (mega_host_config * megaCfg);static void mega_Convert8ldTo40ld (mega_RAIDINQ * inquiry, mega_Enquiry3 * enquiry3, megaRaidProductInfo * productInfo);static int megaraid_reboot_notify (struct notifier_block *, unsigned long, void *);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) static mega_scb *mega_ioctl (mega_host_config * megaCfg, Scsi_Cmnd * SCpnt);static void mega_build_kernel_sg (char *barea, ulong xfersize, mega_scb * pScb, mega_ioctl_mbox * mbox);#endifstatic int megadev_open (struct inode *, struct file *);static int megadev_ioctl_entry (struct inode *, struct file *, unsigned int, unsigned long);static int megadev_ioctl (struct inode *, struct file *, unsigned int, unsigned long);static mega_scb *megadev_doioctl (mega_host_config *, Scsi_Cmnd *);static int megadev_close (struct inode *, struct file *);static void megadev_ioctl_done (Scsi_Cmnd *);static int mega_init_scb (mega_host_config *);static void enq_scb_freelist (mega_host_config *, mega_scb *, int lock, int intr);static int mega_is_bios_enabled (mega_host_config *);static void mega_reorder_hosts (void);static void mega_swap_hosts (struct Scsi_Host *, struct Scsi_Host *);static void mega_create_proc_entry (int index, struct proc_dir_entry *);static int mega_support_ext_cdb(mega_host_config *);static mega_passthru* mega_prepare_passthru(mega_host_config *, mega_scb *, Scsi_Cmnd *);static mega_ext_passthru* mega_prepare_extpassthru(mega_host_config *, mega_scb *, Scsi_Cmnd *);static void mega_enum_raid_scsi(mega_host_config *);static int mega_partsize(Disk *, kdev_t, int *);static void mega_get_boot_ldrv(mega_host_config *);static int mega_get_lun(mega_host_config *, Scsi_Cmnd *);static int mega_support_random_del(mega_host_config *);static int mega_del_logdrv(mega_host_config *, int);static int mega_do_del_logdrv(mega_host_config *, int);#endif/* vi: set ts=4: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -