diff options
author | Ching Huang <ching2048@areca.com.tw> | 2014-08-19 03:14:14 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-09-16 12:39:58 -0400 |
commit | 6e38adfc58406e7ea6f6701c49abaf046ce076a8 (patch) | |
tree | 52fed0d325f91c4ffa8553b1db3527bb1dd0272f | |
parent | 626fa32c801ed583594831051ff9fd56f2e6d261 (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.h | 2 | ||||
-rw-r--r-- | drivers/scsi/arcmsr/arcmsr_hba.c | 38 |
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 = { | |||
204 | static void arcmsr_free_mu(struct AdapterControlBlock *acb) | 204 | static 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, | |||
2589 | static int arcmsr_iop_confirm(struct AdapterControlBlock *acb) | 2592 | static 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 | ||