aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChing Huang <ching2048@areca.com.tw>2014-08-19 03:14:14 -0400
committerChristoph Hellwig <hch@lst.de>2014-09-16 12:39:58 -0400
commit6e38adfc58406e7ea6f6701c49abaf046ce076a8 (patch)
tree52fed0d325f91c4ffa8553b1db3527bb1dd0272f
parent626fa32c801ed583594831051ff9fd56f2e6d261 (diff)
arcmsr: revise allocation of second dma_coherent_handle for type B
This modification is for consistency with upcoming adapter type D. Both adapter type B and D have similar H/W and S/W structure. Signed-off-by: Ching Huang <ching2048@areca.com.tw> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
-rw-r--r--drivers/scsi/arcmsr/arcmsr.h2
-rw-r--r--drivers/scsi/arcmsr/arcmsr_hba.c38
2 files changed, 26 insertions, 14 deletions
diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h
index 6d616beca439..83c0a7dbfef3 100644
--- a/drivers/scsi/arcmsr/arcmsr.h
+++ b/drivers/scsi/arcmsr/arcmsr.h
@@ -507,6 +507,7 @@ struct AdapterControlBlock
507 #define ACB_ADAPTER_TYPE_B 0x00000002 /* hbb M IOP */ 507 #define ACB_ADAPTER_TYPE_B 0x00000002 /* hbb M IOP */
508 #define ACB_ADAPTER_TYPE_C 0x00000004 /* hbc P IOP */ 508 #define ACB_ADAPTER_TYPE_C 0x00000004 /* hbc P IOP */
509 #define ACB_ADAPTER_TYPE_D 0x00000008 /* hbd A IOP */ 509 #define ACB_ADAPTER_TYPE_D 0x00000008 /* hbd A IOP */
510 u32 roundup_ccbsize;
510 struct pci_dev * pdev; 511 struct pci_dev * pdev;
511 struct Scsi_Host * host; 512 struct Scsi_Host * host;
512 unsigned long vir2phy_offset; 513 unsigned long vir2phy_offset;
@@ -563,6 +564,7 @@ struct AdapterControlBlock
563 dma_addr_t dma_coherent_handle; 564 dma_addr_t dma_coherent_handle;
564 /* dma_coherent_handle used for memory free */ 565 /* dma_coherent_handle used for memory free */
565 dma_addr_t dma_coherent_handle2; 566 dma_addr_t dma_coherent_handle2;
567 void *dma_coherent2;
566 unsigned int uncache_size; 568 unsigned int uncache_size;
567 uint8_t rqbuffer[ARCMSR_MAX_QBUFFER]; 569 uint8_t rqbuffer[ARCMSR_MAX_QBUFFER];
568 /* data collection buffer for read from 80331 */ 570 /* data collection buffer for read from 80331 */
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 725332364092..fc0dfbc70feb 100644
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -204,13 +204,10 @@ static struct pci_driver arcmsr_pci_driver = {
204static void arcmsr_free_mu(struct AdapterControlBlock *acb) 204static void arcmsr_free_mu(struct AdapterControlBlock *acb)
205{ 205{
206 switch (acb->adapter_type) { 206 switch (acb->adapter_type) {
207 case ACB_ADAPTER_TYPE_A:
208 case ACB_ADAPTER_TYPE_C:
209 break;
210 case ACB_ADAPTER_TYPE_B:{ 207 case ACB_ADAPTER_TYPE_B:{
211 dma_free_coherent(&acb->pdev->dev, 208 dma_free_coherent(&acb->pdev->dev, acb->roundup_ccbsize,
212 sizeof(struct MessageUnit_B), 209 acb->dma_coherent2, acb->dma_coherent_handle2);
213 acb->pmuB, acb->dma_coherent_handle2); 210 break;
214 } 211 }
215 } 212 }
216} 213}
@@ -2236,12 +2233,18 @@ static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
2236 char __iomem *iop_device_map; 2233 char __iomem *iop_device_map;
2237 /*firm_version,21,84-99*/ 2234 /*firm_version,21,84-99*/
2238 int count; 2235 int count;
2239 dma_coherent = dma_alloc_coherent(&pdev->dev, sizeof(struct MessageUnit_B), &dma_coherent_handle, GFP_KERNEL); 2236
2237 acb->roundup_ccbsize = roundup(sizeof(struct MessageUnit_B), 32);
2238 dma_coherent = dma_alloc_coherent(&pdev->dev, acb->roundup_ccbsize,
2239 &dma_coherent_handle, GFP_KERNEL);
2240 if (!dma_coherent){ 2240 if (!dma_coherent){
2241 printk(KERN_NOTICE "arcmsr%d: dma_alloc_coherent got error for hbb mu\n", acb->host->host_no); 2241 printk(KERN_NOTICE
2242 "arcmsr%d: dma_alloc_coherent got error for hbb mu\n",
2243 acb->host->host_no);
2242 return false; 2244 return false;
2243 } 2245 }
2244 acb->dma_coherent_handle2 = dma_coherent_handle; 2246 acb->dma_coherent_handle2 = dma_coherent_handle;
2247 acb->dma_coherent2 = dma_coherent;
2245 reg = (struct MessageUnit_B *)dma_coherent; 2248 reg = (struct MessageUnit_B *)dma_coherent;
2246 acb->pmuB = reg; 2249 acb->pmuB = reg;
2247 reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL); 2250 reg->drv2iop_doorbell= (uint32_t __iomem *)((unsigned long)acb->mem_base0 + ARCMSR_DRV2IOP_DOORBELL);
@@ -2589,6 +2592,7 @@ static int arcmsr_polling_ccbdone(struct AdapterControlBlock *acb,
2589static int arcmsr_iop_confirm(struct AdapterControlBlock *acb) 2592static int arcmsr_iop_confirm(struct AdapterControlBlock *acb)
2590{ 2593{
2591 uint32_t cdb_phyaddr, cdb_phyaddr_hi32; 2594 uint32_t cdb_phyaddr, cdb_phyaddr_hi32;
2595 dma_addr_t dma_coherent_handle;
2592 2596
2593 /* 2597 /*
2594 ******************************************************************** 2598 ********************************************************************
@@ -2596,8 +2600,16 @@ static int arcmsr_iop_confirm(struct AdapterControlBlock *acb)
2596 ** if freeccb.HighPart is not zero 2600 ** if freeccb.HighPart is not zero
2597 ******************************************************************** 2601 ********************************************************************
2598 */ 2602 */
2599 cdb_phyaddr = lower_32_bits(acb->dma_coherent_handle); 2603 switch (acb->adapter_type) {
2600 cdb_phyaddr_hi32 = upper_32_bits(acb->dma_coherent_handle); 2604 case ACB_ADAPTER_TYPE_B:
2605 dma_coherent_handle = acb->dma_coherent_handle2;
2606 break;
2607 default:
2608 dma_coherent_handle = acb->dma_coherent_handle;
2609 break;
2610 }
2611 cdb_phyaddr = lower_32_bits(dma_coherent_handle);
2612 cdb_phyaddr_hi32 = upper_32_bits(dma_coherent_handle);
2601 acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32; 2613 acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32;
2602 /* 2614 /*
2603 *********************************************************************** 2615 ***********************************************************************
@@ -2625,7 +2637,6 @@ static int arcmsr_iop_confirm(struct AdapterControlBlock *acb)
2625 break; 2637 break;
2626 2638
2627 case ACB_ADAPTER_TYPE_B: { 2639 case ACB_ADAPTER_TYPE_B: {
2628 unsigned long post_queue_phyaddr;
2629 uint32_t __iomem *rwbuffer; 2640 uint32_t __iomem *rwbuffer;
2630 2641
2631 struct MessageUnit_B *reg = acb->pmuB; 2642 struct MessageUnit_B *reg = acb->pmuB;
@@ -2637,16 +2648,15 @@ static int arcmsr_iop_confirm(struct AdapterControlBlock *acb)
2637 acb->host->host_no); 2648 acb->host->host_no);
2638 return 1; 2649 return 1;
2639 } 2650 }
2640 post_queue_phyaddr = acb->dma_coherent_handle2;
2641 rwbuffer = reg->message_rwbuffer; 2651 rwbuffer = reg->message_rwbuffer;
2642 /* driver "set config" signature */ 2652 /* driver "set config" signature */
2643 writel(ARCMSR_SIGNATURE_SET_CONFIG, rwbuffer++); 2653 writel(ARCMSR_SIGNATURE_SET_CONFIG, rwbuffer++);
2644 /* normal should be zero */ 2654 /* normal should be zero */
2645 writel(cdb_phyaddr_hi32, rwbuffer++); 2655 writel(cdb_phyaddr_hi32, rwbuffer++);
2646 /* postQ size (256 + 8)*4 */ 2656 /* postQ size (256 + 8)*4 */
2647 writel(post_queue_phyaddr, rwbuffer++); 2657 writel(cdb_phyaddr, rwbuffer++);
2648 /* doneQ size (256 + 8)*4 */ 2658 /* doneQ size (256 + 8)*4 */
2649 writel(post_queue_phyaddr + 1056, rwbuffer++); 2659 writel(cdb_phyaddr + 1056, rwbuffer++);
2650 /* ccb maxQ size must be --> [(256 + 8)*4]*/ 2660 /* ccb maxQ size must be --> [(256 + 8)*4]*/
2651 writel(1056, rwbuffer); 2661 writel(1056, rwbuffer);
2652 2662