diff options
Diffstat (limited to 'drivers/scsi/megaraid.h')
-rw-r--r-- | drivers/scsi/megaraid.h | 485 |
1 files changed, 402 insertions, 83 deletions
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h index 7f0909ded..312be0385 100644 --- a/drivers/scsi/megaraid.h +++ b/drivers/scsi/megaraid.h @@ -9,6 +9,7 @@ #define IN_ABORT 0x40000000L #define IN_RESET 0x20000000L #define BOARD_QUARTZ 0x08000000L +#define BOARD_40LD 0x04000000L #define SCB_FREE 0x0 #define SCB_ACTIVE 0x1 @@ -147,32 +148,333 @@ } #endif + +/*********************************************************************** + * Structure Declarations for the Firmware supporting 40 Logical Drives + * and 256 Physical Drives. + ***********************************************************************/ + +#define FC_MAX_LOGICAL_DRIVES 40 +#define FC_MAX_LOG_DEVICES FC_MAX_LOGICAL_DRIVES +#define FC_MAX_SPAN_DEPTH 8 +#define FC_MAX_ROW_SIZE 32 + +#define FC_MAX_CHANNELS 16 +#define FC_MAX_TARGETS_PER_CHANNEL 16 +#define FC_MAX_PHYSICAL_DEVICES 256 + +#define FC_NEW_CONFIG 0xA1 +#define DCMD_FC_CMD 0xA1 + #define NC_SUBOP_PRODUCT_INFO 0x0E + #define NC_SUBOP_ENQUIRY3 0x0F + #define ENQ3_GET_SOLICITED_NOTIFY_ONLY 0x01 + #define ENQ3_GET_SOLICITED_FULL 0x02 + #define ENQ3_GET_UNSOLICITED 0x03 + + +/******************************************** + * PRODUCT_INFO Strucure + ********************************************/ + +#define SIG_40LOG_32STR_8SPN 0x00282008 + +/* + * Utilities declare this strcture size as 1024 bytes. So more fields can + * be added in future. + */ + +struct MRaidProductInfo +{ + u32 DataSize; /* current size in bytes (not including resvd) */ + u32 ConfigSignature; + /* Current value is 0x00282008 + * 0x28=MAX_LOGICAL_DRIVES, + * 0x20=Number of stripes and + * 0x08=Number of spans */ + u8 FwVer[16]; /* printable ASCI string */ + u8 BiosVer[16]; /* printable ASCI string */ + u8 ProductName[80]; /* printable ASCI string */ + + u8 MaxConcCmds; /* Max. concurrent commands supported */ + u8 SCSIChanPresent; /* Number of SCSI Channels detected */ + u8 FCLoopPresent; /* Number of Fibre Loops detected */ + u8 memType; /* EDO, FPM, SDRAM etc */ + + u32 signature; + u16 DramSize; /* In terms of MB */ + u16 subSystemID; + + u16 subSystemVendorID; + u8 numNotifyCounters; + u8 pad1k[889]; /* 135 + 889 resvd = 1024 total size */ +}__attribute__((packed)); +typedef struct MRaidProductInfo megaRaidProductInfo; + +/******************************************** + * Standard ENQUIRY Strucure + ********************************************/ +struct FC_ADP_INFO +{ + u8 MaxConcCmds; /* Max. concurrent commands supported. */ + u8 RbldRate; /* Rebuild Rate. Varies from 0%-100% */ + u8 MaxTargPerChan; /* Max. Targets supported per chan. */ + u8 ChanPresent; /* No. of Chans present on this adapter. */ + u8 FwVer[4]; /* Firmware version. */ + u16 AgeOfFlash; /* No. of times FW has been downloaded. */ + u8 ChipSetValue; /* Contents of 0xC0000832 */ + u8 DramSize; /* In terms of MB */ + u8 CacheFlushInterval; /* In terms of Seconds */ + u8 BiosVersion[4]; + u8 BoardType; + u8 sense_alert; + u8 write_config_count; /* Increase with evry 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 : temp high + BIT 3 : battery pack missing + BIT 4,5 : 00 - charge complete + 01 - fast charge in prog + 10 - fast charge fail + 11 - undefined + BIt 6 : counter > 1000 + Bit 7 : undefined + */ + u8 dec_fault_bus_info; /* was resvd */ +}__attribute__((packed)); + +struct FC_LDRV_INFO +{ + u8 NumLDrv; /* No. of Log. Drvs configured. */ + u8 recon_state[FC_MAX_LOGICAL_DRIVES/8]; + /* bit field for State of reconstruct */ + u16 LDrvOpStatus[FC_MAX_LOGICAL_DRIVES/8]; + /* bit field Status of Long Operations. */ + + 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. */ +}__attribute__((packed)); + +#define PREVSTAT_MASK 0xf0 +#define CURRSTAT_MASK 0x0f + +struct FC_PDRV_INFO +{ + u8 PDrvState[FC_MAX_PHYSICAL_DEVICES]; /* State of Phys Drvs. */ +}__attribute__((packed)); + + +struct FC_AdapterInq +{ + struct FC_ADP_INFO AdpInfo; + struct FC_LDRV_INFO LogdrvInfo; + struct FC_PDRV_INFO PhysdrvInfo; +}__attribute__((packed)); + + +typedef struct FC_AdapterInq mega_RAIDINQ_FC; + +/******************************************** + * NOTIFICATION Strucure + ********************************************/ + +#define MAX_NOTIFY_SIZE 0x80 +#define CUR_NOTIFY_SIZE sizeof(struct MegaRAID_Notify) + +/* + * Utilities declare this strcture size as ?? bytes. So more fields can + * be added in future. + */ +struct MegaRAID_Notify +{ + u32 globalCounter; /* Any change increments this counter */ + + u8 paramCounter; /* Indicates any params changed */ + u8 paramId; /* Param modified - defined below */ + u16 paramVal; /* New val of last param modified */ + + u8 writeConfigCounter; /* write config occurred */ + u8 writeConfigRsvd[3]; + + u8 ldrvOpCounter; /* Indicates ldrv op started/completed */ + u8 ldrvOpId; /* ldrv num */ + u8 ldrvOpCmd; /* ldrv operation - defined below */ + u8 ldrvOpStatus; /* status of the operation */ + + u8 ldrvStateCounter; /* Indicates change of ldrv state */ + u8 ldrvStateId; /* ldrv num */ + u8 ldrvStateNew; /* New state */ + u8 ldrvStateOld; /* old state */ + + u8 pdrvStateCounter; /* Indicates change of ldrv state */ + u8 pdrvStateId; /* pdrv id */ + u8 pdrvStateNew; /* New state */ + u8 pdrvStateOld; /* old state */ + + u8 pdrvFmtCounter; /* Indicates pdrv format started/over */ + u8 pdrvFmtId; /* pdrv id */ + u8 pdrvFmtVal; /* format started/over */ + u8 pdrvFmtRsvd; + + u8 targXferCounter; /* Indicates SCSI-2 Xfer rate change */ + u8 targXferId; /* pdrv Id */ + u8 targXferVal; /* new Xfer params of last pdrv */ + u8 targXferRsvd; + + u8 fcLoopIdChgCounter; /* Indicates loopid changed */ + u8 fcLoopIdPdrvId; /* pdrv id */ + u8 fcLoopId0; /* loopid on fc loop 0 */ + u8 fcLoopId1; /* loopid on fc loop 1 */ + + u8 fcLoopStateCounter; /* Indicates loop state changed */ + u8 fcLoopState0; /* state of fc loop 0 */ + u8 fcLoopState1; /* state of fc loop 1 */ + u8 fcLoopStateRsvd; +}__attribute__((packed)); + + +/******************************************** + * PARAM IDs in Notify struct + ********************************************/ +#define PARAM_RBLD_RATE 0x01 + /*-------------------------------------- + * Param val = + * byte 0: new rbld rate + *--------------------------------------*/ +#define PARAM_CACHE_FLUSH_INTERVAL 0x02 + /*-------------------------------------- + * Param val = + * byte 0: new cache flush interval + *--------------------------------------*/ +#define PARAM_SENSE_ALERT 0x03 + /*-------------------------------------- + * Param val = + * byte 0: last pdrv id causing chkcond + *--------------------------------------*/ +#define PARAM_DRIVE_INSERTED 0x04 + /*-------------------------------------- + * Param val = + * byte 0: last pdrv id inserted + *--------------------------------------*/ +#define PARAM_BATTERY_STATUS 0x05 + /*-------------------------------------- + * Param val = + * byte 0: battery status + *--------------------------------------*/ + +/******************************************** + * Ldrv operation cmd in Notify struct + ********************************************/ +#define LDRV_CMD_CHKCONSISTANCY 0x01 +#define LDRV_CMD_INITIALIZE 0x02 +#define LDRV_CMD_RECONSTRUCTION 0x03 + +/******************************************** + * Ldrv operation status in Notify struct + ********************************************/ +#define LDRV_OP_SUCCESS 0x00 +#define LDRV_OP_FAILED 0x01 +#define LDRV_OP_ABORTED 0x02 +#define LDRV_OP_CORRECTED 0x03 +#define LDRV_OP_STARTED 0x04 + + +/******************************************** + * Raid Logical drive states. + ********************************************/ +#define RDRV_OFFLINE 0 +#define RDRV_DEGRADED 1 +#define RDRV_OPTIMAL 2 +#define RDRV_DELETED 3 + +/******************************************* + * Physical drive states. + *******************************************/ +#define PDRV_UNCNF 0 +#define PDRV_ONLINE 3 +#define PDRV_FAILED 4 +#define PDRV_RBLD 5 +/* #define PDRV_HOTSPARE 6 */ + +/******************************************* + * Formal val in Notify struct + *******************************************/ +#define PDRV_FMT_START 0x01 +#define PDRV_FMT_OVER 0x02 + +/******************************************** + * FC Loop State in Notify Struct + ********************************************/ +#define ENQ_FCLOOP_FAILED 0 +#define ENQ_FCLOOP_ACTIVE 1 +#define ENQ_FCLOOP_TRANSIENT 2 + +/******************************************** + * ENQUIRY3 Strucure + ********************************************/ +/* + * Utilities declare this strcture size as 1024 bytes. So more fields can + * be added in future. + */ +struct MegaRAID_Enquiry3 +{ + u32 dataSize; /* current size in bytes (not including resvd) */ + + struct MegaRAID_Notify notify; + + u8 notifyRsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE]; + + u8 rbldRate; /* Rebuild rate (0% - 100%) */ + u8 cacheFlushInterval; /* In terms of Seconds */ + u8 senseAlert; + u8 driveInsertedCount; /* drive insertion count */ + + u8 batteryStatus; + u8 numLDrv; /* No. of Log Drives configured */ + u8 reconState[FC_MAX_LOGICAL_DRIVES/8]; /* State of reconstruct */ + u16 lDrvOpStatus[FC_MAX_LOGICAL_DRIVES/8]; /* log. Drv Status */ + + 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 { - u_char MaxConcCmds; - u_char RbldRate; - u_char MaxTargPerChan; - u_char ChanPresent; - u_char FwVer[4]; - u_short AgeOfFlash; - u_char ChipSet; - u_char DRAMSize; - u_char CacheFlushInterval; - u_char BiosVer[4]; - u_char resvd[7]; + 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 { - u_char NumLDrv; - u_char resvd[3]; - u_long LDrvSize[MAX_LOGICAL_DRIVES]; - u_char LDrvProp[MAX_LOGICAL_DRIVES]; - u_char LDrvState[MAX_LOGICAL_DRIVES]; + 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 { - u_char PDrvState[MAX_PHYSICAL_DRIVES]; - u_char resvd; + u8 PDrvState[MAX_PHYSICAL_DRIVES]; + u8 resvd; } mega_PDRV_INFO; // RAID inquiry: Mailbox command 0x5 @@ -184,65 +486,70 @@ typedef struct _mega_RAIDINQ { // Passthrough command: Mailbox command 0x3 typedef struct mega_passthru { - u_char timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */ - u_char ars:1; - u_char reserved:3; - u_char islogical:1; - u_char logdrv; /* if islogical == 1 */ - u_char channel; /* if islogical == 0 */ - u_char target; /* if islogical == 0 */ - u_char queuetag; /* unused */ - u_char queueaction; /* unused */ - u_char cdb[MAX_CDB_LEN]; - u_char cdblen; - u_char reqsenselen; - u_char reqsensearea[MAX_REQ_SENSE_LEN]; - u_char numsgelements; - u_char scsistatus; - u_long dataxferaddr; - u_long dataxferlen; + 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; typedef struct _mega_mailbox { - /* 0x0 */ u_char cmd; - /* 0x1 */ u_char cmdid; - /* 0x2 */ u_short numsectors; - /* 0x4 */ u_long lba; - /* 0x8 */ u_long xferaddr; - /* 0xC */ u_char logdrv; - /* 0xD */ u_char numsgelements; - /* 0xE */ u_char resvd; - /* 0xF */ u_char busy; - /* 0x10 */ u_char numstatus; - /* 0x11 */ u_char status; - /* 0x12 */ u_char completed[46]; - u_char mraid_poll; - u_char mraid_ack; - u_char pad[16]; + /* 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]; + u8 mraid_poll; + u8 mraid_ack; + u8 pad[16]; } mega_mailbox; +typedef struct { + u32 xferSegment; /* for 64-bit controllers */ + mega_mailbox mailbox; +} mega_mailbox64; + typedef struct _mega_ioctl_mbox { - /* 0x0 */ u_char cmd; - /* 0x1 */ u_char cmdid; - /* 0x2 */ u_char channel; - /* 0x3 */ u_char param; - /* 0x4 */ u_char pad[4]; - /* 0x8 */ u_long xferaddr; - /* 0xC */ u_char logdrv; - /* 0xD */ u_char numsgelements; - /* 0xE */ u_char resvd; - /* 0xF */ u_char busy; - /* 0x10 */ u_char numstatus; - /* 0x11 */ u_char status; - /* 0x12 */ u_char completed[46]; - u_char mraid_poll; - u_char mraid_ack; - u_char malign[16]; + /* 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_sglist { - u_long address; - u_long length; + u32 address; + u32 length; } mega_sglist; /* Queued command data */ @@ -250,39 +557,51 @@ typedef struct _mega_scb mega_scb; struct _mega_scb { int idx; - u_long state; - u_long isrcount; - u_char mboxData[16]; + u32 state; + u32 isrcount; + u8 mboxData[16]; mega_passthru pthru; Scsi_Cmnd *SCpnt; mega_sglist *sgList; + char *kern_area; /* Only used for large ioctl xfers */ + struct wait_queue *ioctl_wait; + struct semaphore sem; mega_scb *next; }; /* Per-controller data */ typedef struct _mega_host_config { - u_char numldrv; - u_long flag; - u_long base; + u8 numldrv; + u32 flag; + u32 base; mega_scb *qFree; mega_scb *qPending; - u_long nReads[MAX_LOGICAL_DRIVES]; - u_long nWrites[MAX_LOGICAL_DRIVES]; + u32 nReads[FC_MAX_LOGICAL_DRIVES]; + u32 nWrites[FC_MAX_LOGICAL_DRIVES]; /* Host adapter parameters */ - u_char fwVer[7]; - u_char biosVer[7]; + u8 fwVer[7]; + u8 biosVer[7]; struct Scsi_Host *host; - /* The following must be DMA-able!! */ - volatile mega_mailbox *mbox; - volatile mega_mailbox mailbox; - volatile u_char mega_buffer[2 * 1024L]; + volatile mega_mailbox64 *mbox64; /* ptr to beginning of 64-bit mailbox */ + volatile mega_mailbox *mbox; /* ptr to beginning of standard mailbox */ + volatile mega_mailbox64 mailbox64; +#if 0 + volatile union { + u8 generic_buffer[2 * 1024L]; + mega_RAIDINQ adapterInfoData; + mega_Enquiry3 enquiry3Data; + }mega_buffer; +#else + volatile u8 mega_buffer[2*1024L]; +#endif + volatile megaRaidProductInfo productInfo; - u_char max_cmds; + u8 max_cmds; mega_scb scbList[MAX_COMMANDS]; } mega_host_config; |