[PATCH] aacraid: host_lock not released fix
[powerpc.git] / drivers / scsi / aacraid / aacraid.h
index a250a6f..4a99d2f 100644 (file)
@@ -1,6 +1,10 @@
 #if (!defined(dprintk))
 # define dprintk(x)
 #endif
+/* eg: if (nblank(dprintk(x))) */
+#define _nblank(x) #x
+#define nblank(x) _nblank(x)[0]
+
 
 /*------------------------------------------------------------------------------
  *              D E F I N E S
 
 #define MAXIMUM_NUM_CONTAINERS 32
 
-#define AAC_NUM_FIB            (256 + 64)
-#define AAC_NUM_IO_FIB         100
+#define AAC_NUM_MGT_FIB         8
+#define AAC_NUM_IO_FIB         (512 - AAC_NUM_MGT_FIB)
+#define AAC_NUM_FIB            (AAC_NUM_IO_FIB + AAC_NUM_MGT_FIB)
 
 #define AAC_MAX_LUN            (8)
 
 #define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
+#define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)512)
 
 /*
  * These macros convert from physical channels to virtual channels
@@ -108,6 +114,22 @@ struct user_sgentry64 {
        u32     count;  /* Length. */
 };
 
+struct sgentryraw {
+       __le32          next;   /* reserved for F/W use */
+       __le32          prev;   /* reserved for F/W use */
+       __le32          addr[2];
+       __le32          count;
+       __le32          flags;  /* reserved for F/W use */
+};
+
+struct user_sgentryraw {
+       u32             next;   /* reserved for F/W use */
+       u32             prev;   /* reserved for F/W use */
+       u32             addr[2];
+       u32             count;
+       u32             flags;  /* reserved for F/W use */
+};
+
 /*
  *     SGMAP
  *
@@ -135,6 +157,16 @@ struct user_sgmap64 {
        struct user_sgentry64 sg[1];
 };
 
+struct sgmapraw {
+       __le32            count;
+       struct sgentryraw sg[1];
+};
+
+struct user_sgmapraw {
+       u32               count;
+       struct user_sgentryraw sg[1];
+};
+
 struct creation_info
 {
        u8              buildnum;               /* e.g., 588 */
@@ -274,7 +306,6 @@ enum aac_queue_types {
  */
 
 #define                FsaNormal       1
-#define                FsaHigh         2
 
 /*
  * Define the FIB. The FIB is the where all the requested data and
@@ -303,12 +334,9 @@ struct aac_fibhdr {
        } _u;
 };
 
-#define FIB_DATA_SIZE_IN_BYTES (512 - sizeof(struct aac_fibhdr))
-
-
 struct hw_fib {
        struct aac_fibhdr header;
-       u8 data[FIB_DATA_SIZE_IN_BYTES];                // Command specific data
+       u8 data[512-sizeof(struct aac_fibhdr)]; // Command specific data
 };
 
 /*
@@ -352,6 +380,7 @@ struct hw_fib {
  */
 #define                ContainerCommand                500
 #define                ContainerCommand64              501
+#define                ContainerRawIo                  502
 /*
  *     Cluster Commands
  */
@@ -370,11 +399,12 @@ struct hw_fib {
 #define                RequestAdapterInfo              703
 #define                IsAdapterPaused                 704
 #define                SendHostTime                    705
-#define                LastMiscCommand                 706
+#define                RequestSupplementAdapterInfo    706
+#define                LastMiscCommand                 707
 
-//
-// Commands that will target the failover level on the FSA adapter
-//
+/*
+ * Commands that will target the failover level on the FSA adapter
+ */
 
 enum fib_xfer_state {
        HostOwned                       = (1<<0),
@@ -407,6 +437,7 @@ enum fib_xfer_state {
  */
 
 #define ADAPTER_INIT_STRUCT_REVISION           3
+#define ADAPTER_INIT_STRUCT_REVISION_4         4 // rocket science
 
 struct aac_init
 {
@@ -424,6 +455,14 @@ struct aac_init
        __le32  HostPhysMemPages;   /* number of 4k pages of host 
                                       physical memory */
        __le32  HostElapsedSeconds; /* number of seconds since 1970. */
+       /*
+        * ADAPTER_INIT_STRUCT_REVISION_4 begins here
+        */
+       __le32  InitFlags;      /* flags for supported features */
+#define INITFLAGS_NEW_COMM_SUPPORTED   0x00000001
+       __le32  MaxIoCommands;  /* max outstanding commands */
+       __le32  MaxIoSize;      /* largest I/O command */
+       __le32  MaxFibSize;     /* largest FIB to adapter */
 };
 
 enum aac_log_level {
@@ -447,7 +486,8 @@ struct adapter_ops
 {
        void (*adapter_interrupt)(struct aac_dev *dev);
        void (*adapter_notify)(struct aac_dev *dev, u32 event);
-       int  (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 *status);
+       void (*adapter_disable_int)(struct aac_dev *dev);
+       int  (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
        int  (*adapter_check_health)(struct aac_dev *dev);
 };
 
@@ -509,8 +549,6 @@ struct aac_queue {
                   /* This is only valid for adapter to host command queues. */ 
        spinlock_t              *lock;          /* Spinlock for this queue must take this lock before accessing the lock */
        spinlock_t              lockdata;       /* Actual lock (used only on one side of the lock) */
-       unsigned long           SavedIrql;      /* Previous IRQL when the spin lock is taken */
-       u32                     padding;        /* Padding - FIXME - can remove I believe */
        struct list_head        cmdq;           /* A queue of FIBs which need to be prcessed by the FS thread. This is */
                                                /* only valid for command queues which receive entries from the adapter. */
        struct list_head        pendingq;       /* A queue of outstanding fib's to the adapter. */
@@ -567,6 +605,7 @@ struct sa_drawbridge_CSR {
 #define Mailbox3       SaDbCSR.MAILBOX3
 #define Mailbox4       SaDbCSR.MAILBOX4
 #define Mailbox5       SaDbCSR.MAILBOX5
+#define Mailbox6       SaDbCSR.MAILBOX6
 #define Mailbox7       SaDbCSR.MAILBOX7
        
 #define DoorbellReg_p SaDbCSR.PRISETIRQ
@@ -738,7 +777,9 @@ struct fsa_dev_info {
        u64             last;
        u64             size;
        u32             type;
+       u32             config_waiting_on;
        u16             queue_depth;
+       u8              config_needed;
        u8              valid;
        u8              ro;
        u8              locked;
@@ -812,6 +853,47 @@ struct aac_adapter_info
        __le32  OEM;
 };
 
+struct aac_supplement_adapter_info
+{
+       u8      AdapterTypeText[17+1];
+       u8      Pad[2];
+       __le32  FlashMemoryByteSize;
+       __le32  FlashImageId;
+       __le32  MaxNumberPorts;
+       __le32  Version;
+       __le32  FeatureBits;
+       u8      SlotNumber;
+       u8      ReservedPad0[0];
+       u8      BuildDate[12];
+       __le32  CurrentNumberPorts;
+       __le32  ReservedGrowth[24];
+};
+#define AAC_FEATURE_FALCON     0x00000010
+#define AAC_SIS_VERSION_V3     3
+#define AAC_SIS_SLOT_UNKNOWN   0xFF
+
+#define GetBusInfo 0x00000009
+struct aac_bus_info {
+       __le32  Command;        /* VM_Ioctl */
+       __le32  ObjType;        /* FT_DRIVE */
+       __le32  MethodId;       /* 1 = SCSI Layer */
+       __le32  ObjectId;       /* Handle */
+       __le32  CtlCmd;         /* GetBusInfo */
+};
+
+struct aac_bus_info_response {
+       __le32  Status;         /* ST_OK */
+       __le32  ObjType;
+       __le32  MethodId;       /* unused */
+       __le32  ObjectId;       /* unused */
+       __le32  CtlCmd;         /* unused */
+       __le32  ProbeComplete;
+       __le32  BusCount;
+       __le32  TargetsPerBus;
+       u8      InitiatorBusId[10];
+       u8      BusValid[10];
+};
+
 /*
  * Battery platforms
  */
@@ -856,6 +938,12 @@ struct aac_dev
        int                     id;
 
        u16                     irq_mask;
+       /*
+        *      negotiated FIB settings
+        */
+       unsigned                max_fib_size;
+       unsigned                sg_tablesize;
+
        /*
         *      Map for 128 fib objects (64k)
         */     
@@ -895,6 +983,8 @@ struct aac_dev
 
        struct Scsi_Host        *scsi_host_ptr;
        int                     maximum_num_containers;
+       int                     maximum_num_physicals;
+       int                     maximum_num_channels;
        struct fsa_dev_info     *fsa_dev;
        pid_t                   thread_pid;
        int                     cardtype;
@@ -915,12 +1005,18 @@ struct aac_dev
        u32                     aif_thread;
        struct completion       aif_completion;
        struct aac_adapter_info adapter_info;
+       struct aac_supplement_adapter_info supplement_adapter_info;
        /* These are in adapter info but they are in the io flow so
         * lets break them out so we don't have to do an AND to check them
         */
        u8                      nondasd_support; 
        u8                      dac_support;
        u8                      raid_scsi_mode;
+       /* macro side-effects BEWARE */
+#      define                  raw_io_interface \
+         init->InitStructRevision==cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_4)
+       u8                      raw_io_64;
+       u8                      printf_enabled;
 };
 
 #define aac_adapter_interrupt(dev) \
@@ -929,6 +1025,11 @@ struct aac_dev
 #define aac_adapter_notify(dev, event) \
        (dev)->a_ops.adapter_notify(dev, event)
 
+#define aac_adapter_disable_int(dev) \
+       (dev)->a_ops.adapter_disable_int(dev)
+
+#define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \
+       (dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4)
 
 #define aac_adapter_check_health(dev) \
        (dev)->a_ops.adapter_check_health(dev)
@@ -1093,6 +1194,17 @@ struct aac_write_reply
        __le32          committed;
 };
 
+struct aac_raw_io
+{
+       __le32          block[2];
+       __le32          count;
+       __le16          cid;
+       __le16          flags;          /* 00 W, 01 R */
+       __le16          bpTotal;        /* reserved for F/W use */
+       __le16          bpComplete;     /* reserved for F/W use */
+       struct sgmapraw sg;
+};
+
 #define CT_FLUSH_CACHE 129
 struct aac_synchronize {
        __le32          command;        /* VM_ContainerConfig */
@@ -1133,7 +1245,7 @@ struct aac_srb
 };
 
 /*
- * This and assocated data structs are used by the 
+ * This and associated data structs are used by the
  * ioctl caller and are in cpu order.
  */
 struct user_aac_srb
@@ -1254,8 +1366,10 @@ struct aac_srb_reply
 #define                VM_CtBlockVerify64      18
 #define                VM_CtHostRead64         19
 #define                VM_CtHostWrite64        20
+#define                VM_DrvErrTblLog         21
+#define                VM_NameServe64          22
 
-#define                MAX_VMCOMMAND_NUM       21      /* used for sizing stats array - leave last */
+#define                MAX_VMCOMMAND_NUM       23      /* used for sizing stats array - leave last */
 
 /*
  *     Descriptive information (eg, vital stats)
@@ -1327,7 +1441,7 @@ struct aac_commit_config {
 };
 
 /*
- *     Query for Container Configuration Count
+ *     Query for Container Configuration Status
  */
 
 #define CT_GET_CONTAINER_COUNT 4
@@ -1364,6 +1478,7 @@ struct aac_mntent {
                                                   manager (eg, filesystem) */
        __le32                  altoid;         /* != oid <==> snapshot or 
                                                   broken mirror exists */
+       __le32                  capacityhigh;
 };
 
 #define FSCS_NOTCLEAN  0x0001  /* fsck is neccessary before mounting */
@@ -1445,11 +1560,12 @@ struct fib_ioctl
 
 struct revision
 {
-       u32 compat;
-       u32 version;
-       u32 build;
+       __le32 compat;
+       __le32 version;
+       __le32 build;
 };
        
+
 /*
  *     Ugly - non Linux like ioctl coding for back compat.
  */
@@ -1481,6 +1597,7 @@ struct revision
 #define FSACTL_GET_PCI_INFO                    CTL_CODE(2119, METHOD_BUFFERED)
 #define FSACTL_FORCE_DELETE_DISK               CTL_CODE(2120, METHOD_NEITHER)
 #define FSACTL_GET_CONTAINERS                  2131
+#define FSACTL_SEND_LARGE_FIB                  CTL_CODE(2138, METHOD_BUFFERED)
 
 
 struct aac_common
@@ -1597,6 +1714,7 @@ extern struct aac_common aac_config;
 #define                AifCmdJobProgress       2       /* Progress report */
 #define                        AifJobCtrZero   101     /* Array Zero progress */
 #define                        AifJobStsSuccess 1      /* Job completes */
+#define                        AifJobStsRunning 102    /* Job running */
 #define                AifCmdAPIReport         3       /* Report from other user of API */
 #define                AifCmdDriverNotify      4       /* Notify host driver of event */
 #define                        AifDenMorphComplete 200 /* A morph operation completed */
@@ -1667,3 +1785,7 @@ int fib_adapter_complete(struct fib * fibptr, unsigned short size);
 struct aac_driver_ident* aac_get_driver_ident(int devtype);
 int aac_get_adapter_info(struct aac_dev* dev);
 int aac_send_shutdown(struct aac_dev *dev);
+int probe_container(struct aac_dev *dev, int cid);
+extern int numacb;
+extern int acbsize;
+extern char aac_driver_version[];