These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / scsi / aacraid / src.c
index 4596e9d..2aa34ea 100644 (file)
@@ -46,7 +46,7 @@
 
 static int aac_src_get_sync_status(struct aac_dev *dev);
 
-irqreturn_t aac_src_intr_message(int irq, void *dev_id)
+static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
 {
        struct aac_msix_ctx *ctx;
        struct aac_dev *dev;
@@ -447,6 +447,10 @@ static int aac_src_deliver_message(struct fib *fib)
        u32 fibsize;
        dma_addr_t address;
        struct aac_fib_xporthdr *pFibX;
+#if !defined(writeq)
+       unsigned long flags;
+#endif
+
        u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
 
        atomic_inc(&q->numpending);
@@ -511,10 +515,14 @@ static int aac_src_deliver_message(struct fib *fib)
                        return -EINVAL;
                address |= fibsize;
        }
-
+#if defined(writeq)
+       src_writeq(dev, MUnit.IQ_L, (u64)address);
+#else
+       spin_lock_irqsave(&fib->dev->iq_lock, flags);
        src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
        src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
-
+       spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
+#endif
        return 0;
 }
 
@@ -726,6 +734,7 @@ int aac_src_init(struct aac_dev *dev)
        dev->a_ops.adapter_sync_cmd = src_sync_cmd;
        dev->a_ops.adapter_check_health = aac_src_check_health;
        dev->a_ops.adapter_restart = aac_src_restart_adapter;
+       dev->a_ops.adapter_start = aac_src_start_adapter;
 
        /*
         *      First clear out all interrupts.  Then enable the one's that we
@@ -741,7 +750,7 @@ int aac_src_init(struct aac_dev *dev)
        if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
                goto error_iounmap;
 
-       dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
+       dev->msi = !pci_enable_msi(dev->pdev);
 
        dev->aac_msix[0].vector_no = 0;
        dev->aac_msix[0].dev = dev;
@@ -789,9 +798,7 @@ int aac_srcv_init(struct aac_dev *dev)
        unsigned long status;
        int restart = 0;
        int instance = dev->id;
-       int i, j;
        const char *name = dev->name;
-       int cpu;
 
        dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
        dev->a_ops.adapter_comm = aac_src_select_comm;
@@ -892,6 +899,7 @@ int aac_srcv_init(struct aac_dev *dev)
        dev->a_ops.adapter_sync_cmd = src_sync_cmd;
        dev->a_ops.adapter_check_health = aac_src_check_health;
        dev->a_ops.adapter_restart = aac_src_restart_adapter;
+       dev->a_ops.adapter_start = aac_src_start_adapter;
 
        /*
         *      First clear out all interrupts.  Then enable the one's that we
@@ -908,48 +916,10 @@ int aac_srcv_init(struct aac_dev *dev)
                goto error_iounmap;
        if (dev->msi_enabled)
                aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
-       if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
-               cpu = cpumask_first(cpu_online_mask);
-               for (i = 0; i < dev->max_msix; i++) {
-                       dev->aac_msix[i].vector_no = i;
-                       dev->aac_msix[i].dev = dev;
-
-                       if (request_irq(dev->msixentry[i].vector,
-                                       dev->a_ops.adapter_intr,
-                                       0,
-                                       "aacraid",
-                                       &(dev->aac_msix[i]))) {
-                               printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
-                                               name, instance, i);
-                               for (j = 0 ; j < i ; j++)
-                                       free_irq(dev->msixentry[j].vector,
-                                                &(dev->aac_msix[j]));
-                               pci_disable_msix(dev->pdev);
-                               goto error_iounmap;
-                       }
-                       if (irq_set_affinity_hint(
-                          dev->msixentry[i].vector,
-                          get_cpu_mask(cpu))) {
-                               printk(KERN_ERR "%s%d: Failed to set IRQ affinity for cpu %d\n",
-                                               name, instance, cpu);
-                       }
-                       cpu = cpumask_next(cpu, cpu_online_mask);
-               }
-       } else {
-               dev->aac_msix[0].vector_no = 0;
-               dev->aac_msix[0].dev = dev;
-
-               if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
-                               IRQF_SHARED,
-                               "aacraid",
-                               &(dev->aac_msix[0])) < 0) {
-                       if (dev->msi)
-                               pci_disable_msi(dev->pdev);
-                       printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
-                                       name, instance);
-                       goto error_iounmap;
-               }
-       }
+
+       if (aac_acquire_irq(dev))
+               goto error_iounmap;
+
        dev->dbg_base = dev->base_start;
        dev->dbg_base_mapped = dev->base;
        dev->dbg_size = dev->base_size;