mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-19 18:24:14 +08:00
aacraid: Enable 64bit write to controller register
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>
This commit is contained in:
parent
9022d375bd
commit
c6992781d9
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user