Commit c6992781 authored by Mahesh Rajashekhara's avatar Mahesh Rajashekhara Committed by James Bottomley

aacraid: Enable 64bit write to controller register

If writeq() not supported, then do atomic two 32bit write
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Reviewed-by: default avatarMurthy Bhat <Murthy.Bhat@pmcs.com>
Reviewed-by: default avatarKarthikeya Sunkesula <Karthikeya.Sunkesula@pmcs.com>
Signed-off-by: default avatarMahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent 9022d375
...@@ -844,6 +844,10 @@ struct src_registers { ...@@ -844,6 +844,10 @@ struct src_registers {
&((AEP)->regs.src.bar0->CSR)) &((AEP)->regs.src.bar0->CSR))
#define src_writel(AEP, CSR, value) writel(value, \ #define src_writel(AEP, CSR, value) writel(value, \
&((AEP)->regs.src.bar0->CSR)) &((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_ODR_SHIFT 12
#define SRC_IDR_SHIFT 9 #define SRC_IDR_SHIFT 9
...@@ -1163,6 +1167,11 @@ struct aac_dev ...@@ -1163,6 +1167,11 @@ struct aac_dev
struct fsa_dev_info *fsa_dev; struct fsa_dev_info *fsa_dev;
struct task_struct *thread; struct task_struct *thread;
int cardtype; 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. * The following is the device specific extension.
......
...@@ -424,6 +424,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) ...@@ -424,6 +424,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
dev->management_fib_count = 0; dev->management_fib_count = 0;
spin_lock_init(&dev->manage_lock); spin_lock_init(&dev->manage_lock);
spin_lock_init(&dev->sync_lock); spin_lock_init(&dev->sync_lock);
spin_lock_init(&dev->iq_lock);
dev->max_fib_size = sizeof(struct hw_fib); dev->max_fib_size = sizeof(struct hw_fib);
dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
- sizeof(struct aac_fibhdr) - sizeof(struct aac_fibhdr)
......
...@@ -447,6 +447,10 @@ static int aac_src_deliver_message(struct fib *fib) ...@@ -447,6 +447,10 @@ static int aac_src_deliver_message(struct fib *fib)
u32 fibsize; u32 fibsize;
dma_addr_t address; dma_addr_t address;
struct aac_fib_xporthdr *pFibX; struct aac_fib_xporthdr *pFibX;
#if !defined(writeq)
unsigned long flags;
#endif
u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size); u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
atomic_inc(&q->numpending); atomic_inc(&q->numpending);
...@@ -511,10 +515,14 @@ static int aac_src_deliver_message(struct fib *fib) ...@@ -511,10 +515,14 @@ static int aac_src_deliver_message(struct fib *fib)
return -EINVAL; return -EINVAL;
address |= fibsize; 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_H, upper_32_bits(address) & 0xffffffff);
src_writel(dev, MUnit.IQ_L, address & 0xffffffff); src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
#endif
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment