patch-2.3.15 linux/drivers/scsi/megaraid.h
Next file: linux/drivers/scsi/qlogicfc.c
Previous file: linux/drivers/scsi/megaraid.c
Back to the patch index
Back to the overall index
- Lines: 548
- Date:
Mon Aug 23 14:49:42 1999
- Orig file:
v2.3.14/linux/drivers/scsi/megaraid.h
- Orig date:
Wed Aug 18 16:44:24 1999
diff -u --recursive --new-file v2.3.14/linux/drivers/scsi/megaraid.h linux/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 @@
// 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 @@
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;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)