aacraid: Enable 64bit write to controller register
authorMahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Fri, 28 Aug 2015 10:38:36 +0000 (06:38 -0400)
committerJames Bottomley <JBottomley@Odin.com>
Tue, 10 Nov 2015 00:01:29 +0000 (16:01 -0800)
If writeq() not supported, then do atomic two 32bit write

Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/src.c

index 62b0999..e54f597 100644 (file)
@@ -844,6 +844,10 @@ struct src_registers {
                                                &((AEP)->regs.src.bar0->CSR))
 #define src_writel(AEP, CSR, value)    writel(value, \
                                                &((AEP)->regs.src.bar0->CSR))
+#if defined(writeq)
+#define        src_writeq(AEP, CSR, value)     writeq(value, \
+                                               &((AEP)->regs.src.bar0->CSR))
+#endif
 
 #define SRC_ODR_SHIFT          12
 #define SRC_IDR_SHIFT          9
@@ -1163,6 +1167,11 @@ struct aac_dev
        struct fsa_dev_info     *fsa_dev;
        struct task_struct      *thread;
        int                     cardtype;
+       /*
+        *This lock will protect the two 32-bit
+        *writes to the Inbound Queue
+        */
+       spinlock_t              iq_lock;
 
        /*
         *      The following is the device specific extension.
index 45a0a04..b4b6088 100644 (file)
@@ -424,6 +424,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
        dev->management_fib_count = 0;
        spin_lock_init(&dev->manage_lock);
        spin_lock_init(&dev->sync_lock);
+       spin_lock_init(&dev->iq_lock);
        dev->max_fib_size = sizeof(struct hw_fib);
        dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
                - sizeof(struct aac_fibhdr)
index eb07b3d..1409a0b 100644 (file)
@@ -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;
 }