megaraid.h
来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 1,072 行 · 第 1/2 页
H
1,072 行
#ifndef __MEGARAID_H__#define __MEGARAID_H__#include <linux/spinlock.h>#define MEGARAID_VERSION \ "v2.00.3 (Release Date: Wed Feb 19 08:51:30 EST 2003)\n"/* * Driver features - change the values to enable or disable features in the * driver. *//* * Comand coalescing - This feature allows the driver to be able to combine * two or more commands and issue as one command in order to boost I/O * performance. Useful if the nature of the I/O is sequential. It is not very * useful for random natured I/Os. */#define MEGA_HAVE_COALESCING 0/* * Clustering support - Set this flag if you are planning to use the * clustering services provided by the megaraid controllers and planning to * setup a cluster */#define MEGA_HAVE_CLUSTERING 1/* * Driver statistics - Set this flag if you are interested in statics about * number of I/O completed on each logical drive and how many interrupts * generated. If enabled, this information is available through /proc * interface and through the private ioctl. Setting this flag has a * performance penalty. */#define MEGA_HAVE_STATS 0/* * Enhanced /proc interface - This feature will allow you to have a more * detailed /proc interface for megaraid driver. E.g., a real time update of * the status of the logical drives, battery status, physical drives etc. */#define MEGA_HAVE_ENH_PROC 1#define MAX_DEV_TYPE 32#ifndef PCI_VENDOR_ID_LSI_LOGIC#define PCI_VENDOR_ID_LSI_LOGIC 0x1000#endif#ifndef PCI_VENDOR_ID_AMI#define PCI_VENDOR_ID_AMI 0x101E#endif#ifndef PCI_VENDOR_ID_DELL#define PCI_VENDOR_ID_DELL 0x1028#endif#ifndef PCI_VENDOR_ID_INTEL#define PCI_VENDOR_ID_INTEL 0x8086#endif#ifndef PCI_DEVICE_ID_AMI_MEGARAID#define PCI_DEVICE_ID_AMI_MEGARAID 0x9010#endif#ifndef PCI_DEVICE_ID_AMI_MEGARAID2#define PCI_DEVICE_ID_AMI_MEGARAID2 0x9060#endif#ifndef PCI_DEVICE_ID_AMI_MEGARAID3#define PCI_DEVICE_ID_AMI_MEGARAID3 0x1960#endif#define PCI_DEVICE_ID_DISCOVERY 0x000E#define PCI_DEVICE_ID_PERC4_DI 0x000F#define PCI_DEVICE_ID_PERC4_QC_VERDE 0x0407/* Sub-System Vendor IDs */#define AMI_SUBSYS_VID 0x101E#define DELL_SUBSYS_VID 0x1028#define HP_SUBSYS_VID 0x103C#define LSI_SUBSYS_VID 0x1000#define INTEL_SUBSYS_VID 0x8086#define HBA_SIGNATURE 0x3344#define HBA_SIGNATURE_471 0xCCCC#define HBA_SIGNATURE_64BIT 0x0299#define MBOX_BUSY_WAIT 10 /* wait for up to 10 usec for mailbox to be free */#define DEFAULT_INITIATOR_ID 7#define MAX_SGLIST 64 /* max supported in f/w */#define MIN_SGLIST 26 /* guaranteed to support these many */#define MAX_COMMANDS 126#define CMDID_INT_CMDS MAX_COMMANDS+1 /* make sure CMDID_INT_CMDS is less than max commands supported by any f/w */#define MAX_CDB_LEN 10#define MAX_EXT_CDB_LEN 16 /* we support cdb length up to 16 */#define DEF_CMD_PER_LUN 63#define MAX_CMD_PER_LUN MAX_COMMANDS#define MAX_FIRMWARE_STATUS 46#define MAX_XFER_PER_CMD (64*1024)#define MAX_SECTORS_PER_IO 128#define MAX_LOGICAL_DRIVES_40LD 40#define FC_MAX_PHYSICAL_DEVICES 256#define MAX_LOGICAL_DRIVES_8LD 8#define MAX_CHANNELS 5#define MAX_TARGET 15#define MAX_PHYSICAL_DRIVES MAX_CHANNELS*MAX_TARGET#define MAX_ROW_SIZE_40LD 32#define MAX_ROW_SIZE_8LD 8#define MAX_SPAN_DEPTH 8#define NVIRT_CHAN 4 /* # of virtual channels to represent up to 60 logical drives */struct mbox_out { /* 0x0 */ u8 cmd; /* 0x1 */ u8 cmdid; /* 0x2 */ u16 numsectors; /* 0x4 */ u32 lba; /* 0x8 */ u32 xferaddr; /* 0xC */ u8 logdrv; /* 0xD */ u8 numsgelements; /* 0xE */ u8 resvd;} __attribute__ ((packed));struct mbox_in { /* 0xF */ volatile u8 busy; /* 0x10 */ volatile u8 numstatus; /* 0x11 */ volatile u8 status; /* 0x12 */ volatile u8 completed[MAX_FIRMWARE_STATUS]; volatile u8 poll; volatile u8 ack;} __attribute__ ((packed));typedef struct { struct mbox_out m_out; struct mbox_in m_in;} __attribute__ ((packed)) mbox_t;typedef struct { u32 xfer_segment_lo; u32 xfer_segment_hi; mbox_t mbox;} __attribute__ ((packed)) mbox64_t;/* * Passthru definitions */#define MAX_REQ_SENSE_LEN 0x20typedef struct { 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;} __attribute__ ((packed)) 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[MAX_EXT_CDB_LEN]; u8 numsgelements; u8 status; u8 reqsenselen; u8 reqsensearea[MAX_REQ_SENSE_LEN]; u8 rsvd4; u32 dataxferaddr; u32 dataxferlen;} __attribute__ ((packed)) mega_ext_passthru;typedef struct { u64 address; u32 length;} __attribute__ ((packed)) mega_sgl64;typedef struct { u32 address; u32 length;} __attribute__ ((packed)) mega_sglist;/* Queued command data */typedef struct { int idx; u32 state; struct list_head list; u8 raw_mbox[66]; u32 dma_type; u32 dma_direction; Scsi_Cmnd *cmd; dma_addr_t dma_h_bulkdata; dma_addr_t dma_h_sgdata; mega_sglist *sgl; mega_sgl64 *sgl64; dma_addr_t sgl_dma_addr; mega_passthru *pthru; dma_addr_t pthru_dma_addr; mega_ext_passthru *epthru; dma_addr_t epthru_dma_addr;} scb_t;/* * Flags to follow the scb as it transitions between various stages */#define SCB_FREE 0x0000 /* on the free list */#define SCB_ACTIVE 0x0001 /* off the free list */#define SCB_PENDQ 0x0002 /* on the pending queue */#define SCB_ISSUED 0x0004 /* issued - owner f/w */#define SCB_ABORT 0x0008 /* Got an abort for this one */#define SCB_RESET 0x0010 /* Got a reset for this one *//* * Utilities declare this strcture size as 1024 bytes. So more fields can * be added in future. */typedef struct { u32 data_size; /* current size in bytes (not including resvd) */ u32 config_signature; /* Current value is 0x00282008 * 0x28=MAX_LOGICAL_DRIVES, * 0x20=Number of stripes and * 0x08=Number of spans */ u8 fw_version[16]; /* printable ASCI string */ u8 bios_version[16]; /* printable ASCI string */ u8 product_name[80]; /* printable ASCI string */ u8 max_commands; /* Max. concurrent commands supported */ u8 nchannels; /* Number of SCSI Channels detected */ u8 fc_loop_present; /* Number of Fibre Loops detected */ u8 mem_type; /* EDO, FPM, SDRAM etc */ u32 signature; u16 dram_size; /* In terms of MB */ u16 subsysid; u16 subsysvid; u8 notify_counters; u8 pad1k[889]; /* 135 + 889 resvd = 1024 total size */} __attribute__ ((packed)) mega_product_info;struct notify { u32 global_counter; /* Any change increments this counter */ u8 param_counter; /* Indicates any params changed */ u8 param_id; /* Param modified - defined below */ u16 param_val; /* New val of last param modified */ u8 write_config_counter; /* write config occurred */ u8 write_config_rsvd[3]; u8 ldrv_op_counter; /* Indicates ldrv op started/completed */ u8 ldrv_opid; /* ldrv num */ u8 ldrv_opcmd; /* ldrv operation - defined below */ u8 ldrv_opstatus; /* status of the operation */ u8 ldrv_state_counter; /* Indicates change of ldrv state */ u8 ldrv_state_id; /* ldrv num */ u8 ldrv_state_new; /* New state */ u8 ldrv_state_old; /* old state */ u8 pdrv_state_counter; /* Indicates change of ldrv state */ u8 pdrv_state_id; /* pdrv id */ u8 pdrv_state_new; /* New state */ u8 pdrv_state_old; /* old state */ u8 pdrv_fmt_counter; /* Indicates pdrv format started/over */ u8 pdrv_fmt_id; /* pdrv id */ u8 pdrv_fmt_val; /* format started/over */ u8 pdrv_fmt_rsvd; u8 targ_xfer_counter; /* Indicates SCSI-2 Xfer rate change */ u8 targ_xfer_id; /* pdrv Id */ u8 targ_xfer_val; /* new Xfer params of last pdrv */ u8 targ_xfer_rsvd; u8 fcloop_id_chg_counter; /* Indicates loopid changed */ u8 fcloopid_pdrvid; /* pdrv id */ u8 fcloop_id0; /* loopid on fc loop 0 */ u8 fcloop_id1; /* loopid on fc loop 1 */ u8 fcloop_state_counter; /* Indicates loop state changed */ u8 fcloop_state0; /* state of fc loop 0 */ u8 fcloop_state1; /* state of fc loop 1 */ u8 fcloop_state_rsvd;} __attribute__ ((packed));#define MAX_NOTIFY_SIZE 0x80#define CUR_NOTIFY_SIZE sizeof(struct notify)typedef struct { u32 data_size; /* current size in bytes (not including resvd) */ struct notify notify; u8 notify_rsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE]; u8 rebuild_rate; /* Rebuild rate (0% - 100%) */ u8 cache_flush_interval; /* In terms of Seconds */ u8 sense_alert; u8 drive_insert_count; /* drive insertion count */ u8 battery_status; u8 num_ldrv; /* No. of Log Drives configured */ u8 recon_state[MAX_LOGICAL_DRIVES_40LD / 8]; /* State of reconstruct */ u16 ldrv_op_status[MAX_LOGICAL_DRIVES_40LD / 8]; /* logdrv Status */ u32 ldrv_size[MAX_LOGICAL_DRIVES_40LD];/* Size of each log drv */ u8 ldrv_prop[MAX_LOGICAL_DRIVES_40LD]; u8 ldrv_state[MAX_LOGICAL_DRIVES_40LD];/* State of log drives */ u8 pdrv_state[FC_MAX_PHYSICAL_DEVICES];/* State of phys drvs. */ u16 pdrv_format[FC_MAX_PHYSICAL_DEVICES / 16]; u8 targ_xfer[80]; /* phys device transfer rate */ u8 pad1k[263]; /* 761 + 263reserved = 1024 bytes total size */} __attribute__ ((packed)) mega_inquiry3;/* Structures */typedef struct { u8 max_commands; /* Max concurrent commands supported */ u8 rebuild_rate; /* Rebuild rate - 0% thru 100% */ u8 max_targ_per_chan; /* Max targ per channel */ u8 nchannels; /* Number of channels on HBA */ u8 fw_version[4]; /* Firmware version */ u16 age_of_flash; /* Number of times FW has been flashed */ u8 chip_set_value; /* Contents of 0xC0000832 */ u8 dram_size; /* In MB */ u8 cache_flush_interval; /* in seconds */ u8 bios_version[4]; u8 board_type; u8 sense_alert; u8 write_config_count; /* Increase with every configuration change */ u8 drive_inserted_count; /* Increase with every drive inserted */ u8 inserted_drive; /* Channel:Id of inserted drive */ u8 battery_status; /* * BIT 0: battery module missing * BIT 1: VBAD * BIT 2: temprature high * BIT 3: battery pack missing * BIT 4,5: * 00 - charge complete * 01 - fast charge in progress * 10 - fast charge fail * 11 - undefined * Bit 6: counter > 1000 * Bit 7: Undefined */ u8 dec_fault_bus_info;} __attribute__ ((packed)) mega_adp_info;typedef struct { u8 num_ldrv; /* Number of logical drives configured */ u8 rsvd[3]; u32 ldrv_size[MAX_LOGICAL_DRIVES_8LD]; u8 ldrv_prop[MAX_LOGICAL_DRIVES_8LD]; u8 ldrv_state[MAX_LOGICAL_DRIVES_8LD];} __attribute__ ((packed)) mega_ldrv_info;typedef struct { u8 pdrv_state[MAX_PHYSICAL_DRIVES]; u8 rsvd;} __attribute__ ((packed)) mega_pdrv_info;/* RAID inquiry: Mailbox command 0x05*/typedef struct { mega_adp_info adapter_info; mega_ldrv_info logdrv_info; mega_pdrv_info pdrv_info;} __attribute__ ((packed)) mraid_inquiry;/* RAID extended inquiry: Mailbox command 0x04*/typedef struct { mraid_inquiry raid_inq; u16 phys_drv_format[MAX_CHANNELS]; u8 stack_attn; u8 modem_status; u8 rsvd[2];} __attribute__ ((packed)) mraid_ext_inquiry;typedef struct { u8 channel; u8 target;}__attribute__ ((packed)) adp_device;typedef struct { u32 start_blk; /* starting block */ u32 num_blks; /* # of blocks */ adp_device device[MAX_ROW_SIZE_40LD];}__attribute__ ((packed)) adp_span_40ld;typedef struct { u32 start_blk; /* starting block */ u32 num_blks; /* # of blocks */ adp_device device[MAX_ROW_SIZE_8LD];}__attribute__ ((packed)) adp_span_8ld;typedef struct { u8 span_depth; /* Total # of spans */ u8 level; /* RAID level */ u8 read_ahead; /* read ahead, no read ahead, adaptive read ahead */ u8 stripe_sz; /* Encoded stripe size */ u8 status; /* Status of the logical drive */ u8 write_mode; /* write mode, write_through/write_back */ u8 direct_io; /* direct io or through cache */ u8 row_size; /* Number of stripes in a row */} __attribute__ ((packed)) logdrv_param;typedef struct { logdrv_param lparam; adp_span_40ld span[MAX_SPAN_DEPTH];}__attribute__ ((packed)) logdrv_40ld;typedef struct { logdrv_param lparam; adp_span_8ld span[MAX_SPAN_DEPTH];}__attribute__ ((packed)) logdrv_8ld;typedef struct { u8 type; /* Type of the device */ u8 cur_status; /* current status of the device */ u8 tag_depth; /* Level of tagging */ u8 sync_neg; /* sync negotiation - ENABLE or DISBALE */ u32 size; /* configurable size in terms of 512 byte blocks */}__attribute__ ((packed)) phys_drv;typedef struct { u8 nlog_drives; /* number of logical drives */ u8 resvd[3]; logdrv_40ld ldrv[MAX_LOGICAL_DRIVES_40LD]; phys_drv pdrv[MAX_PHYSICAL_DRIVES];}__attribute__ ((packed)) disk_array_40ld;typedef struct { u8 nlog_drives; /* number of logical drives */ u8 resvd[3]; logdrv_8ld ldrv[MAX_LOGICAL_DRIVES_8LD]; phys_drv pdrv[MAX_PHYSICAL_DRIVES];}__attribute__ ((packed)) disk_array_8ld;/* * User ioctl structure. * This structure will be used for Traditional Method ioctl interface * commands (0x80),Alternate Buffer Method (0x81) ioctl commands and the * Driver ioctls. * The Driver ioctl interface handles the commands at the driver level, * without being sent to the card. *//* system call imposed limit. Change accordingly */#define IOCTL_MAX_DATALEN 4096struct 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; } __attribute__ ((packed)) fcs; } __attribute__ ((packed)) ui; u8 mbox[18]; /* 16 bytes + 2 status bytes */ mega_passthru pthru;#if BITS_PER_LONG == 32 char __user *data; /* buffer <= 4096 for 0x80 commands */ char pad[4];#endif#if BITS_PER_LONG == 64 char __user *data;#endif} __attribute__ ((packed));/* * 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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?