]>
Commit | Line | Data |
---|---|---|
1a119d1d DM |
1 | From c6992781d9e8086d592f95870092a59042d111a2 Mon Sep 17 00:00:00 2001 |
2 | From: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | |
3 | Date: Fri, 28 Aug 2015 06:38:36 -0400 | |
4 | Subject: aacraid: Enable 64bit write to controller register | |
5 | ||
6 | If writeq() not supported, then do atomic two 32bit write | |
7 | ||
8 | Reviewed-by: Tomas Henzl <thenzl@redhat.com> | |
9 | Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com> | |
10 | Reviewed-by: Karthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com> | |
11 | Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | |
12 | Signed-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 | ||
19 | diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h | |
20 | index 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. | |
46 | diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c | |
47 | index 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) | |
58 | diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c | |
59 | index 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 | -- | |
91 | cgit v0.11.2 | |
92 |