diff options
author | Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | 2015-08-28 06:38:36 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Odin.com> | 2015-11-09 19:01:29 -0500 |
commit | c6992781d9e8086d592f95870092a59042d111a2 (patch) | |
tree | 0d6dd0123e51a43d7bea3e5b7a8daa39d14d275c | |
parent | 9022d375bd22869ba3e5ad3635f00427cfb934fc (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.h | 9 | ||||
-rw-r--r-- | drivers/scsi/aacraid/comminit.c | 1 | ||||
-rw-r--r-- | drivers/scsi/aacraid/src.c | 12 |
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 | ||