]> git.proxmox.com Git - pve-kernel-jessie.git/blame - 0004-aacraid-enable-64bit-write.patch
readd override_for_missing_acs_capabilities patch
[pve-kernel-jessie.git] / 0004-aacraid-enable-64bit-write.patch
CommitLineData
1a119d1d
DM
1From c6992781d9e8086d592f95870092a59042d111a2 Mon Sep 17 00:00:00 2001
2From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
3Date: Fri, 28 Aug 2015 06:38:36 -0400
4Subject: aacraid: Enable 64bit write to controller register
5
6If writeq() not supported, then do atomic two 32bit write
7
8Reviewed-by: Tomas Henzl <thenzl@redhat.com>
9Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
10Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
11Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
12Signed-off-by: James Bottomley <JBottomley@Odin.com>
13---
14 drivers/scsi/aacraid/aacraid.h | 9 +++++++++
15 drivers/scsi/aacraid/comminit.c | 1 +
16 drivers/scsi/aacraid/src.c | 12 ++++++++++--
17 3 files changed, 20 insertions(+), 2 deletions(-)
18
19diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
20index 62b0999..e54f597 100644
21--- a/drivers/scsi/aacraid/aacraid.h
22+++ b/drivers/scsi/aacraid/aacraid.h
23@@ -844,6 +844,10 @@ struct src_registers {
24 &((AEP)->regs.src.bar0->CSR))
25 #define src_writel(AEP, CSR, value) writel(value, \
26 &((AEP)->regs.src.bar0->CSR))
27+#if defined(writeq)
28+#define src_writeq(AEP, CSR, value) writeq(value, \
29+ &((AEP)->regs.src.bar0->CSR))
30+#endif
31
32 #define SRC_ODR_SHIFT 12
33 #define SRC_IDR_SHIFT 9
34@@ -1163,6 +1167,11 @@ struct aac_dev
35 struct fsa_dev_info *fsa_dev;
36 struct task_struct *thread;
37 int cardtype;
38+ /*
39+ *This lock will protect the two 32-bit
40+ *writes to the Inbound Queue
41+ */
42+ spinlock_t iq_lock;
43
44 /*
45 * The following is the device specific extension.
46diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
47index 45a0a04..b4b6088 100644
48--- a/drivers/scsi/aacraid/comminit.c
49+++ b/drivers/scsi/aacraid/comminit.c
50@@ -424,6 +424,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
51 dev->management_fib_count = 0;
52 spin_lock_init(&dev->manage_lock);
53 spin_lock_init(&dev->sync_lock);
54+ spin_lock_init(&dev->iq_lock);
55 dev->max_fib_size = sizeof(struct hw_fib);
56 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
57 - sizeof(struct aac_fibhdr)
58diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
59index eb07b3d..1409a0b 100644
60--- a/drivers/scsi/aacraid/src.c
61+++ b/drivers/scsi/aacraid/src.c
62@@ -447,6 +447,10 @@ static int aac_src_deliver_message(struct fib *fib)
63 u32 fibsize;
64 dma_addr_t address;
65 struct aac_fib_xporthdr *pFibX;
66+#if !defined(writeq)
67+ unsigned long flags;
68+#endif
69+
70 u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
71
72 atomic_inc(&q->numpending);
73@@ -511,10 +515,14 @@ static int aac_src_deliver_message(struct fib *fib)
74 return -EINVAL;
75 address |= fibsize;
76 }
77-
78+#if defined(writeq)
79+ src_writeq(dev, MUnit.IQ_L, (u64)address);
80+#else
81+ spin_lock_irqsave(&fib->dev->iq_lock, flags);
82 src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
83 src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
84-
85+ spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
86+#endif
87 return 0;
88 }
89
90--
91cgit v0.11.2
92