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

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)