Lines Matching refs:acb

109 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb,
111 static int arcmsr_iop_confirm(struct AdapterControlBlock *acb);
123 static void arcmsr_iop_init(struct AdapterControlBlock *acb);
124 static void arcmsr_free_ccb_pool(struct AdapterControlBlock *acb);
125 static u32 arcmsr_disable_outbound_ints(struct AdapterControlBlock *acb);
126 static void arcmsr_enable_outbound_ints(struct AdapterControlBlock *acb,
128 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
129 static void arcmsr_hbaA_flush_cache(struct AdapterControlBlock *acb);
130 static void arcmsr_hbaB_flush_cache(struct AdapterControlBlock *acb);
133 static bool arcmsr_get_firmware_spec(struct AdapterControlBlock *acb);
134 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
136 static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb);
137 static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb);
138 static void arcmsr_hbaE_postqueue_isr(struct AdapterControlBlock *acb);
139 static void arcmsr_hbaF_postqueue_isr(struct AdapterControlBlock *acb);
140 static void arcmsr_hardware_reset(struct AdapterControlBlock *acb);
142 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
144 static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
244 static void arcmsr_free_io_queue(struct AdapterControlBlock *acb) in arcmsr_free_io_queue() argument
246 switch (acb->adapter_type) { in arcmsr_free_io_queue()
251 dma_free_coherent(&acb->pdev->dev, acb->ioqueue_size, in arcmsr_free_io_queue()
252 acb->dma_coherent2, acb->dma_coherent_handle2); in arcmsr_free_io_queue()
257 static bool arcmsr_remap_pciregion(struct AdapterControlBlock *acb) in arcmsr_remap_pciregion() argument
259 struct pci_dev *pdev = acb->pdev; in arcmsr_remap_pciregion()
260 switch (acb->adapter_type){ in arcmsr_remap_pciregion()
262 acb->pmuA = ioremap(pci_resource_start(pdev,0), pci_resource_len(pdev,0)); in arcmsr_remap_pciregion()
263 if (!acb->pmuA) { in arcmsr_remap_pciregion()
264 printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no); in arcmsr_remap_pciregion()
273 printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no); in arcmsr_remap_pciregion()
279 printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no); in arcmsr_remap_pciregion()
282 acb->mem_base0 = mem_base0; in arcmsr_remap_pciregion()
283 acb->mem_base1 = mem_base1; in arcmsr_remap_pciregion()
287 acb->pmuC = ioremap(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1)); in arcmsr_remap_pciregion()
288 if (!acb->pmuC) { in arcmsr_remap_pciregion()
289 printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no); in arcmsr_remap_pciregion()
292 if (readl(&acb->pmuC->outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) { in arcmsr_remap_pciregion()
293 …writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, &acb->pmuC->outbound_doorbell_clear);… in arcmsr_remap_pciregion()
307 acb->host->host_no); in arcmsr_remap_pciregion()
310 acb->mem_base0 = mem_base0; in arcmsr_remap_pciregion()
314 acb->pmuE = ioremap(pci_resource_start(pdev, 1), in arcmsr_remap_pciregion()
316 if (!acb->pmuE) { in arcmsr_remap_pciregion()
318 acb->host->host_no); in arcmsr_remap_pciregion()
321 writel(0, &acb->pmuE->host_int_status); /*clear interrupt*/ in arcmsr_remap_pciregion()
322 writel(ARCMSR_HBEMU_DOORBELL_SYNC, &acb->pmuE->iobound_doorbell); /* synchronize doorbell to 0 */ in arcmsr_remap_pciregion()
323 acb->in_doorbell = 0; in arcmsr_remap_pciregion()
324 acb->out_doorbell = 0; in arcmsr_remap_pciregion()
328 acb->pmuF = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); in arcmsr_remap_pciregion()
329 if (!acb->pmuF) { in arcmsr_remap_pciregion()
331 acb->host->host_no); in arcmsr_remap_pciregion()
334 writel(0, &acb->pmuF->host_int_status); /* clear interrupt */ in arcmsr_remap_pciregion()
335 writel(ARCMSR_HBFMU_DOORBELL_SYNC, &acb->pmuF->iobound_doorbell); in arcmsr_remap_pciregion()
336 acb->in_doorbell = 0; in arcmsr_remap_pciregion()
337 acb->out_doorbell = 0; in arcmsr_remap_pciregion()
344 static void arcmsr_unmap_pciregion(struct AdapterControlBlock *acb) in arcmsr_unmap_pciregion() argument
346 switch (acb->adapter_type) { in arcmsr_unmap_pciregion()
348 iounmap(acb->pmuA); in arcmsr_unmap_pciregion()
351 iounmap(acb->mem_base0); in arcmsr_unmap_pciregion()
352 iounmap(acb->mem_base1); in arcmsr_unmap_pciregion()
355 iounmap(acb->pmuC); in arcmsr_unmap_pciregion()
358 iounmap(acb->mem_base0); in arcmsr_unmap_pciregion()
361 iounmap(acb->pmuE); in arcmsr_unmap_pciregion()
364 iounmap(acb->pmuF); in arcmsr_unmap_pciregion()
372 struct AdapterControlBlock *acb = dev_id; in arcmsr_do_interrupt() local
374 handle_state = arcmsr_interrupt(acb); in arcmsr_do_interrupt()
401 static uint8_t arcmsr_hbaA_wait_msgint_ready(struct AdapterControlBlock *acb) in arcmsr_hbaA_wait_msgint_ready() argument
403 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_wait_msgint_ready()
419 static uint8_t arcmsr_hbaB_wait_msgint_ready(struct AdapterControlBlock *acb) in arcmsr_hbaB_wait_msgint_ready() argument
421 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_wait_msgint_ready()
492 static void arcmsr_hbaA_flush_cache(struct AdapterControlBlock *acb) in arcmsr_hbaA_flush_cache() argument
494 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_flush_cache()
498 if (arcmsr_hbaA_wait_msgint_ready(acb)) in arcmsr_hbaA_flush_cache()
503 timeout, retry count down = %d \n", acb->host->host_no, retry_count); in arcmsr_hbaA_flush_cache()
508 static void arcmsr_hbaB_flush_cache(struct AdapterControlBlock *acb) in arcmsr_hbaB_flush_cache() argument
510 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_flush_cache()
514 if (arcmsr_hbaB_wait_msgint_ready(acb)) in arcmsr_hbaB_flush_cache()
519 timeout,retry count down = %d \n", acb->host->host_no, retry_count); in arcmsr_hbaB_flush_cache()
577 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb) in arcmsr_flush_adapter_cache() argument
579 switch (acb->adapter_type) { in arcmsr_flush_adapter_cache()
582 arcmsr_hbaA_flush_cache(acb); in arcmsr_flush_adapter_cache()
585 arcmsr_hbaB_flush_cache(acb); in arcmsr_flush_adapter_cache()
588 arcmsr_hbaC_flush_cache(acb); in arcmsr_flush_adapter_cache()
591 arcmsr_hbaD_flush_cache(acb); in arcmsr_flush_adapter_cache()
595 arcmsr_hbaE_flush_cache(acb); in arcmsr_flush_adapter_cache()
600 static void arcmsr_hbaB_assign_regAddr(struct AdapterControlBlock *acb) in arcmsr_hbaB_assign_regAddr() argument
602 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_assign_regAddr()
604 if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) { in arcmsr_hbaB_assign_regAddr()
620 static void arcmsr_hbaD_assign_regAddr(struct AdapterControlBlock *acb) in arcmsr_hbaD_assign_regAddr() argument
622 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_hbaD_assign_regAddr()
652 static void arcmsr_hbaF_assign_regAddr(struct AdapterControlBlock *acb) in arcmsr_hbaF_assign_regAddr() argument
657 memset(acb->dma_coherent2, 0xff, acb->completeQ_size); in arcmsr_hbaF_assign_regAddr()
658 acb->message_wbuffer = (uint32_t *)round_up((unsigned long)acb->dma_coherent2 + in arcmsr_hbaF_assign_regAddr()
659 acb->completeQ_size, 4); in arcmsr_hbaF_assign_regAddr()
660 acb->message_rbuffer = ((void *)acb->message_wbuffer) + 0x100; in arcmsr_hbaF_assign_regAddr()
661 acb->msgcode_rwbuffer = ((void *)acb->message_wbuffer) + 0x200; in arcmsr_hbaF_assign_regAddr()
662 memset((void *)acb->message_wbuffer, 0, MESG_RW_BUFFER_SIZE); in arcmsr_hbaF_assign_regAddr()
663 host_buffer_dma = round_up(acb->dma_coherent_handle2 + acb->completeQ_size, 4); in arcmsr_hbaF_assign_regAddr()
664 pmuF = acb->pmuF; in arcmsr_hbaF_assign_regAddr()
673 static bool arcmsr_alloc_io_queue(struct AdapterControlBlock *acb) in arcmsr_alloc_io_queue() argument
678 struct pci_dev *pdev = acb->pdev; in arcmsr_alloc_io_queue()
680 switch (acb->adapter_type) { in arcmsr_alloc_io_queue()
682 acb->ioqueue_size = roundup(sizeof(struct MessageUnit_B), 32); in arcmsr_alloc_io_queue()
683 dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, in arcmsr_alloc_io_queue()
686 pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); in arcmsr_alloc_io_queue()
689 acb->dma_coherent_handle2 = dma_coherent_handle; in arcmsr_alloc_io_queue()
690 acb->dma_coherent2 = dma_coherent; in arcmsr_alloc_io_queue()
691 acb->pmuB = (struct MessageUnit_B *)dma_coherent; in arcmsr_alloc_io_queue()
692 arcmsr_hbaB_assign_regAddr(acb); in arcmsr_alloc_io_queue()
696 acb->ioqueue_size = roundup(sizeof(struct MessageUnit_D), 32); in arcmsr_alloc_io_queue()
697 dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, in arcmsr_alloc_io_queue()
700 pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); in arcmsr_alloc_io_queue()
703 acb->dma_coherent_handle2 = dma_coherent_handle; in arcmsr_alloc_io_queue()
704 acb->dma_coherent2 = dma_coherent; in arcmsr_alloc_io_queue()
705 acb->pmuD = (struct MessageUnit_D *)dma_coherent; in arcmsr_alloc_io_queue()
706 arcmsr_hbaD_assign_regAddr(acb); in arcmsr_alloc_io_queue()
712 acb->ioqueue_size = roundup(completeQ_size, 32); in arcmsr_alloc_io_queue()
713 dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, in arcmsr_alloc_io_queue()
716 pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); in arcmsr_alloc_io_queue()
719 acb->dma_coherent_handle2 = dma_coherent_handle; in arcmsr_alloc_io_queue()
720 acb->dma_coherent2 = dma_coherent; in arcmsr_alloc_io_queue()
721 acb->pCompletionQ = dma_coherent; in arcmsr_alloc_io_queue()
722 acb->completionQ_entry = acb->ioqueue_size / sizeof(struct deliver_completeQ); in arcmsr_alloc_io_queue()
723 acb->doneq_index = 0; in arcmsr_alloc_io_queue()
730 arcmsr_wait_firmware_ready(acb); in arcmsr_alloc_io_queue()
731 QueueDepth = depthTbl[readl(&acb->pmuF->outbound_msgaddr1) & 7]; in arcmsr_alloc_io_queue()
732 acb->completeQ_size = sizeof(struct deliver_completeQ) * QueueDepth + 128; in arcmsr_alloc_io_queue()
733 acb->ioqueue_size = roundup(acb->completeQ_size + MESG_RW_BUFFER_SIZE, 32); in arcmsr_alloc_io_queue()
734 dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, in arcmsr_alloc_io_queue()
737 pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); in arcmsr_alloc_io_queue()
740 acb->dma_coherent_handle2 = dma_coherent_handle; in arcmsr_alloc_io_queue()
741 acb->dma_coherent2 = dma_coherent; in arcmsr_alloc_io_queue()
742 acb->pCompletionQ = dma_coherent; in arcmsr_alloc_io_queue()
743 acb->completionQ_entry = acb->completeQ_size / sizeof(struct deliver_completeQ); in arcmsr_alloc_io_queue()
744 acb->doneq_index = 0; in arcmsr_alloc_io_queue()
745 arcmsr_hbaF_assign_regAddr(acb); in arcmsr_alloc_io_queue()
754 static int arcmsr_alloc_ccb_pool(struct AdapterControlBlock *acb) in arcmsr_alloc_ccb_pool() argument
756 struct pci_dev *pdev = acb->pdev; in arcmsr_alloc_ccb_pool()
769 acb->devstate[i][j] = ARECA_RAID_GONE; in arcmsr_alloc_ccb_pool()
773 firm_config_version = acb->firm_cfg_version; in arcmsr_alloc_ccb_pool()
778 acb->host->max_sectors = max_xfer_len/512; in arcmsr_alloc_ccb_pool()
779 acb->host->sg_tablesize = max_sg_entrys; in arcmsr_alloc_ccb_pool()
781 acb->uncache_size = roundup_ccbsize * acb->maxFreeCCB; in arcmsr_alloc_ccb_pool()
782 if (acb->adapter_type != ACB_ADAPTER_TYPE_F) in arcmsr_alloc_ccb_pool()
783 acb->uncache_size += acb->ioqueue_size; in arcmsr_alloc_ccb_pool()
784 dma_coherent = dma_alloc_coherent(&pdev->dev, acb->uncache_size, &dma_coherent_handle, GFP_KERNEL); in arcmsr_alloc_ccb_pool()
786 printk(KERN_NOTICE "arcmsr%d: dma_alloc_coherent got error\n", acb->host->host_no); in arcmsr_alloc_ccb_pool()
789 acb->dma_coherent = dma_coherent; in arcmsr_alloc_ccb_pool()
790 acb->dma_coherent_handle = dma_coherent_handle; in arcmsr_alloc_ccb_pool()
791 memset(dma_coherent, 0, acb->uncache_size); in arcmsr_alloc_ccb_pool()
792 acb->ccbsize = roundup_ccbsize; in arcmsr_alloc_ccb_pool()
795 acb->vir2phy_offset = (unsigned long)dma_coherent - (unsigned long)dma_coherent_handle; in arcmsr_alloc_ccb_pool()
796 for(i = 0; i < acb->maxFreeCCB; i++){ in arcmsr_alloc_ccb_pool()
798 switch (acb->adapter_type) { in arcmsr_alloc_ccb_pool()
810 acb->pccb_pool[i] = ccb_tmp; in arcmsr_alloc_ccb_pool()
811 ccb_tmp->acb = acb; in arcmsr_alloc_ccb_pool()
816 acb->maxFreeCCB = i; in arcmsr_alloc_ccb_pool()
817 acb->host->can_queue = i; in arcmsr_alloc_ccb_pool()
821 list_add_tail(&ccb_tmp->list, &acb->ccb_free_list); in arcmsr_alloc_ccb_pool()
825 if (acb->adapter_type != ACB_ADAPTER_TYPE_F) { in arcmsr_alloc_ccb_pool()
826 acb->dma_coherent_handle2 = dma_coherent_handle; in arcmsr_alloc_ccb_pool()
827 acb->dma_coherent2 = ccb_tmp; in arcmsr_alloc_ccb_pool()
829 switch (acb->adapter_type) { in arcmsr_alloc_ccb_pool()
831 acb->pmuB = (struct MessageUnit_B *)acb->dma_coherent2; in arcmsr_alloc_ccb_pool()
832 arcmsr_hbaB_assign_regAddr(acb); in arcmsr_alloc_ccb_pool()
835 acb->pmuD = (struct MessageUnit_D *)acb->dma_coherent2; in arcmsr_alloc_ccb_pool()
836 arcmsr_hbaD_assign_regAddr(acb); in arcmsr_alloc_ccb_pool()
839 acb->pCompletionQ = acb->dma_coherent2; in arcmsr_alloc_ccb_pool()
840 acb->completionQ_entry = acb->ioqueue_size / sizeof(struct deliver_completeQ); in arcmsr_alloc_ccb_pool()
841 acb->doneq_index = 0; in arcmsr_alloc_ccb_pool()
849 struct AdapterControlBlock *acb = container_of(work, in arcmsr_message_isr_bh_fn() local
851 char *acb_dev_map = (char *)acb->device_map; in arcmsr_message_isr_bh_fn()
858 switch (acb->adapter_type) { in arcmsr_message_isr_bh_fn()
860 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_message_isr_bh_fn()
867 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_message_isr_bh_fn()
874 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_message_isr_bh_fn()
881 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_message_isr_bh_fn()
888 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_message_isr_bh_fn()
895 signature = (uint32_t __iomem *)(&acb->msgcode_rwbuffer[0]); in arcmsr_message_isr_bh_fn()
896 devicemap = (char __iomem *)(&acb->msgcode_rwbuffer[21]); in arcmsr_message_isr_bh_fn()
912 scsi_add_device(acb->host, in arcmsr_message_isr_bh_fn()
916 psdev = scsi_device_lookup(acb->host, in arcmsr_message_isr_bh_fn()
930 acb->acb_flags &= ~ACB_F_MSG_GET_CONFIG; in arcmsr_message_isr_bh_fn()
934 arcmsr_request_irq(struct pci_dev *pdev, struct AdapterControlBlock *acb) in arcmsr_request_irq() argument
944 pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no); in arcmsr_request_irq()
962 acb->vector_count = nvec; in arcmsr_request_irq()
965 flags, "arcmsr", acb)) { in arcmsr_request_irq()
967 acb->host->host_no, pci_irq_vector(pdev, i)); in arcmsr_request_irq()
975 free_irq(pci_irq_vector(pdev, i), acb); in arcmsr_request_irq()
996 static int arcmsr_set_dma_mask(struct AdapterControlBlock *acb) in arcmsr_set_dma_mask() argument
998 struct pci_dev *pcidev = acb->pdev; in arcmsr_set_dma_mask()
1001 if (((acb->adapter_type == ACB_ADAPTER_TYPE_A) && !dma_mask_64) || in arcmsr_set_dma_mask()
1004 if (acb->adapter_type <= ACB_ADAPTER_TYPE_B) in arcmsr_set_dma_mask()
1026 struct AdapterControlBlock *acb; in arcmsr_probe() local
1040 acb = (struct AdapterControlBlock *) host->hostdata; in arcmsr_probe()
1041 memset(acb,0,sizeof(struct AdapterControlBlock)); in arcmsr_probe()
1042 acb->pdev = pdev; in arcmsr_probe()
1043 acb->adapter_type = id->driver_data; in arcmsr_probe()
1044 if (arcmsr_set_dma_mask(acb)) in arcmsr_probe()
1046 acb->host = host; in arcmsr_probe()
1064 spin_lock_init(&acb->eh_lock); in arcmsr_probe()
1065 spin_lock_init(&acb->ccblist_lock); in arcmsr_probe()
1066 spin_lock_init(&acb->postq_lock); in arcmsr_probe()
1067 spin_lock_init(&acb->doneq_lock); in arcmsr_probe()
1068 spin_lock_init(&acb->rqbuffer_lock); in arcmsr_probe()
1069 spin_lock_init(&acb->wqbuffer_lock); in arcmsr_probe()
1070 acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED | in arcmsr_probe()
1073 acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER; in arcmsr_probe()
1074 INIT_LIST_HEAD(&acb->ccb_free_list); in arcmsr_probe()
1075 error = arcmsr_remap_pciregion(acb); in arcmsr_probe()
1079 error = arcmsr_alloc_io_queue(acb); in arcmsr_probe()
1082 error = arcmsr_get_firmware_spec(acb); in arcmsr_probe()
1086 if (acb->adapter_type != ACB_ADAPTER_TYPE_F) in arcmsr_probe()
1087 arcmsr_free_io_queue(acb); in arcmsr_probe()
1088 error = arcmsr_alloc_ccb_pool(acb); in arcmsr_probe()
1096 if (arcmsr_request_irq(pdev, acb) == FAILED) in arcmsr_probe()
1098 arcmsr_iop_init(acb); in arcmsr_probe()
1099 arcmsr_init_get_devmap_timer(acb); in arcmsr_probe()
1101 arcmsr_init_set_datetime_timer(acb); in arcmsr_probe()
1102 if(arcmsr_alloc_sysfs_attr(acb)) in arcmsr_probe()
1108 del_timer_sync(&acb->refresh_timer); in arcmsr_probe()
1109 del_timer_sync(&acb->eternal_timer); in arcmsr_probe()
1110 flush_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_probe()
1111 arcmsr_stop_adapter_bgrb(acb); in arcmsr_probe()
1112 arcmsr_flush_adapter_cache(acb); in arcmsr_probe()
1113 arcmsr_free_irq(pdev, acb); in arcmsr_probe()
1117 arcmsr_free_ccb_pool(acb); in arcmsr_probe()
1120 arcmsr_free_io_queue(acb); in arcmsr_probe()
1122 arcmsr_unmap_pciregion(acb); in arcmsr_probe()
1133 struct AdapterControlBlock *acb) in arcmsr_free_irq() argument
1137 for (i = 0; i < acb->vector_count; i++) in arcmsr_free_irq()
1138 free_irq(pci_irq_vector(pdev, i), acb); in arcmsr_free_irq()
1146 struct AdapterControlBlock *acb = in arcmsr_suspend() local
1149 arcmsr_disable_outbound_ints(acb); in arcmsr_suspend()
1150 arcmsr_free_irq(pdev, acb); in arcmsr_suspend()
1151 del_timer_sync(&acb->eternal_timer); in arcmsr_suspend()
1153 del_timer_sync(&acb->refresh_timer); in arcmsr_suspend()
1154 flush_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_suspend()
1155 arcmsr_stop_adapter_bgrb(acb); in arcmsr_suspend()
1156 arcmsr_flush_adapter_cache(acb); in arcmsr_suspend()
1164 struct AdapterControlBlock *acb = in arcmsr_resume() local
1167 if (arcmsr_set_dma_mask(acb)) in arcmsr_resume()
1169 if (arcmsr_request_irq(pdev, acb) == FAILED) in arcmsr_resume()
1171 switch (acb->adapter_type) { in arcmsr_resume()
1173 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_resume()
1184 writel(0, &acb->pmuE->host_int_status); in arcmsr_resume()
1185 writel(ARCMSR_HBEMU_DOORBELL_SYNC, &acb->pmuE->iobound_doorbell); in arcmsr_resume()
1186 acb->in_doorbell = 0; in arcmsr_resume()
1187 acb->out_doorbell = 0; in arcmsr_resume()
1188 acb->doneq_index = 0; in arcmsr_resume()
1191 writel(0, &acb->pmuF->host_int_status); in arcmsr_resume()
1192 writel(ARCMSR_HBFMU_DOORBELL_SYNC, &acb->pmuF->iobound_doorbell); in arcmsr_resume()
1193 acb->in_doorbell = 0; in arcmsr_resume()
1194 acb->out_doorbell = 0; in arcmsr_resume()
1195 acb->doneq_index = 0; in arcmsr_resume()
1196 arcmsr_hbaF_assign_regAddr(acb); in arcmsr_resume()
1199 arcmsr_iop_init(acb); in arcmsr_resume()
1200 arcmsr_init_get_devmap_timer(acb); in arcmsr_resume()
1202 arcmsr_init_set_datetime_timer(acb); in arcmsr_resume()
1205 arcmsr_stop_adapter_bgrb(acb); in arcmsr_resume()
1206 arcmsr_flush_adapter_cache(acb); in arcmsr_resume()
1209 arcmsr_free_ccb_pool(acb); in arcmsr_resume()
1210 if (acb->adapter_type == ACB_ADAPTER_TYPE_F) in arcmsr_resume()
1211 arcmsr_free_io_queue(acb); in arcmsr_resume()
1212 arcmsr_unmap_pciregion(acb); in arcmsr_resume()
1217 static uint8_t arcmsr_hbaA_abort_allcmd(struct AdapterControlBlock *acb) in arcmsr_hbaA_abort_allcmd() argument
1219 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_abort_allcmd()
1221 if (!arcmsr_hbaA_wait_msgint_ready(acb)) { in arcmsr_hbaA_abort_allcmd()
1224 , acb->host->host_no); in arcmsr_hbaA_abort_allcmd()
1230 static uint8_t arcmsr_hbaB_abort_allcmd(struct AdapterControlBlock *acb) in arcmsr_hbaB_abort_allcmd() argument
1232 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_abort_allcmd()
1235 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_hbaB_abort_allcmd()
1238 , acb->host->host_no); in arcmsr_hbaB_abort_allcmd()
1285 static uint8_t arcmsr_abort_allcmd(struct AdapterControlBlock *acb) in arcmsr_abort_allcmd() argument
1288 switch (acb->adapter_type) { in arcmsr_abort_allcmd()
1290 rtnval = arcmsr_hbaA_abort_allcmd(acb); in arcmsr_abort_allcmd()
1293 rtnval = arcmsr_hbaB_abort_allcmd(acb); in arcmsr_abort_allcmd()
1296 rtnval = arcmsr_hbaC_abort_allcmd(acb); in arcmsr_abort_allcmd()
1299 rtnval = arcmsr_hbaD_abort_allcmd(acb); in arcmsr_abort_allcmd()
1303 rtnval = arcmsr_hbaE_abort_allcmd(acb); in arcmsr_abort_allcmd()
1311 struct AdapterControlBlock *acb = ccb->acb; in arcmsr_ccb_complete() local
1314 atomic_dec(&acb->ccboutstandingcount); in arcmsr_ccb_complete()
1317 spin_lock_irqsave(&acb->ccblist_lock, flags); in arcmsr_ccb_complete()
1318 list_add_tail(&ccb->list, &acb->ccb_free_list); in arcmsr_ccb_complete()
1319 spin_unlock_irqrestore(&acb->ccblist_lock, flags); in arcmsr_ccb_complete()
1343 static u32 arcmsr_disable_outbound_ints(struct AdapterControlBlock *acb) in arcmsr_disable_outbound_ints() argument
1346 switch (acb->adapter_type) { in arcmsr_disable_outbound_ints()
1348 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_disable_outbound_ints()
1355 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_disable_outbound_ints()
1361 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_disable_outbound_ints()
1368 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_disable_outbound_ints()
1375 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_disable_outbound_ints()
1385 static void arcmsr_report_ccb_state(struct AdapterControlBlock *acb, in arcmsr_report_ccb_state() argument
1392 if (acb->devstate[id][lun] == ARECA_RAID_GONE) in arcmsr_report_ccb_state()
1393 acb->devstate[id][lun] = ARECA_RAID_GOOD; in arcmsr_report_ccb_state()
1399 acb->devstate[id][lun] = ARECA_RAID_GONE; in arcmsr_report_ccb_state()
1408 acb->devstate[id][lun] = ARECA_RAID_GONE; in arcmsr_report_ccb_state()
1415 acb->devstate[id][lun] = ARECA_RAID_GOOD; in arcmsr_report_ccb_state()
1425 , acb->host->host_no in arcmsr_report_ccb_state()
1429 acb->devstate[id][lun] = ARECA_RAID_GONE; in arcmsr_report_ccb_state()
1437 static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, struct CommandControlBlock *pCC… in arcmsr_drain_donequeue() argument
1439 if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) { in arcmsr_drain_donequeue()
1446 acb->host->host_no, pCCB); in arcmsr_drain_donequeue()
1454 , acb->host->host_no in arcmsr_drain_donequeue()
1455 , acb in arcmsr_drain_donequeue()
1457 , pCCB->acb in arcmsr_drain_donequeue()
1459 , atomic_read(&acb->ccboutstandingcount)); in arcmsr_drain_donequeue()
1462 arcmsr_report_ccb_state(acb, pCCB, error); in arcmsr_drain_donequeue()
1465 static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb) in arcmsr_done4abort_postqueue() argument
1474 switch (acb->adapter_type) { in arcmsr_done4abort_postqueue()
1477 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_done4abort_postqueue()
1480 acb->outbound_int_enable; in arcmsr_done4abort_postqueue()
1484 && (i++ < acb->maxOutstanding)) { in arcmsr_done4abort_postqueue()
1486 if (acb->cdb_phyadd_hipart) in arcmsr_done4abort_postqueue()
1487 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_done4abort_postqueue()
1488 pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); in arcmsr_done4abort_postqueue()
1491 arcmsr_drain_donequeue(acb, pCCB, error); in arcmsr_done4abort_postqueue()
1497 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_done4abort_postqueue()
1505 if (acb->cdb_phyadd_hipart) in arcmsr_done4abort_postqueue()
1506 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_done4abort_postqueue()
1507 pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); in arcmsr_done4abort_postqueue()
1510 arcmsr_drain_donequeue(acb, pCCB, error); in arcmsr_done4abort_postqueue()
1519 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_done4abort_postqueue()
1520 …while ((readl(&reg->host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < acb->maxOuts… in arcmsr_done4abort_postqueue()
1524 if (acb->cdb_phyadd_hipart) in arcmsr_done4abort_postqueue()
1525 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_done4abort_postqueue()
1526 pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); in arcmsr_done4abort_postqueue()
1529 arcmsr_drain_donequeue(acb, pCCB, error); in arcmsr_done4abort_postqueue()
1534 struct MessageUnit_D *pmu = acb->pmuD; in arcmsr_done4abort_postqueue()
1539 residual = atomic_read(&acb->ccboutstandingcount); in arcmsr_done4abort_postqueue()
1541 spin_lock_irqsave(&acb->doneq_lock, flags); in arcmsr_done4abort_postqueue()
1553 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_done4abort_postqueue()
1557 if (acb->cdb_phyadd_hipart) in arcmsr_done4abort_postqueue()
1558 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_done4abort_postqueue()
1560 (acb->vir2phy_offset + ccb_cdb_phy); in arcmsr_done4abort_postqueue()
1566 arcmsr_drain_donequeue(acb, pCCB, error); in arcmsr_done4abort_postqueue()
1570 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_done4abort_postqueue()
1579 arcmsr_hbaE_postqueue_isr(acb); in arcmsr_done4abort_postqueue()
1582 arcmsr_hbaF_postqueue_isr(acb); in arcmsr_done4abort_postqueue()
1587 static void arcmsr_remove_scsi_devices(struct AdapterControlBlock *acb) in arcmsr_remove_scsi_devices() argument
1589 char *acb_dev_map = (char *)acb->device_map; in arcmsr_remove_scsi_devices()
1595 for (i = 0; i < acb->maxFreeCCB; i++) { in arcmsr_remove_scsi_devices()
1596 ccb = acb->pccb_pool[i]; in arcmsr_remove_scsi_devices()
1608 psdev = scsi_device_lookup(acb->host, in arcmsr_remove_scsi_devices()
1623 static void arcmsr_free_pcidev(struct AdapterControlBlock *acb) in arcmsr_free_pcidev() argument
1628 host = acb->host; in arcmsr_free_pcidev()
1629 arcmsr_free_sysfs_attr(acb); in arcmsr_free_pcidev()
1631 flush_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_free_pcidev()
1632 del_timer_sync(&acb->eternal_timer); in arcmsr_free_pcidev()
1634 del_timer_sync(&acb->refresh_timer); in arcmsr_free_pcidev()
1635 pdev = acb->pdev; in arcmsr_free_pcidev()
1636 arcmsr_free_irq(pdev, acb); in arcmsr_free_pcidev()
1637 arcmsr_free_ccb_pool(acb); in arcmsr_free_pcidev()
1638 if (acb->adapter_type == ACB_ADAPTER_TYPE_F) in arcmsr_free_pcidev()
1639 arcmsr_free_io_queue(acb); in arcmsr_free_pcidev()
1640 arcmsr_unmap_pciregion(acb); in arcmsr_free_pcidev()
1649 struct AdapterControlBlock *acb = in arcmsr_remove() local
1656 acb->acb_flags &= ~ACB_F_IOP_INITED; in arcmsr_remove()
1657 acb->acb_flags |= ACB_F_ADAPTER_REMOVED; in arcmsr_remove()
1658 arcmsr_remove_scsi_devices(acb); in arcmsr_remove()
1659 arcmsr_free_pcidev(acb); in arcmsr_remove()
1662 arcmsr_free_sysfs_attr(acb); in arcmsr_remove()
1664 flush_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_remove()
1665 del_timer_sync(&acb->eternal_timer); in arcmsr_remove()
1667 del_timer_sync(&acb->refresh_timer); in arcmsr_remove()
1668 arcmsr_disable_outbound_ints(acb); in arcmsr_remove()
1669 arcmsr_stop_adapter_bgrb(acb); in arcmsr_remove()
1670 arcmsr_flush_adapter_cache(acb); in arcmsr_remove()
1671 acb->acb_flags |= ACB_F_SCSISTOPADAPTER; in arcmsr_remove()
1672 acb->acb_flags &= ~ACB_F_IOP_INITED; in arcmsr_remove()
1674 for (poll_count = 0; poll_count < acb->maxOutstanding; poll_count++){ in arcmsr_remove()
1675 if (!atomic_read(&acb->ccboutstandingcount)) in arcmsr_remove()
1677 arcmsr_interrupt(acb);/* FIXME: need spinlock */ in arcmsr_remove()
1681 if (atomic_read(&acb->ccboutstandingcount)) { in arcmsr_remove()
1684 arcmsr_abort_allcmd(acb); in arcmsr_remove()
1685 arcmsr_done4abort_postqueue(acb); in arcmsr_remove()
1686 for (i = 0; i < acb->maxFreeCCB; i++) { in arcmsr_remove()
1687 struct CommandControlBlock *ccb = acb->pccb_pool[i]; in arcmsr_remove()
1695 arcmsr_free_irq(pdev, acb); in arcmsr_remove()
1696 arcmsr_free_ccb_pool(acb); in arcmsr_remove()
1697 if (acb->adapter_type == ACB_ADAPTER_TYPE_F) in arcmsr_remove()
1698 arcmsr_free_io_queue(acb); in arcmsr_remove()
1699 arcmsr_unmap_pciregion(acb); in arcmsr_remove()
1708 struct AdapterControlBlock *acb = in arcmsr_shutdown() local
1710 if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) in arcmsr_shutdown()
1712 del_timer_sync(&acb->eternal_timer); in arcmsr_shutdown()
1714 del_timer_sync(&acb->refresh_timer); in arcmsr_shutdown()
1715 arcmsr_disable_outbound_ints(acb); in arcmsr_shutdown()
1716 arcmsr_free_irq(pdev, acb); in arcmsr_shutdown()
1717 flush_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_shutdown()
1718 arcmsr_stop_adapter_bgrb(acb); in arcmsr_shutdown()
1719 arcmsr_flush_adapter_cache(acb); in arcmsr_shutdown()
1736 static void arcmsr_enable_outbound_ints(struct AdapterControlBlock *acb, in arcmsr_enable_outbound_ints() argument
1740 switch (acb->adapter_type) { in arcmsr_enable_outbound_ints()
1743 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_enable_outbound_ints()
1748 acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff; in arcmsr_enable_outbound_ints()
1753 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_enable_outbound_ints()
1759 acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f; in arcmsr_enable_outbound_ints()
1763 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_enable_outbound_ints()
1766 acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f; in arcmsr_enable_outbound_ints()
1770 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_enable_outbound_ints()
1778 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_enable_outbound_ints()
1787 static int arcmsr_build_ccb(struct AdapterControlBlock *acb, in arcmsr_build_ccb() argument
1807 if (unlikely(nseg > acb->host->sg_tablesize || nseg < 0)) in arcmsr_build_ccb()
1842 static void arcmsr_post_ccb(struct AdapterControlBlock *acb, struct CommandControlBlock *ccb) in arcmsr_post_ccb() argument
1846 atomic_inc(&acb->ccboutstandingcount); in arcmsr_post_ccb()
1848 switch (acb->adapter_type) { in arcmsr_post_ccb()
1850 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_post_ccb()
1861 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_post_ccb()
1879 struct MessageUnit_C __iomem *phbcmu = acb->pmuC; in arcmsr_post_ccb()
1889 struct MessageUnit_D *pmu = acb->pmuD; in arcmsr_post_ccb()
1895 spin_lock_irqsave(&acb->postq_lock, flags); in arcmsr_post_ccb()
1908 spin_unlock_irqrestore(&acb->postq_lock, flags); in arcmsr_post_ccb()
1912 struct MessageUnit_E __iomem *pmu = acb->pmuE; in arcmsr_post_ccb()
1922 struct MessageUnit_F __iomem *pmu = acb->pmuF; in arcmsr_post_ccb()
1941 static void arcmsr_hbaA_stop_bgrb(struct AdapterControlBlock *acb) in arcmsr_hbaA_stop_bgrb() argument
1943 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_stop_bgrb()
1944 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_hbaA_stop_bgrb()
1946 if (!arcmsr_hbaA_wait_msgint_ready(acb)) { in arcmsr_hbaA_stop_bgrb()
1949 , acb->host->host_no); in arcmsr_hbaA_stop_bgrb()
1953 static void arcmsr_hbaB_stop_bgrb(struct AdapterControlBlock *acb) in arcmsr_hbaB_stop_bgrb() argument
1955 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_stop_bgrb()
1956 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_hbaB_stop_bgrb()
1959 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_hbaB_stop_bgrb()
1962 , acb->host->host_no); in arcmsr_hbaB_stop_bgrb()
2005 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb) in arcmsr_stop_adapter_bgrb() argument
2007 switch (acb->adapter_type) { in arcmsr_stop_adapter_bgrb()
2009 arcmsr_hbaA_stop_bgrb(acb); in arcmsr_stop_adapter_bgrb()
2012 arcmsr_hbaB_stop_bgrb(acb); in arcmsr_stop_adapter_bgrb()
2015 arcmsr_hbaC_stop_bgrb(acb); in arcmsr_stop_adapter_bgrb()
2018 arcmsr_hbaD_stop_bgrb(acb); in arcmsr_stop_adapter_bgrb()
2022 arcmsr_hbaE_stop_bgrb(acb); in arcmsr_stop_adapter_bgrb()
2027 static void arcmsr_free_ccb_pool(struct AdapterControlBlock *acb) in arcmsr_free_ccb_pool() argument
2029 dma_free_coherent(&acb->pdev->dev, acb->uncache_size, acb->dma_coherent, acb->dma_coherent_handle); in arcmsr_free_ccb_pool()
2032 static void arcmsr_iop_message_read(struct AdapterControlBlock *acb) in arcmsr_iop_message_read() argument
2034 switch (acb->adapter_type) { in arcmsr_iop_message_read()
2036 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_iop_message_read()
2041 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_iop_message_read()
2046 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_iop_message_read()
2052 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_iop_message_read()
2059 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_iop_message_read()
2060 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK; in arcmsr_iop_message_read()
2061 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_iop_message_read()
2067 static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb) in arcmsr_iop_message_wrote() argument
2069 switch (acb->adapter_type) { in arcmsr_iop_message_wrote()
2071 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_iop_message_wrote()
2081 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_iop_message_wrote()
2090 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_iop_message_wrote()
2099 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_iop_message_wrote()
2106 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_iop_message_wrote()
2107 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK; in arcmsr_iop_message_wrote()
2108 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_iop_message_wrote()
2114 struct QBUFFER __iomem *arcmsr_get_iop_rqbuffer(struct AdapterControlBlock *acb) in arcmsr_get_iop_rqbuffer() argument
2117 switch (acb->adapter_type) { in arcmsr_get_iop_rqbuffer()
2120 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_get_iop_rqbuffer()
2125 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_get_iop_rqbuffer()
2130 struct MessageUnit_C __iomem *phbcmu = acb->pmuC; in arcmsr_get_iop_rqbuffer()
2135 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_get_iop_rqbuffer()
2140 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_get_iop_rqbuffer()
2145 qbuffer = (struct QBUFFER __iomem *)acb->message_rbuffer; in arcmsr_get_iop_rqbuffer()
2152 static struct QBUFFER __iomem *arcmsr_get_iop_wqbuffer(struct AdapterControlBlock *acb) in arcmsr_get_iop_wqbuffer() argument
2155 switch (acb->adapter_type) { in arcmsr_get_iop_wqbuffer()
2158 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_get_iop_wqbuffer()
2163 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_get_iop_wqbuffer()
2168 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_get_iop_wqbuffer()
2173 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_get_iop_wqbuffer()
2178 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_get_iop_wqbuffer()
2183 pqbuffer = (struct QBUFFER __iomem *)acb->message_wbuffer; in arcmsr_get_iop_wqbuffer()
2190 arcmsr_Read_iop_rqbuffer_in_DWORD(struct AdapterControlBlock *acb, in arcmsr_Read_iop_rqbuffer_in_DWORD() argument
2216 pQbuffer = &acb->rqbuffer[acb->rqbuf_putIndex]; in arcmsr_Read_iop_rqbuffer_in_DWORD()
2218 acb->rqbuf_putIndex++; in arcmsr_Read_iop_rqbuffer_in_DWORD()
2220 acb->rqbuf_putIndex %= ARCMSR_MAX_QBUFFER; in arcmsr_Read_iop_rqbuffer_in_DWORD()
2226 arcmsr_iop_message_read(acb); in arcmsr_Read_iop_rqbuffer_in_DWORD()
2231 arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb, in arcmsr_Read_iop_rqbuffer_data() argument
2238 if (acb->adapter_type > ACB_ADAPTER_TYPE_B) in arcmsr_Read_iop_rqbuffer_data()
2239 return arcmsr_Read_iop_rqbuffer_in_DWORD(acb, prbuffer); in arcmsr_Read_iop_rqbuffer_data()
2243 pQbuffer = &acb->rqbuffer[acb->rqbuf_putIndex]; in arcmsr_Read_iop_rqbuffer_data()
2245 acb->rqbuf_putIndex++; in arcmsr_Read_iop_rqbuffer_data()
2246 acb->rqbuf_putIndex %= ARCMSR_MAX_QBUFFER; in arcmsr_Read_iop_rqbuffer_data()
2250 arcmsr_iop_message_read(acb); in arcmsr_Read_iop_rqbuffer_data()
2254 static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb) in arcmsr_iop2drv_data_wrote_handle() argument
2260 spin_lock_irqsave(&acb->rqbuffer_lock, flags); in arcmsr_iop2drv_data_wrote_handle()
2261 prbuffer = arcmsr_get_iop_rqbuffer(acb); in arcmsr_iop2drv_data_wrote_handle()
2262 if (acb->rqbuf_putIndex >= acb->rqbuf_getIndex) { in arcmsr_iop2drv_data_wrote_handle()
2264 (acb->rqbuf_putIndex - acb->rqbuf_getIndex); in arcmsr_iop2drv_data_wrote_handle()
2266 buf_empty_len = acb->rqbuf_getIndex - acb->rqbuf_putIndex - 1; in arcmsr_iop2drv_data_wrote_handle()
2268 if (arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0) in arcmsr_iop2drv_data_wrote_handle()
2269 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop2drv_data_wrote_handle()
2271 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop2drv_data_wrote_handle()
2272 spin_unlock_irqrestore(&acb->rqbuffer_lock, flags); in arcmsr_iop2drv_data_wrote_handle()
2275 static void arcmsr_write_ioctldata2iop_in_DWORD(struct AdapterControlBlock *acb) in arcmsr_write_ioctldata2iop_in_DWORD() argument
2283 if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READED) { in arcmsr_write_ioctldata2iop_in_DWORD()
2289 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READED); in arcmsr_write_ioctldata2iop_in_DWORD()
2290 pwbuffer = arcmsr_get_iop_wqbuffer(acb); in arcmsr_write_ioctldata2iop_in_DWORD()
2292 while ((acb->wqbuf_getIndex != acb->wqbuf_putIndex) in arcmsr_write_ioctldata2iop_in_DWORD()
2294 pQbuffer = &acb->wqbuffer[acb->wqbuf_getIndex]; in arcmsr_write_ioctldata2iop_in_DWORD()
2296 acb->wqbuf_getIndex++; in arcmsr_write_ioctldata2iop_in_DWORD()
2297 acb->wqbuf_getIndex %= ARCMSR_MAX_QBUFFER; in arcmsr_write_ioctldata2iop_in_DWORD()
2315 arcmsr_iop_message_wrote(acb); in arcmsr_write_ioctldata2iop_in_DWORD()
2320 arcmsr_write_ioctldata2iop(struct AdapterControlBlock *acb) in arcmsr_write_ioctldata2iop() argument
2327 if (acb->adapter_type > ACB_ADAPTER_TYPE_B) { in arcmsr_write_ioctldata2iop()
2328 arcmsr_write_ioctldata2iop_in_DWORD(acb); in arcmsr_write_ioctldata2iop()
2331 if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READED) { in arcmsr_write_ioctldata2iop()
2332 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READED); in arcmsr_write_ioctldata2iop()
2333 pwbuffer = arcmsr_get_iop_wqbuffer(acb); in arcmsr_write_ioctldata2iop()
2335 while ((acb->wqbuf_getIndex != acb->wqbuf_putIndex) in arcmsr_write_ioctldata2iop()
2337 pQbuffer = &acb->wqbuffer[acb->wqbuf_getIndex]; in arcmsr_write_ioctldata2iop()
2339 acb->wqbuf_getIndex++; in arcmsr_write_ioctldata2iop()
2340 acb->wqbuf_getIndex %= ARCMSR_MAX_QBUFFER; in arcmsr_write_ioctldata2iop()
2345 arcmsr_iop_message_wrote(acb); in arcmsr_write_ioctldata2iop()
2349 static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb) in arcmsr_iop2drv_data_read_handle() argument
2353 spin_lock_irqsave(&acb->wqbuffer_lock, flags); in arcmsr_iop2drv_data_read_handle()
2354 acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READED; in arcmsr_iop2drv_data_read_handle()
2355 if (acb->wqbuf_getIndex != acb->wqbuf_putIndex) in arcmsr_iop2drv_data_read_handle()
2356 arcmsr_write_ioctldata2iop(acb); in arcmsr_iop2drv_data_read_handle()
2357 if (acb->wqbuf_getIndex == acb->wqbuf_putIndex) in arcmsr_iop2drv_data_read_handle()
2358 acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED; in arcmsr_iop2drv_data_read_handle()
2359 spin_unlock_irqrestore(&acb->wqbuffer_lock, flags); in arcmsr_iop2drv_data_read_handle()
2362 static void arcmsr_hbaA_doorbell_isr(struct AdapterControlBlock *acb) in arcmsr_hbaA_doorbell_isr() argument
2365 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_doorbell_isr()
2370 arcmsr_iop2drv_data_wrote_handle(acb); in arcmsr_hbaA_doorbell_isr()
2372 arcmsr_iop2drv_data_read_handle(acb); in arcmsr_hbaA_doorbell_isr()
2458 static void arcmsr_hbaA_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbaA_postqueue_isr() argument
2461 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_postqueue_isr()
2469 if (acb->cdb_phyadd_hipart) in arcmsr_hbaA_postqueue_isr()
2470 cdb_phy_addr = cdb_phy_addr | acb->cdb_phyadd_hipart; in arcmsr_hbaA_postqueue_isr()
2471 pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + cdb_phy_addr); in arcmsr_hbaA_postqueue_isr()
2474 arcmsr_drain_donequeue(acb, pCCB, error); in arcmsr_hbaA_postqueue_isr()
2477 static void arcmsr_hbaB_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbaB_postqueue_isr() argument
2481 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_postqueue_isr()
2490 if (acb->cdb_phyadd_hipart) in arcmsr_hbaB_postqueue_isr()
2491 cdb_phy_addr = cdb_phy_addr | acb->cdb_phyadd_hipart; in arcmsr_hbaB_postqueue_isr()
2492 pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + cdb_phy_addr); in arcmsr_hbaB_postqueue_isr()
2495 arcmsr_drain_donequeue(acb, pCCB, error); in arcmsr_hbaB_postqueue_isr()
2503 static void arcmsr_hbaC_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbaC_postqueue_isr() argument
2512 phbcmu = acb->pmuC; in arcmsr_hbaC_postqueue_isr()
2519 if (acb->cdb_phyadd_hipart) in arcmsr_hbaC_postqueue_isr()
2520 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_hbaC_postqueue_isr()
2521 arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset in arcmsr_hbaC_postqueue_isr()
2528 arcmsr_drain_donequeue(acb, ccb, error); in arcmsr_hbaC_postqueue_isr()
2538 static void arcmsr_hbaD_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbaD_postqueue_isr() argument
2548 spin_lock_irqsave(&acb->doneq_lock, flags); in arcmsr_hbaD_postqueue_isr()
2549 pmu = acb->pmuD; in arcmsr_hbaD_postqueue_isr()
2563 if (acb->cdb_phyadd_hipart) in arcmsr_hbaD_postqueue_isr()
2564 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_hbaD_postqueue_isr()
2565 arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset in arcmsr_hbaD_postqueue_isr()
2571 arcmsr_drain_donequeue(acb, ccb, error); in arcmsr_hbaD_postqueue_isr()
2579 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_hbaD_postqueue_isr()
2582 static void arcmsr_hbaE_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbaE_postqueue_isr() argument
2591 spin_lock_irqsave(&acb->doneq_lock, flags); in arcmsr_hbaE_postqueue_isr()
2592 doneq_index = acb->doneq_index; in arcmsr_hbaE_postqueue_isr()
2593 pmu = acb->pmuE; in arcmsr_hbaE_postqueue_isr()
2595 cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID; in arcmsr_hbaE_postqueue_isr()
2596 ccb = acb->pccb_pool[cmdSMID]; in arcmsr_hbaE_postqueue_isr()
2597 error = (acb->pCompletionQ[doneq_index].cmdFlag in arcmsr_hbaE_postqueue_isr()
2599 arcmsr_drain_donequeue(acb, ccb, error); in arcmsr_hbaE_postqueue_isr()
2601 if (doneq_index >= acb->completionQ_entry) in arcmsr_hbaE_postqueue_isr()
2604 acb->doneq_index = doneq_index; in arcmsr_hbaE_postqueue_isr()
2606 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_hbaE_postqueue_isr()
2609 static void arcmsr_hbaF_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbaF_postqueue_isr() argument
2618 spin_lock_irqsave(&acb->doneq_lock, flags); in arcmsr_hbaF_postqueue_isr()
2619 doneq_index = acb->doneq_index; in arcmsr_hbaF_postqueue_isr()
2620 phbcmu = acb->pmuF; in arcmsr_hbaF_postqueue_isr()
2622 cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID; in arcmsr_hbaF_postqueue_isr()
2625 ccb = acb->pccb_pool[cmdSMID]; in arcmsr_hbaF_postqueue_isr()
2626 error = (acb->pCompletionQ[doneq_index].cmdFlag & in arcmsr_hbaF_postqueue_isr()
2628 arcmsr_drain_donequeue(acb, ccb, error); in arcmsr_hbaF_postqueue_isr()
2629 acb->pCompletionQ[doneq_index].cmdSMID = 0xffff; in arcmsr_hbaF_postqueue_isr()
2631 if (doneq_index >= acb->completionQ_entry) in arcmsr_hbaF_postqueue_isr()
2634 acb->doneq_index = doneq_index; in arcmsr_hbaF_postqueue_isr()
2636 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_hbaF_postqueue_isr()
2647 static void arcmsr_hbaA_message_isr(struct AdapterControlBlock *acb) in arcmsr_hbaA_message_isr() argument
2649 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_message_isr()
2652 if (acb->acb_flags & ACB_F_MSG_GET_CONFIG) in arcmsr_hbaA_message_isr()
2653 schedule_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_hbaA_message_isr()
2655 static void arcmsr_hbaB_message_isr(struct AdapterControlBlock *acb) in arcmsr_hbaB_message_isr() argument
2657 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_message_isr()
2661 if (acb->acb_flags & ACB_F_MSG_GET_CONFIG) in arcmsr_hbaB_message_isr()
2662 schedule_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_hbaB_message_isr()
2673 static void arcmsr_hbaC_message_isr(struct AdapterControlBlock *acb) in arcmsr_hbaC_message_isr() argument
2675 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_hbaC_message_isr()
2678 if (acb->acb_flags & ACB_F_MSG_GET_CONFIG) in arcmsr_hbaC_message_isr()
2679 schedule_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_hbaC_message_isr()
2682 static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb) in arcmsr_hbaD_message_isr() argument
2684 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_hbaD_message_isr()
2688 if (acb->acb_flags & ACB_F_MSG_GET_CONFIG) in arcmsr_hbaD_message_isr()
2689 schedule_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_hbaD_message_isr()
2692 static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb) in arcmsr_hbaE_message_isr() argument
2694 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_hbaE_message_isr()
2697 if (acb->acb_flags & ACB_F_MSG_GET_CONFIG) in arcmsr_hbaE_message_isr()
2698 schedule_work(&acb->arcmsr_do_message_isr_bh); in arcmsr_hbaE_message_isr()
2701 static int arcmsr_hbaA_handle_isr(struct AdapterControlBlock *acb) in arcmsr_hbaA_handle_isr() argument
2704 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_handle_isr()
2706 acb->outbound_int_enable; in arcmsr_hbaA_handle_isr()
2712 arcmsr_hbaA_doorbell_isr(acb); in arcmsr_hbaA_handle_isr()
2714 arcmsr_hbaA_postqueue_isr(acb); in arcmsr_hbaA_handle_isr()
2716 arcmsr_hbaA_message_isr(acb); in arcmsr_hbaA_handle_isr()
2718 acb->outbound_int_enable; in arcmsr_hbaA_handle_isr()
2725 static int arcmsr_hbaB_handle_isr(struct AdapterControlBlock *acb) in arcmsr_hbaB_handle_isr() argument
2728 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_handle_isr()
2730 acb->outbound_int_enable; in arcmsr_hbaB_handle_isr()
2737 arcmsr_iop2drv_data_wrote_handle(acb); in arcmsr_hbaB_handle_isr()
2739 arcmsr_iop2drv_data_read_handle(acb); in arcmsr_hbaB_handle_isr()
2741 arcmsr_hbaB_postqueue_isr(acb); in arcmsr_hbaB_handle_isr()
2743 arcmsr_hbaB_message_isr(acb); in arcmsr_hbaB_handle_isr()
2745 acb->outbound_int_enable; in arcmsr_hbaB_handle_isr()
2854 static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb) in arcmsr_interrupt() argument
2856 switch (acb->adapter_type) { in arcmsr_interrupt()
2858 return arcmsr_hbaA_handle_isr(acb); in arcmsr_interrupt()
2860 return arcmsr_hbaB_handle_isr(acb); in arcmsr_interrupt()
2862 return arcmsr_hbaC_handle_isr(acb); in arcmsr_interrupt()
2864 return arcmsr_hbaD_handle_isr(acb); in arcmsr_interrupt()
2866 return arcmsr_hbaE_handle_isr(acb); in arcmsr_interrupt()
2868 return arcmsr_hbaF_handle_isr(acb); in arcmsr_interrupt()
2874 static void arcmsr_iop_parking(struct AdapterControlBlock *acb) in arcmsr_iop_parking() argument
2876 if (acb) { in arcmsr_iop_parking()
2878 if (acb->acb_flags & ACB_F_MSG_START_BGRB) { in arcmsr_iop_parking()
2880 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_iop_parking()
2881 intmask_org = arcmsr_disable_outbound_ints(acb); in arcmsr_iop_parking()
2882 arcmsr_stop_adapter_bgrb(acb); in arcmsr_iop_parking()
2883 arcmsr_flush_adapter_cache(acb); in arcmsr_iop_parking()
2884 arcmsr_enable_outbound_ints(acb, intmask_org); in arcmsr_iop_parking()
2890 void arcmsr_clear_iop2drv_rqueue_buffer(struct AdapterControlBlock *acb) in arcmsr_clear_iop2drv_rqueue_buffer() argument
2894 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_clear_iop2drv_rqueue_buffer()
2896 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_clear_iop2drv_rqueue_buffer()
2897 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_clear_iop2drv_rqueue_buffer()
2898 acb->rqbuf_getIndex = 0; in arcmsr_clear_iop2drv_rqueue_buffer()
2899 acb->rqbuf_putIndex = 0; in arcmsr_clear_iop2drv_rqueue_buffer()
2900 arcmsr_iop_message_read(acb); in arcmsr_clear_iop2drv_rqueue_buffer()
2902 } else if (acb->rqbuf_getIndex != in arcmsr_clear_iop2drv_rqueue_buffer()
2903 acb->rqbuf_putIndex) { in arcmsr_clear_iop2drv_rqueue_buffer()
2904 acb->rqbuf_getIndex = 0; in arcmsr_clear_iop2drv_rqueue_buffer()
2905 acb->rqbuf_putIndex = 0; in arcmsr_clear_iop2drv_rqueue_buffer()
2913 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, in arcmsr_iop_message_xfer() argument
2953 spin_lock_irqsave(&acb->rqbuffer_lock, flags); in arcmsr_iop_message_xfer()
2954 if (acb->rqbuf_getIndex != acb->rqbuf_putIndex) { in arcmsr_iop_message_xfer()
2955 unsigned int tail = acb->rqbuf_getIndex; in arcmsr_iop_message_xfer()
2956 unsigned int head = acb->rqbuf_putIndex; in arcmsr_iop_message_xfer()
2964 memcpy(ptmpQbuffer, acb->rqbuffer + tail, allxfer_len); in arcmsr_iop_message_xfer()
2966 memcpy(ptmpQbuffer, acb->rqbuffer + tail, cnt_to_end); in arcmsr_iop_message_xfer()
2967 memcpy(ptmpQbuffer + cnt_to_end, acb->rqbuffer, allxfer_len - cnt_to_end); in arcmsr_iop_message_xfer()
2969 acb->rqbuf_getIndex = (acb->rqbuf_getIndex + allxfer_len) % ARCMSR_MAX_QBUFFER; in arcmsr_iop_message_xfer()
2973 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_message_xfer()
2975 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_message_xfer()
2976 prbuffer = arcmsr_get_iop_rqbuffer(acb); in arcmsr_iop_message_xfer()
2977 if (arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0) in arcmsr_iop_message_xfer()
2978 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_message_xfer()
2980 spin_unlock_irqrestore(&acb->rqbuffer_lock, flags); in arcmsr_iop_message_xfer()
2983 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3012 spin_lock_irqsave(&acb->wqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3013 if (acb->wqbuf_putIndex != acb->wqbuf_getIndex) { in arcmsr_iop_message_xfer()
3016 arcmsr_write_ioctldata2iop(acb); in arcmsr_iop_message_xfer()
3025 pQbuffer = &acb->wqbuffer[acb->wqbuf_putIndex]; in arcmsr_iop_message_xfer()
3026 cnt2end = ARCMSR_MAX_QBUFFER - acb->wqbuf_putIndex; in arcmsr_iop_message_xfer()
3031 acb->wqbuf_putIndex = 0; in arcmsr_iop_message_xfer()
3032 pQbuffer = acb->wqbuffer; in arcmsr_iop_message_xfer()
3035 acb->wqbuf_putIndex += user_len; in arcmsr_iop_message_xfer()
3036 acb->wqbuf_putIndex %= ARCMSR_MAX_QBUFFER; in arcmsr_iop_message_xfer()
3037 if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) { in arcmsr_iop_message_xfer()
3038 acb->acb_flags &= in arcmsr_iop_message_xfer()
3040 arcmsr_write_ioctldata2iop(acb); in arcmsr_iop_message_xfer()
3043 spin_unlock_irqrestore(&acb->wqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3045 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3054 uint8_t *pQbuffer = acb->rqbuffer; in arcmsr_iop_message_xfer()
3056 arcmsr_clear_iop2drv_rqueue_buffer(acb); in arcmsr_iop_message_xfer()
3057 spin_lock_irqsave(&acb->rqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3058 acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED; in arcmsr_iop_message_xfer()
3059 acb->rqbuf_getIndex = 0; in arcmsr_iop_message_xfer()
3060 acb->rqbuf_putIndex = 0; in arcmsr_iop_message_xfer()
3062 spin_unlock_irqrestore(&acb->rqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3063 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3072 uint8_t *pQbuffer = acb->wqbuffer; in arcmsr_iop_message_xfer()
3073 spin_lock_irqsave(&acb->wqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3074 acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED | in arcmsr_iop_message_xfer()
3076 acb->wqbuf_getIndex = 0; in arcmsr_iop_message_xfer()
3077 acb->wqbuf_putIndex = 0; in arcmsr_iop_message_xfer()
3079 spin_unlock_irqrestore(&acb->wqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3080 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3090 arcmsr_clear_iop2drv_rqueue_buffer(acb); in arcmsr_iop_message_xfer()
3091 spin_lock_irqsave(&acb->rqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3092 acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED; in arcmsr_iop_message_xfer()
3093 acb->rqbuf_getIndex = 0; in arcmsr_iop_message_xfer()
3094 acb->rqbuf_putIndex = 0; in arcmsr_iop_message_xfer()
3095 pQbuffer = acb->rqbuffer; in arcmsr_iop_message_xfer()
3097 spin_unlock_irqrestore(&acb->rqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3098 spin_lock_irqsave(&acb->wqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3099 acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED | in arcmsr_iop_message_xfer()
3101 acb->wqbuf_getIndex = 0; in arcmsr_iop_message_xfer()
3102 acb->wqbuf_putIndex = 0; in arcmsr_iop_message_xfer()
3103 pQbuffer = acb->wqbuffer; in arcmsr_iop_message_xfer()
3105 spin_unlock_irqrestore(&acb->wqbuffer_lock, flags); in arcmsr_iop_message_xfer()
3106 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3115 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3125 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3136 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3142 arcmsr_iop_parking(acb); in arcmsr_iop_message_xfer()
3146 if (acb->fw_flag == FW_DEADLOCK) in arcmsr_iop_message_xfer()
3152 arcmsr_flush_adapter_cache(acb); in arcmsr_iop_message_xfer()
3167 static struct CommandControlBlock *arcmsr_get_freeccb(struct AdapterControlBlock *acb) in arcmsr_get_freeccb() argument
3173 spin_lock_irqsave(&acb->ccblist_lock, flags); in arcmsr_get_freeccb()
3174 head = &acb->ccb_free_list; in arcmsr_get_freeccb()
3179 spin_unlock_irqrestore(&acb->ccblist_lock, flags); in arcmsr_get_freeccb()
3182 spin_unlock_irqrestore(&acb->ccblist_lock, flags); in arcmsr_get_freeccb()
3186 static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb, in arcmsr_handle_virtual_command() argument
3226 if (arcmsr_iop_message_xfer(acb, cmd)) in arcmsr_handle_virtual_command()
3239 struct AdapterControlBlock *acb = (struct AdapterControlBlock *) host->hostdata; in arcmsr_queue_command_lck() local
3243 if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) { in arcmsr_queue_command_lck()
3252 arcmsr_handle_virtual_command(acb, cmd); in arcmsr_queue_command_lck()
3255 ccb = arcmsr_get_freeccb(acb); in arcmsr_queue_command_lck()
3258 if (arcmsr_build_ccb( acb, ccb, cmd ) == FAILED) { in arcmsr_queue_command_lck()
3263 arcmsr_post_ccb(acb, ccb); in arcmsr_queue_command_lck()
3322 static bool arcmsr_hbaA_get_config(struct AdapterControlBlock *acb) in arcmsr_hbaA_get_config() argument
3324 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_get_config()
3326 arcmsr_wait_firmware_ready(acb); in arcmsr_hbaA_get_config()
3328 if (!arcmsr_hbaA_wait_msgint_ready(acb)) { in arcmsr_hbaA_get_config()
3330 miscellaneous data' timeout \n", acb->host->host_no); in arcmsr_hbaA_get_config()
3333 arcmsr_get_adapter_config(acb, reg->message_rwbuffer); in arcmsr_hbaA_get_config()
3336 static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb) in arcmsr_hbaB_get_config() argument
3338 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_get_config()
3340 arcmsr_wait_firmware_ready(acb); in arcmsr_hbaB_get_config()
3342 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_hbaB_get_config()
3343 printk(KERN_ERR "arcmsr%d: can't set driver mode.\n", acb->host->host_no); in arcmsr_hbaB_get_config()
3347 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_hbaB_get_config()
3349 miscellaneous data' timeout \n", acb->host->host_no); in arcmsr_hbaB_get_config()
3352 arcmsr_get_adapter_config(acb, reg->message_rwbuffer); in arcmsr_hbaB_get_config()
3379 static bool arcmsr_hbaD_get_config(struct AdapterControlBlock *acb) in arcmsr_hbaD_get_config() argument
3381 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_hbaD_get_config()
3383 if (readl(acb->pmuD->outbound_doorbell) & in arcmsr_hbaD_get_config()
3386 acb->pmuD->outbound_doorbell);/*clear interrupt*/ in arcmsr_hbaD_get_config()
3388 arcmsr_wait_firmware_ready(acb); in arcmsr_hbaD_get_config()
3392 if (!arcmsr_hbaD_wait_msgint_ready(acb)) { in arcmsr_hbaD_get_config()
3394 "miscellaneous data timeout\n", acb->host->host_no); in arcmsr_hbaD_get_config()
3397 arcmsr_get_adapter_config(acb, reg->msgcode_rwbuffer); in arcmsr_hbaD_get_config()
3452 static bool arcmsr_get_firmware_spec(struct AdapterControlBlock *acb) in arcmsr_get_firmware_spec() argument
3456 switch (acb->adapter_type) { in arcmsr_get_firmware_spec()
3458 rtn = arcmsr_hbaA_get_config(acb); in arcmsr_get_firmware_spec()
3461 rtn = arcmsr_hbaB_get_config(acb); in arcmsr_get_firmware_spec()
3464 rtn = arcmsr_hbaC_get_config(acb); in arcmsr_get_firmware_spec()
3467 rtn = arcmsr_hbaD_get_config(acb); in arcmsr_get_firmware_spec()
3470 rtn = arcmsr_hbaE_get_config(acb); in arcmsr_get_firmware_spec()
3473 rtn = arcmsr_hbaF_get_config(acb); in arcmsr_get_firmware_spec()
3478 acb->maxOutstanding = acb->firm_numbers_queue - 1; in arcmsr_get_firmware_spec()
3479 if (acb->host->can_queue >= acb->firm_numbers_queue) in arcmsr_get_firmware_spec()
3480 acb->host->can_queue = acb->maxOutstanding; in arcmsr_get_firmware_spec()
3482 acb->maxOutstanding = acb->host->can_queue; in arcmsr_get_firmware_spec()
3483 acb->maxFreeCCB = acb->host->can_queue; in arcmsr_get_firmware_spec()
3484 if (acb->maxFreeCCB < ARCMSR_MAX_FREECCB_NUM) in arcmsr_get_firmware_spec()
3485 acb->maxFreeCCB += 64; in arcmsr_get_firmware_spec()
3489 static int arcmsr_hbaA_polling_ccbdone(struct AdapterControlBlock *acb, in arcmsr_hbaA_polling_ccbdone() argument
3492 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_polling_ccbdone()
3502 outbound_intstatus = readl(&reg->outbound_intstatus) & acb->outbound_int_enable; in arcmsr_hbaA_polling_ccbdone()
3519 if (acb->cdb_phyadd_hipart) in arcmsr_hbaA_polling_ccbdone()
3520 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_hbaA_polling_ccbdone()
3521 arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); in arcmsr_hbaA_polling_ccbdone()
3524 if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) { in arcmsr_hbaA_polling_ccbdone()
3528 , acb->host->host_no in arcmsr_hbaA_polling_ccbdone()
3539 , acb->host->host_no in arcmsr_hbaA_polling_ccbdone()
3541 , atomic_read(&acb->ccboutstandingcount)); in arcmsr_hbaA_polling_ccbdone()
3545 arcmsr_report_ccb_state(acb, ccb, error); in arcmsr_hbaA_polling_ccbdone()
3550 static int arcmsr_hbaB_polling_ccbdone(struct AdapterControlBlock *acb, in arcmsr_hbaB_polling_ccbdone() argument
3553 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_polling_ccbdone()
3588 if (acb->cdb_phyadd_hipart) in arcmsr_hbaB_polling_ccbdone()
3589 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_hbaB_polling_ccbdone()
3590 arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); in arcmsr_hbaB_polling_ccbdone()
3593 if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) { in arcmsr_hbaB_polling_ccbdone()
3597 ,acb->host->host_no in arcmsr_hbaB_polling_ccbdone()
3608 , acb->host->host_no in arcmsr_hbaB_polling_ccbdone()
3610 , atomic_read(&acb->ccboutstandingcount)); in arcmsr_hbaB_polling_ccbdone()
3614 arcmsr_report_ccb_state(acb, ccb, error); in arcmsr_hbaB_polling_ccbdone()
3619 static int arcmsr_hbaC_polling_ccbdone(struct AdapterControlBlock *acb, in arcmsr_hbaC_polling_ccbdone() argument
3622 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_hbaC_polling_ccbdone()
3649 if (acb->cdb_phyadd_hipart) in arcmsr_hbaC_polling_ccbdone()
3650 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_hbaC_polling_ccbdone()
3651 arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); in arcmsr_hbaC_polling_ccbdone()
3655 if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) { in arcmsr_hbaC_polling_ccbdone()
3659 , acb->host->host_no in arcmsr_hbaC_polling_ccbdone()
3670 , acb->host->host_no in arcmsr_hbaC_polling_ccbdone()
3672 , atomic_read(&acb->ccboutstandingcount)); in arcmsr_hbaC_polling_ccbdone()
3676 arcmsr_report_ccb_state(acb, pCCB, error); in arcmsr_hbaC_polling_ccbdone()
3681 static int arcmsr_hbaD_polling_ccbdone(struct AdapterControlBlock *acb, in arcmsr_hbaD_polling_ccbdone() argument
3690 struct MessageUnit_D *pmu = acb->pmuD; in arcmsr_hbaD_polling_ccbdone()
3695 spin_lock_irqsave(&acb->doneq_lock, flags); in arcmsr_hbaD_polling_ccbdone()
3699 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_hbaD_polling_ccbdone()
3718 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_hbaD_polling_ccbdone()
3721 if (acb->cdb_phyadd_hipart) in arcmsr_hbaD_polling_ccbdone()
3722 ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; in arcmsr_hbaD_polling_ccbdone()
3723 arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + in arcmsr_hbaD_polling_ccbdone()
3728 if ((pCCB->acb != acb) || in arcmsr_hbaD_polling_ccbdone()
3734 , acb->host->host_no in arcmsr_hbaD_polling_ccbdone()
3745 , acb->host->host_no in arcmsr_hbaD_polling_ccbdone()
3747 , atomic_read(&acb->ccboutstandingcount)); in arcmsr_hbaD_polling_ccbdone()
3752 arcmsr_report_ccb_state(acb, pCCB, error); in arcmsr_hbaD_polling_ccbdone()
3757 static int arcmsr_hbaE_polling_ccbdone(struct AdapterControlBlock *acb, in arcmsr_hbaE_polling_ccbdone() argument
3766 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_hbaE_polling_ccbdone()
3771 spin_lock_irqsave(&acb->doneq_lock, flags); in arcmsr_hbaE_polling_ccbdone()
3772 doneq_index = acb->doneq_index; in arcmsr_hbaE_polling_ccbdone()
3775 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_hbaE_polling_ccbdone()
3788 cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID; in arcmsr_hbaE_polling_ccbdone()
3790 if (doneq_index >= acb->completionQ_entry) in arcmsr_hbaE_polling_ccbdone()
3792 acb->doneq_index = doneq_index; in arcmsr_hbaE_polling_ccbdone()
3793 spin_unlock_irqrestore(&acb->doneq_lock, flags); in arcmsr_hbaE_polling_ccbdone()
3794 pCCB = acb->pccb_pool[cmdSMID]; in arcmsr_hbaE_polling_ccbdone()
3797 if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) { in arcmsr_hbaE_polling_ccbdone()
3802 , acb->host->host_no in arcmsr_hbaE_polling_ccbdone()
3813 , acb->host->host_no in arcmsr_hbaE_polling_ccbdone()
3815 , atomic_read(&acb->ccboutstandingcount)); in arcmsr_hbaE_polling_ccbdone()
3818 error = (acb->pCompletionQ[doneq_index].cmdFlag & in arcmsr_hbaE_polling_ccbdone()
3820 arcmsr_report_ccb_state(acb, pCCB, error); in arcmsr_hbaE_polling_ccbdone()
3826 static int arcmsr_polling_ccbdone(struct AdapterControlBlock *acb, in arcmsr_polling_ccbdone() argument
3830 switch (acb->adapter_type) { in arcmsr_polling_ccbdone()
3833 rtn = arcmsr_hbaA_polling_ccbdone(acb, poll_ccb); in arcmsr_polling_ccbdone()
3836 rtn = arcmsr_hbaB_polling_ccbdone(acb, poll_ccb); in arcmsr_polling_ccbdone()
3839 rtn = arcmsr_hbaC_polling_ccbdone(acb, poll_ccb); in arcmsr_polling_ccbdone()
3842 rtn = arcmsr_hbaD_polling_ccbdone(acb, poll_ccb); in arcmsr_polling_ccbdone()
3846 rtn = arcmsr_hbaE_polling_ccbdone(acb, poll_ccb); in arcmsr_polling_ccbdone()
3944 static int arcmsr_iop_confirm(struct AdapterControlBlock *acb) in arcmsr_iop_confirm() argument
3955 switch (acb->adapter_type) { in arcmsr_iop_confirm()
3958 dma_coherent_handle = acb->dma_coherent_handle2; in arcmsr_iop_confirm()
3962 dma_coherent_handle = acb->dma_coherent_handle + in arcmsr_iop_confirm()
3966 dma_coherent_handle = acb->dma_coherent_handle; in arcmsr_iop_confirm()
3971 acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32; in arcmsr_iop_confirm()
3972 acb->cdb_phyadd_hipart = ((uint64_t)cdb_phyaddr_hi32) << 32; in arcmsr_iop_confirm()
3978 switch (acb->adapter_type) { in arcmsr_iop_confirm()
3982 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_iop_confirm()
3988 if (!arcmsr_hbaA_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
3991 acb->host->host_no); in arcmsr_iop_confirm()
4001 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_iop_confirm()
4005 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4007 acb->host->host_no); in arcmsr_iop_confirm()
4023 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4025 timeout \n",acb->host->host_no); in arcmsr_iop_confirm()
4029 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4031 acb->host->host_no); in arcmsr_iop_confirm()
4037 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_iop_confirm()
4040 acb->adapter_index, cdb_phyaddr_hi32); in arcmsr_iop_confirm()
4045 if (!arcmsr_hbaC_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4047 timeout \n", acb->host->host_no); in arcmsr_iop_confirm()
4054 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_iop_confirm()
4065 if (!arcmsr_hbaD_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4067 acb->host->host_no); in arcmsr_iop_confirm()
4073 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_iop_confirm()
4078 writel(acb->ccbsize, &reg->msgcode_rwbuffer[4]); in arcmsr_iop_confirm()
4079 writel(lower_32_bits(acb->dma_coherent_handle2), &reg->msgcode_rwbuffer[5]); in arcmsr_iop_confirm()
4080 writel(upper_32_bits(acb->dma_coherent_handle2), &reg->msgcode_rwbuffer[6]); in arcmsr_iop_confirm()
4081 writel(acb->ioqueue_size, &reg->msgcode_rwbuffer[7]); in arcmsr_iop_confirm()
4083 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_iop_confirm()
4084 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_iop_confirm()
4085 if (!arcmsr_hbaE_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4087 acb->host->host_no); in arcmsr_iop_confirm()
4093 struct MessageUnit_F __iomem *reg = acb->pmuF; in arcmsr_iop_confirm()
4095 acb->msgcode_rwbuffer[0] = ARCMSR_SIGNATURE_SET_CONFIG; in arcmsr_iop_confirm()
4096 acb->msgcode_rwbuffer[1] = ARCMSR_SIGNATURE_1886; in arcmsr_iop_confirm()
4097 acb->msgcode_rwbuffer[2] = cdb_phyaddr; in arcmsr_iop_confirm()
4098 acb->msgcode_rwbuffer[3] = cdb_phyaddr_hi32; in arcmsr_iop_confirm()
4099 acb->msgcode_rwbuffer[4] = acb->ccbsize; in arcmsr_iop_confirm()
4100 acb->msgcode_rwbuffer[5] = lower_32_bits(acb->dma_coherent_handle2); in arcmsr_iop_confirm()
4101 acb->msgcode_rwbuffer[6] = upper_32_bits(acb->dma_coherent_handle2); in arcmsr_iop_confirm()
4102 acb->msgcode_rwbuffer[7] = acb->completeQ_size; in arcmsr_iop_confirm()
4104 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_iop_confirm()
4105 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_iop_confirm()
4106 if (!arcmsr_hbaE_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4108 acb->host->host_no); in arcmsr_iop_confirm()
4117 static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb) in arcmsr_wait_firmware_ready() argument
4120 switch (acb->adapter_type) { in arcmsr_wait_firmware_ready()
4123 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_wait_firmware_ready()
4125 if (!(acb->acb_flags & ACB_F_IOP_INITED)) in arcmsr_wait_firmware_ready()
4133 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_wait_firmware_ready()
4135 if (!(acb->acb_flags & ACB_F_IOP_INITED)) in arcmsr_wait_firmware_ready()
4143 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_wait_firmware_ready()
4145 if (!(acb->acb_flags & ACB_F_IOP_INITED)) in arcmsr_wait_firmware_ready()
4152 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_wait_firmware_ready()
4154 if (!(acb->acb_flags & ACB_F_IOP_INITED)) in arcmsr_wait_firmware_ready()
4163 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_wait_firmware_ready()
4165 if (!(acb->acb_flags & ACB_F_IOP_INITED)) in arcmsr_wait_firmware_ready()
4176 struct AdapterControlBlock *acb = from_timer(acb, t, eternal_timer); in arcmsr_request_device_map() local
4177 if (acb->acb_flags & (ACB_F_MSG_GET_CONFIG | ACB_F_BUS_RESET | ACB_F_ABORT)) { in arcmsr_request_device_map()
4178 mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); in arcmsr_request_device_map()
4180 acb->fw_flag = FW_NORMAL; in arcmsr_request_device_map()
4181 switch (acb->adapter_type) { in arcmsr_request_device_map()
4183 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_request_device_map()
4188 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_request_device_map()
4193 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_request_device_map()
4199 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_request_device_map()
4204 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_request_device_map()
4206 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_request_device_map()
4207 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_request_device_map()
4211 struct MessageUnit_F __iomem *reg = acb->pmuF; in arcmsr_request_device_map()
4218 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_request_device_map()
4219 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_request_device_map()
4225 acb->acb_flags |= ACB_F_MSG_GET_CONFIG; in arcmsr_request_device_map()
4227 mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); in arcmsr_request_device_map()
4231 static void arcmsr_hbaA_start_bgrb(struct AdapterControlBlock *acb) in arcmsr_hbaA_start_bgrb() argument
4233 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_hbaA_start_bgrb()
4234 acb->acb_flags |= ACB_F_MSG_START_BGRB; in arcmsr_hbaA_start_bgrb()
4236 if (!arcmsr_hbaA_wait_msgint_ready(acb)) { in arcmsr_hbaA_start_bgrb()
4238 rebuild' timeout \n", acb->host->host_no); in arcmsr_hbaA_start_bgrb()
4242 static void arcmsr_hbaB_start_bgrb(struct AdapterControlBlock *acb) in arcmsr_hbaB_start_bgrb() argument
4244 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_hbaB_start_bgrb()
4245 acb->acb_flags |= ACB_F_MSG_START_BGRB; in arcmsr_hbaB_start_bgrb()
4247 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_hbaB_start_bgrb()
4249 rebuild' timeout \n",acb->host->host_no); in arcmsr_hbaB_start_bgrb()
4292 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb) in arcmsr_start_adapter_bgrb() argument
4294 switch (acb->adapter_type) { in arcmsr_start_adapter_bgrb()
4296 arcmsr_hbaA_start_bgrb(acb); in arcmsr_start_adapter_bgrb()
4299 arcmsr_hbaB_start_bgrb(acb); in arcmsr_start_adapter_bgrb()
4302 arcmsr_hbaC_start_bgrb(acb); in arcmsr_start_adapter_bgrb()
4305 arcmsr_hbaD_start_bgrb(acb); in arcmsr_start_adapter_bgrb()
4309 arcmsr_hbaE_start_bgrb(acb); in arcmsr_start_adapter_bgrb()
4314 static void arcmsr_clear_doorbell_queue_buffer(struct AdapterControlBlock *acb) in arcmsr_clear_doorbell_queue_buffer() argument
4316 switch (acb->adapter_type) { in arcmsr_clear_doorbell_queue_buffer()
4318 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_clear_doorbell_queue_buffer()
4329 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_clear_doorbell_queue_buffer()
4346 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_clear_doorbell_queue_buffer()
4367 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_clear_doorbell_queue_buffer()
4390 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_clear_doorbell_queue_buffer()
4393 acb->in_doorbell = readl(&reg->iobound_doorbell); in arcmsr_clear_doorbell_queue_buffer()
4395 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK; in arcmsr_clear_doorbell_queue_buffer()
4396 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_clear_doorbell_queue_buffer()
4399 tmp = acb->in_doorbell; in arcmsr_clear_doorbell_queue_buffer()
4400 acb->in_doorbell = readl(&reg->iobound_doorbell); in arcmsr_clear_doorbell_queue_buffer()
4401 if((tmp ^ acb->in_doorbell) & ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK) { in arcmsr_clear_doorbell_queue_buffer()
4403 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK; in arcmsr_clear_doorbell_queue_buffer()
4404 writel(acb->out_doorbell, &reg->iobound_doorbell); in arcmsr_clear_doorbell_queue_buffer()
4413 static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb) in arcmsr_enable_eoi_mode() argument
4415 switch (acb->adapter_type) { in arcmsr_enable_eoi_mode()
4420 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_enable_eoi_mode()
4422 if (!arcmsr_hbaB_wait_msgint_ready(acb)) { in arcmsr_enable_eoi_mode()
4434 static void arcmsr_hardware_reset(struct AdapterControlBlock *acb) in arcmsr_hardware_reset() argument
4438 struct MessageUnit_A __iomem *pmuA = acb->pmuA; in arcmsr_hardware_reset()
4439 struct MessageUnit_C __iomem *pmuC = acb->pmuC; in arcmsr_hardware_reset()
4440 struct MessageUnit_D *pmuD = acb->pmuD; in arcmsr_hardware_reset()
4443 printk(KERN_NOTICE "arcmsr%d: executing hw bus reset .....\n", acb->host->host_no); in arcmsr_hardware_reset()
4445 pci_read_config_byte(acb->pdev, i, &value[i]); in arcmsr_hardware_reset()
4448 if (acb->dev_id == 0x1680) { in arcmsr_hardware_reset()
4450 } else if (acb->dev_id == 0x1880) { in arcmsr_hardware_reset()
4461 } else if (acb->dev_id == 0x1884) { in arcmsr_hardware_reset()
4462 struct MessageUnit_E __iomem *pmuE = acb->pmuE; in arcmsr_hardware_reset()
4474 } else if (acb->dev_id == 0x1214) { in arcmsr_hardware_reset()
4477 pci_write_config_byte(acb->pdev, 0x84, 0x20); in arcmsr_hardware_reset()
4482 pci_write_config_byte(acb->pdev, i, value[i]); in arcmsr_hardware_reset()
4488 static bool arcmsr_reset_in_progress(struct AdapterControlBlock *acb) in arcmsr_reset_in_progress() argument
4492 switch(acb->adapter_type) { in arcmsr_reset_in_progress()
4494 struct MessageUnit_A __iomem *reg = acb->pmuA; in arcmsr_reset_in_progress()
4500 struct MessageUnit_B *reg = acb->pmuB; in arcmsr_reset_in_progress()
4506 struct MessageUnit_C __iomem *reg = acb->pmuC; in arcmsr_reset_in_progress()
4511 struct MessageUnit_D *reg = acb->pmuD; in arcmsr_reset_in_progress()
4518 struct MessageUnit_E __iomem *reg = acb->pmuE; in arcmsr_reset_in_progress()
4527 static void arcmsr_iop_init(struct AdapterControlBlock *acb) in arcmsr_iop_init() argument
4531 intmask_org = arcmsr_disable_outbound_ints(acb); in arcmsr_iop_init()
4532 arcmsr_wait_firmware_ready(acb); in arcmsr_iop_init()
4533 arcmsr_iop_confirm(acb); in arcmsr_iop_init()
4535 arcmsr_start_adapter_bgrb(acb); in arcmsr_iop_init()
4537 arcmsr_clear_doorbell_queue_buffer(acb); in arcmsr_iop_init()
4538 arcmsr_enable_eoi_mode(acb); in arcmsr_iop_init()
4540 arcmsr_enable_outbound_ints(acb, intmask_org); in arcmsr_iop_init()
4541 acb->acb_flags |= ACB_F_IOP_INITED; in arcmsr_iop_init()
4544 static uint8_t arcmsr_iop_reset(struct AdapterControlBlock *acb) in arcmsr_iop_reset() argument
4552 if (atomic_read(&acb->ccboutstandingcount) != 0) { in arcmsr_iop_reset()
4554 intmask_org = arcmsr_disable_outbound_ints(acb); in arcmsr_iop_reset()
4556 rtnval = arcmsr_abort_allcmd(acb); in arcmsr_iop_reset()
4558 arcmsr_done4abort_postqueue(acb); in arcmsr_iop_reset()
4559 for (i = 0; i < acb->maxFreeCCB; i++) { in arcmsr_iop_reset()
4560 ccb = acb->pccb_pool[i]; in arcmsr_iop_reset()
4565 spin_lock_irqsave(&acb->ccblist_lock, flags); in arcmsr_iop_reset()
4566 list_add_tail(&ccb->list, &acb->ccb_free_list); in arcmsr_iop_reset()
4567 spin_unlock_irqrestore(&acb->ccblist_lock, flags); in arcmsr_iop_reset()
4570 atomic_set(&acb->ccboutstandingcount, 0); in arcmsr_iop_reset()
4572 arcmsr_enable_outbound_ints(acb, intmask_org); in arcmsr_iop_reset()
4580 struct AdapterControlBlock *acb; in arcmsr_bus_reset() local
4583 acb = (struct AdapterControlBlock *) cmd->device->host->hostdata; in arcmsr_bus_reset()
4584 if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) in arcmsr_bus_reset()
4587 " num_aborts = %d \n", acb->num_resets, acb->num_aborts); in arcmsr_bus_reset()
4588 acb->num_resets++; in arcmsr_bus_reset()
4590 if (acb->acb_flags & ACB_F_BUS_RESET) { in arcmsr_bus_reset()
4593 timeout = wait_event_timeout(wait_q, (acb->acb_flags in arcmsr_bus_reset()
4598 acb->acb_flags |= ACB_F_BUS_RESET; in arcmsr_bus_reset()
4599 if (!arcmsr_iop_reset(acb)) { in arcmsr_bus_reset()
4600 arcmsr_hardware_reset(acb); in arcmsr_bus_reset()
4601 acb->acb_flags &= ~ACB_F_IOP_INITED; in arcmsr_bus_reset()
4604 if (arcmsr_reset_in_progress(acb)) { in arcmsr_bus_reset()
4606 acb->fw_flag = FW_DEADLOCK; in arcmsr_bus_reset()
4609 acb->host->host_no); in arcmsr_bus_reset()
4615 arcmsr_iop_init(acb); in arcmsr_bus_reset()
4616 acb->fw_flag = FW_NORMAL; in arcmsr_bus_reset()
4617 mod_timer(&acb->eternal_timer, jiffies + in arcmsr_bus_reset()
4619 acb->acb_flags &= ~ACB_F_BUS_RESET; in arcmsr_bus_reset()
4623 acb->acb_flags &= ~ACB_F_BUS_RESET; in arcmsr_bus_reset()
4624 acb->fw_flag = FW_NORMAL; in arcmsr_bus_reset()
4625 mod_timer(&acb->eternal_timer, jiffies + in arcmsr_bus_reset()
4632 static int arcmsr_abort_one_cmd(struct AdapterControlBlock *acb, in arcmsr_abort_one_cmd() argument
4636 rtn = arcmsr_polling_ccbdone(acb, ccb); in arcmsr_abort_one_cmd()
4642 struct AdapterControlBlock *acb = in arcmsr_abort() local
4648 if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) in arcmsr_abort()
4652 acb->host->host_no, cmd->device->id, (u32)cmd->device->lun); in arcmsr_abort()
4653 acb->acb_flags |= ACB_F_ABORT; in arcmsr_abort()
4654 acb->num_aborts++; in arcmsr_abort()
4661 if (!atomic_read(&acb->ccboutstandingcount)) { in arcmsr_abort()
4662 acb->acb_flags &= ~ACB_F_ABORT; in arcmsr_abort()
4666 intmask_org = arcmsr_disable_outbound_ints(acb); in arcmsr_abort()
4667 for (i = 0; i < acb->maxFreeCCB; i++) { in arcmsr_abort()
4668 struct CommandControlBlock *ccb = acb->pccb_pool[i]; in arcmsr_abort()
4671 rtn = arcmsr_abort_one_cmd(acb, ccb); in arcmsr_abort()
4675 acb->acb_flags &= ~ACB_F_ABORT; in arcmsr_abort()
4676 arcmsr_enable_outbound_ints(acb, intmask_org); in arcmsr_abort()
4682 struct AdapterControlBlock *acb = in arcmsr_info() local
4687 switch (acb->pdev->device) { in arcmsr_info()