aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>2015-08-28 06:38:36 -0400
committerJames Bottomley <JBottomley@Odin.com>2015-11-09 19:01:29 -0500
commitc6992781d9e8086d592f95870092a59042d111a2 (patch)
tree0d6dd0123e51a43d7bea3e5b7a8daa39d14d275c
parent9022d375bd22869ba3e5ad3635f00427cfb934fc (diff)
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>
-rw-r--r--drivers/scsi/aacraid/aacraid.h9
-rw-r--r--drivers/scsi/aacraid/comminit.c1
-rw-r--r--drivers/scsi/aacraid/src.c12
3 files changed, 20 insertions, 2 deletions
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 62b099940345..e54f597a058d 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -844,6 +844,10 @@ struct src_registers {
844 &((AEP)->regs.src.bar0->CSR)) 844 &((AEP)->regs.src.bar0->CSR))
845#define src_writel(AEP, CSR, value) writel(value, \ 845#define src_writel(AEP, CSR, value) writel(value, \
846 &((AEP)->regs.src.bar0->CSR)) 846 &((AEP)->regs.src.bar0->CSR))
847#if defined(writeq)
848#define src_writeq(AEP, CSR, value) writeq(value, \
849 &((AEP)->regs.src.bar0->CSR))
850#endif
847 851
848#define SRC_ODR_SHIFT 12 852#define SRC_ODR_SHIFT 12
849#define SRC_IDR_SHIFT 9 853#define SRC_IDR_SHIFT 9
@@ -1163,6 +1167,11 @@ struct aac_dev
1163 struct fsa_dev_info *fsa_dev; 1167 struct fsa_dev_info *fsa_dev;
1164 struct task_struct *thread; 1168 struct task_struct *thread;
1165 int cardtype; 1169 int cardtype;
1170 /*
1171 *This lock will protect the two 32-bit
1172 *writes to the Inbound Queue
1173 */
1174 spinlock_t iq_lock;
1166 1175
1167 /* 1176 /*
1168 * The following is the device specific extension. 1177 * The following is the device specific extension.
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
index 45a0a044dfdb..b4b6088fcb33 100644
--- a/drivers/scsi/aacraid/comminit.c
+++ b/drivers/scsi/aacraid/comminit.c
@@ -424,6 +424,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
424 dev->management_fib_count = 0; 424 dev->management_fib_count = 0;
425 spin_lock_init(&dev->manage_lock); 425 spin_lock_init(&dev->manage_lock);
426 spin_lock_init(&dev->sync_lock); 426 spin_lock_init(&dev->sync_lock);
427 spin_lock_init(&dev->iq_lock);
427 dev->max_fib_size = sizeof(struct hw_fib); 428 dev->max_fib_size = sizeof(struct hw_fib);
428 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size 429 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
429 - sizeof(struct aac_fibhdr) 430 - sizeof(struct aac_fibhdr)
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index eb07b3d4ed38..1409a0b945ea 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -447,6 +447,10 @@ static int aac_src_deliver_message(struct fib *fib)
447 u32 fibsize; 447 u32 fibsize;
448 dma_addr_t address; 448 dma_addr_t address;
449 struct aac_fib_xporthdr *pFibX; 449 struct aac_fib_xporthdr *pFibX;
450#if !defined(writeq)
451 unsigned long flags;
452#endif
453
450 u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size); 454 u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
451 455
452 atomic_inc(&q->numpending); 456 atomic_inc(&q->numpending);
@@ -511,10 +515,14 @@ static int aac_src_deliver_message(struct fib *fib)
511 return -EINVAL; 515 return -EINVAL;
512 address |= fibsize; 516 address |= fibsize;
513 } 517 }
514 518#if defined(writeq)
519 src_writeq(dev, MUnit.IQ_L, (u64)address);
520#else
521 spin_lock_irqsave(&fib->dev->iq_lock, flags);
515 src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff); 522 src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
516 src_writel(dev, MUnit.IQ_L, address & 0xffffffff); 523 src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
517 524 spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
525#endif
518 return 0; 526 return 0;
519} 527}
520 528