Upgrade to 4.4.50-rt62
[kvmfornfv.git] / kernel / drivers / scsi / aacraid / comminit.c
index 0e954e3..26d38b1 100644 (file)
@@ -37,6 +37,7 @@
 #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>
@@ -47,6 +48,24 @@ struct aac_common aac_config = {
        .irq_mod = 1
 };
 
+static inline int aac_is_msix_mode(struct aac_dev *dev)
+{
+       u32 status = 0;
+
+       if (dev->pdev->device == PMC_DEVICE_S6 ||
+               dev->pdev->device == PMC_DEVICE_S7 ||
+               dev->pdev->device == PMC_DEVICE_S8) {
+               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;
@@ -425,6 +444,15 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
        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)) &&