#define AAC_INT_MODE_MSI               (1<<1)
 #define AAC_INT_MODE_AIF               (1<<2)
 #define AAC_INT_MODE_SYNC              (1<<3)
+#define AAC_INT_MODE_MSIX              (1<<16)
 
 #define AAC_INT_ENABLE_TYPE1_INTX      0xfffffffb
 #define AAC_INT_ENABLE_TYPE1_MSIX      0xfffffffa
 
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/blkdev.h>
+#include <linux/delay.h>
 #include <linux/completion.h>
 #include <linux/mm.h>
 #include <scsi/scsi_host.h>
        .irq_mod = 1
 };
 
+static inline int aac_is_msix_mode(struct aac_dev *dev)
+{
+       u32 status;
+
+       status = src_readl(dev, MUnit.OMR);
+       return (status & AAC_INT_MODE_MSIX);
+}
+
+static inline void aac_change_to_intx(struct aac_dev *dev)
+{
+       aac_src_access_devreg(dev, AAC_DISABLE_MSIX);
+       aac_src_access_devreg(dev, AAC_ENABLE_INTX);
+}
+
 static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long commsize, unsigned long commalign)
 {
        unsigned char *base;
        dev->comm_interface = AAC_COMM_PRODUCER;
        dev->raw_io_interface = dev->raw_io_64 = 0;
 
+
+       /*
+        * Enable INTX mode, if not done already Enabled
+        */
+       if (aac_is_msix_mode(dev)) {
+               aac_change_to_intx(dev);
+               dev_info(&dev->pdev->dev, "Changed firmware to INTX mode");
+       }
+
        if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES,
                0, 0, 0, 0, 0, 0,
                status+0, status+1, status+2, status+3, NULL)) &&