.. | .. |
---|
41 | 41 | ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
42 | 42 | ******************************************************************************* |
---|
43 | 43 | ** For history of changes, see Documentation/scsi/ChangeLog.arcmsr |
---|
44 | | -** Firmware Specification, see Documentation/scsi/arcmsr_spec.txt |
---|
| 44 | +** Firmware Specification, see Documentation/scsi/arcmsr_spec.rst |
---|
45 | 45 | ******************************************************************************* |
---|
46 | 46 | */ |
---|
47 | 47 | #include <linux/module.h> |
---|
.. | .. |
---|
91 | 91 | module_param(cmd_per_lun, int, S_IRUGO); |
---|
92 | 92 | MODULE_PARM_DESC(cmd_per_lun, " device queue depth(1 ~ 128), default is 32"); |
---|
93 | 93 | |
---|
| 94 | +static int dma_mask_64 = 0; |
---|
| 95 | +module_param(dma_mask_64, int, S_IRUGO); |
---|
| 96 | +MODULE_PARM_DESC(dma_mask_64, " set DMA mask to 64 bits(0 ~ 1), dma_mask_64=1(64 bits), =0(32 bits)"); |
---|
| 97 | + |
---|
94 | 98 | static int set_date_time = 0; |
---|
95 | 99 | module_param(set_date_time, int, S_IRUGO); |
---|
96 | 100 | MODULE_PARM_DESC(set_date_time, " send date, time to iop(0 ~ 1), set_date_time=1(enable), default(=0) is disable"); |
---|
.. | .. |
---|
129 | 133 | static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb); |
---|
130 | 134 | static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb); |
---|
131 | 135 | static void arcmsr_hbaE_postqueue_isr(struct AdapterControlBlock *acb); |
---|
| 136 | +static void arcmsr_hbaF_postqueue_isr(struct AdapterControlBlock *acb); |
---|
132 | 137 | static void arcmsr_hardware_reset(struct AdapterControlBlock *acb); |
---|
133 | 138 | static const char *arcmsr_info(struct Scsi_Host *); |
---|
134 | 139 | static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb); |
---|
.. | .. |
---|
156 | 161 | .sg_tablesize = ARCMSR_DEFAULT_SG_ENTRIES, |
---|
157 | 162 | .max_sectors = ARCMSR_MAX_XFER_SECTORS_C, |
---|
158 | 163 | .cmd_per_lun = ARCMSR_DEFAULT_CMD_PERLUN, |
---|
159 | | - .use_clustering = ENABLE_CLUSTERING, |
---|
160 | 164 | .shost_attrs = arcmsr_host_attrs, |
---|
161 | 165 | .no_write_same = 1, |
---|
162 | 166 | }; |
---|
.. | .. |
---|
206 | 210 | .driver_data = ACB_ADAPTER_TYPE_C}, |
---|
207 | 211 | {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1884), |
---|
208 | 212 | .driver_data = ACB_ADAPTER_TYPE_E}, |
---|
| 213 | + {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1886), |
---|
| 214 | + .driver_data = ACB_ADAPTER_TYPE_F}, |
---|
209 | 215 | {0, 0}, /* Terminating entry */ |
---|
210 | 216 | }; |
---|
211 | 217 | MODULE_DEVICE_TABLE(pci, arcmsr_device_id_table); |
---|
.. | .. |
---|
224 | 230 | **************************************************************************** |
---|
225 | 231 | */ |
---|
226 | 232 | |
---|
227 | | -static void arcmsr_free_mu(struct AdapterControlBlock *acb) |
---|
| 233 | +static void arcmsr_free_io_queue(struct AdapterControlBlock *acb) |
---|
228 | 234 | { |
---|
229 | 235 | switch (acb->adapter_type) { |
---|
230 | 236 | case ACB_ADAPTER_TYPE_B: |
---|
231 | 237 | case ACB_ADAPTER_TYPE_D: |
---|
232 | | - case ACB_ADAPTER_TYPE_E: { |
---|
233 | | - dma_free_coherent(&acb->pdev->dev, acb->roundup_ccbsize, |
---|
| 238 | + case ACB_ADAPTER_TYPE_E: |
---|
| 239 | + case ACB_ADAPTER_TYPE_F: |
---|
| 240 | + dma_free_coherent(&acb->pdev->dev, acb->ioqueue_size, |
---|
234 | 241 | acb->dma_coherent2, acb->dma_coherent_handle2); |
---|
235 | 242 | break; |
---|
236 | | - } |
---|
237 | 243 | } |
---|
238 | 244 | } |
---|
239 | 245 | |
---|
.. | .. |
---|
267 | 273 | break; |
---|
268 | 274 | } |
---|
269 | 275 | case ACB_ADAPTER_TYPE_C:{ |
---|
270 | | - acb->pmuC = ioremap_nocache(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1)); |
---|
| 276 | + acb->pmuC = ioremap(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1)); |
---|
271 | 277 | if (!acb->pmuC) { |
---|
272 | 278 | printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no); |
---|
273 | 279 | return false; |
---|
.. | .. |
---|
280 | 286 | } |
---|
281 | 287 | case ACB_ADAPTER_TYPE_D: { |
---|
282 | 288 | void __iomem *mem_base0; |
---|
283 | | - unsigned long addr, range, flags; |
---|
| 289 | + unsigned long addr, range; |
---|
284 | 290 | |
---|
285 | 291 | addr = (unsigned long)pci_resource_start(pdev, 0); |
---|
286 | 292 | range = pci_resource_len(pdev, 0); |
---|
287 | | - flags = pci_resource_flags(pdev, 0); |
---|
288 | 293 | mem_base0 = ioremap(addr, range); |
---|
289 | 294 | if (!mem_base0) { |
---|
290 | 295 | pr_notice("arcmsr%d: memory mapping region fail\n", |
---|
.. | .. |
---|
308 | 313 | acb->out_doorbell = 0; |
---|
309 | 314 | break; |
---|
310 | 315 | } |
---|
| 316 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 317 | + acb->pmuF = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); |
---|
| 318 | + if (!acb->pmuF) { |
---|
| 319 | + pr_notice("arcmsr%d: memory mapping region fail\n", |
---|
| 320 | + acb->host->host_no); |
---|
| 321 | + return false; |
---|
| 322 | + } |
---|
| 323 | + writel(0, &acb->pmuF->host_int_status); /* clear interrupt */ |
---|
| 324 | + writel(ARCMSR_HBFMU_DOORBELL_SYNC, &acb->pmuF->iobound_doorbell); |
---|
| 325 | + acb->in_doorbell = 0; |
---|
| 326 | + acb->out_doorbell = 0; |
---|
| 327 | + break; |
---|
| 328 | + } |
---|
311 | 329 | } |
---|
312 | 330 | return true; |
---|
313 | 331 | } |
---|
.. | .. |
---|
315 | 333 | static void arcmsr_unmap_pciregion(struct AdapterControlBlock *acb) |
---|
316 | 334 | { |
---|
317 | 335 | switch (acb->adapter_type) { |
---|
318 | | - case ACB_ADAPTER_TYPE_A:{ |
---|
| 336 | + case ACB_ADAPTER_TYPE_A: |
---|
319 | 337 | iounmap(acb->pmuA); |
---|
320 | | - } |
---|
321 | | - break; |
---|
322 | | - case ACB_ADAPTER_TYPE_B:{ |
---|
| 338 | + break; |
---|
| 339 | + case ACB_ADAPTER_TYPE_B: |
---|
323 | 340 | iounmap(acb->mem_base0); |
---|
324 | 341 | iounmap(acb->mem_base1); |
---|
325 | | - } |
---|
326 | | - |
---|
327 | | - break; |
---|
328 | | - case ACB_ADAPTER_TYPE_C:{ |
---|
| 342 | + break; |
---|
| 343 | + case ACB_ADAPTER_TYPE_C: |
---|
329 | 344 | iounmap(acb->pmuC); |
---|
330 | | - } |
---|
331 | | - break; |
---|
| 345 | + break; |
---|
332 | 346 | case ACB_ADAPTER_TYPE_D: |
---|
333 | 347 | iounmap(acb->mem_base0); |
---|
334 | 348 | break; |
---|
335 | 349 | case ACB_ADAPTER_TYPE_E: |
---|
336 | 350 | iounmap(acb->pmuE); |
---|
| 351 | + break; |
---|
| 352 | + case ACB_ADAPTER_TYPE_F: |
---|
| 353 | + iounmap(acb->pmuF); |
---|
337 | 354 | break; |
---|
338 | 355 | } |
---|
339 | 356 | } |
---|
.. | .. |
---|
350 | 367 | static int arcmsr_bios_param(struct scsi_device *sdev, |
---|
351 | 368 | struct block_device *bdev, sector_t capacity, int *geom) |
---|
352 | 369 | { |
---|
353 | | - int ret, heads, sectors, cylinders, total_capacity; |
---|
354 | | - unsigned char *buffer;/* return copy of block device's partition table */ |
---|
| 370 | + int heads, sectors, cylinders, total_capacity; |
---|
355 | 371 | |
---|
356 | | - buffer = scsi_bios_ptable(bdev); |
---|
357 | | - if (buffer) { |
---|
358 | | - ret = scsi_partsize(buffer, capacity, &geom[2], &geom[0], &geom[1]); |
---|
359 | | - kfree(buffer); |
---|
360 | | - if (ret != -1) |
---|
361 | | - return ret; |
---|
362 | | - } |
---|
| 372 | + if (scsi_partsize(bdev, capacity, geom)) |
---|
| 373 | + return 0; |
---|
| 374 | + |
---|
363 | 375 | total_capacity = capacity; |
---|
364 | 376 | heads = 64; |
---|
365 | 377 | sectors = 32; |
---|
.. | .. |
---|
555 | 567 | { |
---|
556 | 568 | switch (acb->adapter_type) { |
---|
557 | 569 | |
---|
558 | | - case ACB_ADAPTER_TYPE_A: { |
---|
| 570 | + case ACB_ADAPTER_TYPE_A: |
---|
559 | 571 | arcmsr_hbaA_flush_cache(acb); |
---|
560 | | - } |
---|
561 | 572 | break; |
---|
562 | | - |
---|
563 | | - case ACB_ADAPTER_TYPE_B: { |
---|
| 573 | + case ACB_ADAPTER_TYPE_B: |
---|
564 | 574 | arcmsr_hbaB_flush_cache(acb); |
---|
565 | | - } |
---|
566 | 575 | break; |
---|
567 | | - case ACB_ADAPTER_TYPE_C: { |
---|
| 576 | + case ACB_ADAPTER_TYPE_C: |
---|
568 | 577 | arcmsr_hbaC_flush_cache(acb); |
---|
569 | | - } |
---|
570 | 578 | break; |
---|
571 | 579 | case ACB_ADAPTER_TYPE_D: |
---|
572 | 580 | arcmsr_hbaD_flush_cache(acb); |
---|
573 | 581 | break; |
---|
574 | 582 | case ACB_ADAPTER_TYPE_E: |
---|
| 583 | + case ACB_ADAPTER_TYPE_F: |
---|
575 | 584 | arcmsr_hbaE_flush_cache(acb); |
---|
576 | 585 | break; |
---|
577 | 586 | } |
---|
| 587 | +} |
---|
| 588 | + |
---|
| 589 | +static void arcmsr_hbaB_assign_regAddr(struct AdapterControlBlock *acb) |
---|
| 590 | +{ |
---|
| 591 | + struct MessageUnit_B *reg = acb->pmuB; |
---|
| 592 | + |
---|
| 593 | + if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) { |
---|
| 594 | + reg->drv2iop_doorbell = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_1203); |
---|
| 595 | + reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK_1203); |
---|
| 596 | + reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_1203); |
---|
| 597 | + reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK_1203); |
---|
| 598 | + } else { |
---|
| 599 | + reg->drv2iop_doorbell= MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL); |
---|
| 600 | + reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK); |
---|
| 601 | + reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL); |
---|
| 602 | + reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK); |
---|
| 603 | + } |
---|
| 604 | + reg->message_wbuffer = MEM_BASE1(ARCMSR_MESSAGE_WBUFFER); |
---|
| 605 | + reg->message_rbuffer = MEM_BASE1(ARCMSR_MESSAGE_RBUFFER); |
---|
| 606 | + reg->message_rwbuffer = MEM_BASE1(ARCMSR_MESSAGE_RWBUFFER); |
---|
| 607 | +} |
---|
| 608 | + |
---|
| 609 | +static void arcmsr_hbaD_assign_regAddr(struct AdapterControlBlock *acb) |
---|
| 610 | +{ |
---|
| 611 | + struct MessageUnit_D *reg = acb->pmuD; |
---|
| 612 | + |
---|
| 613 | + reg->chip_id = MEM_BASE0(ARCMSR_ARC1214_CHIP_ID); |
---|
| 614 | + reg->cpu_mem_config = MEM_BASE0(ARCMSR_ARC1214_CPU_MEMORY_CONFIGURATION); |
---|
| 615 | + reg->i2o_host_interrupt_mask = MEM_BASE0(ARCMSR_ARC1214_I2_HOST_INTERRUPT_MASK); |
---|
| 616 | + reg->sample_at_reset = MEM_BASE0(ARCMSR_ARC1214_SAMPLE_RESET); |
---|
| 617 | + reg->reset_request = MEM_BASE0(ARCMSR_ARC1214_RESET_REQUEST); |
---|
| 618 | + reg->host_int_status = MEM_BASE0(ARCMSR_ARC1214_MAIN_INTERRUPT_STATUS); |
---|
| 619 | + reg->pcief0_int_enable = MEM_BASE0(ARCMSR_ARC1214_PCIE_F0_INTERRUPT_ENABLE); |
---|
| 620 | + reg->inbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE0); |
---|
| 621 | + reg->inbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE1); |
---|
| 622 | + reg->outbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE0); |
---|
| 623 | + reg->outbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE1); |
---|
| 624 | + reg->inbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_INBOUND_DOORBELL); |
---|
| 625 | + reg->outbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL); |
---|
| 626 | + reg->outbound_doorbell_enable = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL_ENABLE); |
---|
| 627 | + reg->inboundlist_base_low = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_LOW); |
---|
| 628 | + reg->inboundlist_base_high = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_HIGH); |
---|
| 629 | + reg->inboundlist_write_pointer = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_WRITE_POINTER); |
---|
| 630 | + reg->outboundlist_base_low = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_LOW); |
---|
| 631 | + reg->outboundlist_base_high = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_HIGH); |
---|
| 632 | + reg->outboundlist_copy_pointer = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_COPY_POINTER); |
---|
| 633 | + reg->outboundlist_read_pointer = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_READ_POINTER); |
---|
| 634 | + reg->outboundlist_interrupt_cause = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_INTERRUPT_CAUSE); |
---|
| 635 | + reg->outboundlist_interrupt_enable = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_INTERRUPT_ENABLE); |
---|
| 636 | + reg->message_wbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_WBUFFER); |
---|
| 637 | + reg->message_rbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_RBUFFER); |
---|
| 638 | + reg->msgcode_rwbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_RWBUFFER); |
---|
| 639 | +} |
---|
| 640 | + |
---|
| 641 | +static void arcmsr_hbaF_assign_regAddr(struct AdapterControlBlock *acb) |
---|
| 642 | +{ |
---|
| 643 | + dma_addr_t host_buffer_dma; |
---|
| 644 | + struct MessageUnit_F __iomem *pmuF; |
---|
| 645 | + |
---|
| 646 | + memset(acb->dma_coherent2, 0xff, acb->completeQ_size); |
---|
| 647 | + acb->message_wbuffer = (uint32_t *)round_up((unsigned long)acb->dma_coherent2 + |
---|
| 648 | + acb->completeQ_size, 4); |
---|
| 649 | + acb->message_rbuffer = ((void *)acb->message_wbuffer) + 0x100; |
---|
| 650 | + acb->msgcode_rwbuffer = ((void *)acb->message_wbuffer) + 0x200; |
---|
| 651 | + memset((void *)acb->message_wbuffer, 0, MESG_RW_BUFFER_SIZE); |
---|
| 652 | + host_buffer_dma = round_up(acb->dma_coherent_handle2 + acb->completeQ_size, 4); |
---|
| 653 | + pmuF = acb->pmuF; |
---|
| 654 | + /* host buffer low address, bit0:1 all buffer active */ |
---|
| 655 | + writel(lower_32_bits(host_buffer_dma | 1), &pmuF->inbound_msgaddr0); |
---|
| 656 | + /* host buffer high address */ |
---|
| 657 | + writel(upper_32_bits(host_buffer_dma), &pmuF->inbound_msgaddr1); |
---|
| 658 | + /* set host buffer physical address */ |
---|
| 659 | + writel(ARCMSR_HBFMU_DOORBELL_SYNC1, &pmuF->iobound_doorbell); |
---|
578 | 660 | } |
---|
579 | 661 | |
---|
580 | 662 | static bool arcmsr_alloc_io_queue(struct AdapterControlBlock *acb) |
---|
.. | .. |
---|
586 | 668 | |
---|
587 | 669 | switch (acb->adapter_type) { |
---|
588 | 670 | case ACB_ADAPTER_TYPE_B: { |
---|
589 | | - struct MessageUnit_B *reg; |
---|
590 | | - acb->roundup_ccbsize = roundup(sizeof(struct MessageUnit_B), 32); |
---|
591 | | - dma_coherent = dma_zalloc_coherent(&pdev->dev, acb->roundup_ccbsize, |
---|
| 671 | + acb->ioqueue_size = roundup(sizeof(struct MessageUnit_B), 32); |
---|
| 672 | + dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, |
---|
592 | 673 | &dma_coherent_handle, GFP_KERNEL); |
---|
593 | 674 | if (!dma_coherent) { |
---|
594 | 675 | pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); |
---|
.. | .. |
---|
596 | 677 | } |
---|
597 | 678 | acb->dma_coherent_handle2 = dma_coherent_handle; |
---|
598 | 679 | acb->dma_coherent2 = dma_coherent; |
---|
599 | | - reg = (struct MessageUnit_B *)dma_coherent; |
---|
600 | | - acb->pmuB = reg; |
---|
601 | | - if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) { |
---|
602 | | - reg->drv2iop_doorbell = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_1203); |
---|
603 | | - reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK_1203); |
---|
604 | | - reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_1203); |
---|
605 | | - reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK_1203); |
---|
606 | | - } else { |
---|
607 | | - reg->drv2iop_doorbell = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL); |
---|
608 | | - reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK); |
---|
609 | | - reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL); |
---|
610 | | - reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK); |
---|
611 | | - } |
---|
612 | | - reg->message_wbuffer = MEM_BASE1(ARCMSR_MESSAGE_WBUFFER); |
---|
613 | | - reg->message_rbuffer = MEM_BASE1(ARCMSR_MESSAGE_RBUFFER); |
---|
614 | | - reg->message_rwbuffer = MEM_BASE1(ARCMSR_MESSAGE_RWBUFFER); |
---|
| 680 | + acb->pmuB = (struct MessageUnit_B *)dma_coherent; |
---|
| 681 | + arcmsr_hbaB_assign_regAddr(acb); |
---|
615 | 682 | } |
---|
616 | 683 | break; |
---|
617 | 684 | case ACB_ADAPTER_TYPE_D: { |
---|
618 | | - struct MessageUnit_D *reg; |
---|
619 | | - |
---|
620 | | - acb->roundup_ccbsize = roundup(sizeof(struct MessageUnit_D), 32); |
---|
621 | | - dma_coherent = dma_zalloc_coherent(&pdev->dev, acb->roundup_ccbsize, |
---|
| 685 | + acb->ioqueue_size = roundup(sizeof(struct MessageUnit_D), 32); |
---|
| 686 | + dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, |
---|
622 | 687 | &dma_coherent_handle, GFP_KERNEL); |
---|
623 | 688 | if (!dma_coherent) { |
---|
624 | 689 | pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); |
---|
.. | .. |
---|
626 | 691 | } |
---|
627 | 692 | acb->dma_coherent_handle2 = dma_coherent_handle; |
---|
628 | 693 | acb->dma_coherent2 = dma_coherent; |
---|
629 | | - reg = (struct MessageUnit_D *)dma_coherent; |
---|
630 | | - acb->pmuD = reg; |
---|
631 | | - reg->chip_id = MEM_BASE0(ARCMSR_ARC1214_CHIP_ID); |
---|
632 | | - reg->cpu_mem_config = MEM_BASE0(ARCMSR_ARC1214_CPU_MEMORY_CONFIGURATION); |
---|
633 | | - reg->i2o_host_interrupt_mask = MEM_BASE0(ARCMSR_ARC1214_I2_HOST_INTERRUPT_MASK); |
---|
634 | | - reg->sample_at_reset = MEM_BASE0(ARCMSR_ARC1214_SAMPLE_RESET); |
---|
635 | | - reg->reset_request = MEM_BASE0(ARCMSR_ARC1214_RESET_REQUEST); |
---|
636 | | - reg->host_int_status = MEM_BASE0(ARCMSR_ARC1214_MAIN_INTERRUPT_STATUS); |
---|
637 | | - reg->pcief0_int_enable = MEM_BASE0(ARCMSR_ARC1214_PCIE_F0_INTERRUPT_ENABLE); |
---|
638 | | - reg->inbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE0); |
---|
639 | | - reg->inbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE1); |
---|
640 | | - reg->outbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE0); |
---|
641 | | - reg->outbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE1); |
---|
642 | | - reg->inbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_INBOUND_DOORBELL); |
---|
643 | | - reg->outbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL); |
---|
644 | | - reg->outbound_doorbell_enable = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL_ENABLE); |
---|
645 | | - reg->inboundlist_base_low = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_LOW); |
---|
646 | | - reg->inboundlist_base_high = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_HIGH); |
---|
647 | | - reg->inboundlist_write_pointer = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_WRITE_POINTER); |
---|
648 | | - reg->outboundlist_base_low = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_LOW); |
---|
649 | | - reg->outboundlist_base_high = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_HIGH); |
---|
650 | | - reg->outboundlist_copy_pointer = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_COPY_POINTER); |
---|
651 | | - reg->outboundlist_read_pointer = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_READ_POINTER); |
---|
652 | | - reg->outboundlist_interrupt_cause = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_INTERRUPT_CAUSE); |
---|
653 | | - reg->outboundlist_interrupt_enable = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_INTERRUPT_ENABLE); |
---|
654 | | - reg->message_wbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_WBUFFER); |
---|
655 | | - reg->message_rbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_RBUFFER); |
---|
656 | | - reg->msgcode_rwbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_RWBUFFER); |
---|
| 694 | + acb->pmuD = (struct MessageUnit_D *)dma_coherent; |
---|
| 695 | + arcmsr_hbaD_assign_regAddr(acb); |
---|
657 | 696 | } |
---|
658 | 697 | break; |
---|
659 | 698 | case ACB_ADAPTER_TYPE_E: { |
---|
660 | 699 | uint32_t completeQ_size; |
---|
661 | 700 | completeQ_size = sizeof(struct deliver_completeQ) * ARCMSR_MAX_HBE_DONEQUEUE + 128; |
---|
662 | | - acb->roundup_ccbsize = roundup(completeQ_size, 32); |
---|
663 | | - dma_coherent = dma_zalloc_coherent(&pdev->dev, acb->roundup_ccbsize, |
---|
| 701 | + acb->ioqueue_size = roundup(completeQ_size, 32); |
---|
| 702 | + dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, |
---|
664 | 703 | &dma_coherent_handle, GFP_KERNEL); |
---|
665 | 704 | if (!dma_coherent){ |
---|
666 | 705 | pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); |
---|
.. | .. |
---|
669 | 708 | acb->dma_coherent_handle2 = dma_coherent_handle; |
---|
670 | 709 | acb->dma_coherent2 = dma_coherent; |
---|
671 | 710 | acb->pCompletionQ = dma_coherent; |
---|
672 | | - acb->completionQ_entry = acb->roundup_ccbsize / sizeof(struct deliver_completeQ); |
---|
| 711 | + acb->completionQ_entry = acb->ioqueue_size / sizeof(struct deliver_completeQ); |
---|
673 | 712 | acb->doneq_index = 0; |
---|
| 713 | + } |
---|
| 714 | + break; |
---|
| 715 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 716 | + uint32_t QueueDepth; |
---|
| 717 | + uint32_t depthTbl[] = {256, 512, 1024, 128, 64, 32}; |
---|
| 718 | + |
---|
| 719 | + arcmsr_wait_firmware_ready(acb); |
---|
| 720 | + QueueDepth = depthTbl[readl(&acb->pmuF->outbound_msgaddr1) & 7]; |
---|
| 721 | + acb->completeQ_size = sizeof(struct deliver_completeQ) * QueueDepth + 128; |
---|
| 722 | + acb->ioqueue_size = roundup(acb->completeQ_size + MESG_RW_BUFFER_SIZE, 32); |
---|
| 723 | + dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size, |
---|
| 724 | + &dma_coherent_handle, GFP_KERNEL); |
---|
| 725 | + if (!dma_coherent) { |
---|
| 726 | + pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no); |
---|
| 727 | + return false; |
---|
| 728 | + } |
---|
| 729 | + acb->dma_coherent_handle2 = dma_coherent_handle; |
---|
| 730 | + acb->dma_coherent2 = dma_coherent; |
---|
| 731 | + acb->pCompletionQ = dma_coherent; |
---|
| 732 | + acb->completionQ_entry = acb->completeQ_size / sizeof(struct deliver_completeQ); |
---|
| 733 | + acb->doneq_index = 0; |
---|
| 734 | + arcmsr_hbaF_assign_regAddr(acb); |
---|
674 | 735 | } |
---|
675 | 736 | break; |
---|
676 | 737 | default: |
---|
.. | .. |
---|
686 | 747 | dma_addr_t dma_coherent_handle; |
---|
687 | 748 | struct CommandControlBlock *ccb_tmp; |
---|
688 | 749 | int i = 0, j = 0; |
---|
689 | | - dma_addr_t cdb_phyaddr; |
---|
| 750 | + unsigned long cdb_phyaddr, next_ccb_phy; |
---|
690 | 751 | unsigned long roundup_ccbsize; |
---|
691 | 752 | unsigned long max_xfer_len; |
---|
692 | 753 | unsigned long max_sg_entrys; |
---|
693 | | - uint32_t firm_config_version; |
---|
| 754 | + uint32_t firm_config_version, curr_phy_upper32; |
---|
694 | 755 | |
---|
695 | 756 | for (i = 0; i < ARCMSR_MAX_TARGETID; i++) |
---|
696 | 757 | for (j = 0; j < ARCMSR_MAX_TARGETLUN; j++) |
---|
.. | .. |
---|
707 | 768 | acb->host->sg_tablesize = max_sg_entrys; |
---|
708 | 769 | roundup_ccbsize = roundup(sizeof(struct CommandControlBlock) + (max_sg_entrys - 1) * sizeof(struct SG64ENTRY), 32); |
---|
709 | 770 | acb->uncache_size = roundup_ccbsize * acb->maxFreeCCB; |
---|
| 771 | + if (acb->adapter_type != ACB_ADAPTER_TYPE_F) |
---|
| 772 | + acb->uncache_size += acb->ioqueue_size; |
---|
710 | 773 | dma_coherent = dma_alloc_coherent(&pdev->dev, acb->uncache_size, &dma_coherent_handle, GFP_KERNEL); |
---|
711 | 774 | if(!dma_coherent){ |
---|
712 | 775 | printk(KERN_NOTICE "arcmsr%d: dma_alloc_coherent got error\n", acb->host->host_no); |
---|
.. | .. |
---|
717 | 780 | memset(dma_coherent, 0, acb->uncache_size); |
---|
718 | 781 | acb->ccbsize = roundup_ccbsize; |
---|
719 | 782 | ccb_tmp = dma_coherent; |
---|
| 783 | + curr_phy_upper32 = upper_32_bits(dma_coherent_handle); |
---|
720 | 784 | acb->vir2phy_offset = (unsigned long)dma_coherent - (unsigned long)dma_coherent_handle; |
---|
721 | 785 | for(i = 0; i < acb->maxFreeCCB; i++){ |
---|
722 | | - cdb_phyaddr = dma_coherent_handle + offsetof(struct CommandControlBlock, arcmsr_cdb); |
---|
| 786 | + cdb_phyaddr = (unsigned long)dma_coherent_handle + offsetof(struct CommandControlBlock, arcmsr_cdb); |
---|
723 | 787 | switch (acb->adapter_type) { |
---|
724 | 788 | case ACB_ADAPTER_TYPE_A: |
---|
725 | 789 | case ACB_ADAPTER_TYPE_B: |
---|
.. | .. |
---|
728 | 792 | case ACB_ADAPTER_TYPE_C: |
---|
729 | 793 | case ACB_ADAPTER_TYPE_D: |
---|
730 | 794 | case ACB_ADAPTER_TYPE_E: |
---|
| 795 | + case ACB_ADAPTER_TYPE_F: |
---|
731 | 796 | ccb_tmp->cdb_phyaddr = cdb_phyaddr; |
---|
732 | 797 | break; |
---|
733 | 798 | } |
---|
.. | .. |
---|
735 | 800 | ccb_tmp->acb = acb; |
---|
736 | 801 | ccb_tmp->smid = (u32)i << 16; |
---|
737 | 802 | INIT_LIST_HEAD(&ccb_tmp->list); |
---|
738 | | - list_add_tail(&ccb_tmp->list, &acb->ccb_free_list); |
---|
| 803 | + next_ccb_phy = dma_coherent_handle + roundup_ccbsize; |
---|
| 804 | + if (upper_32_bits(next_ccb_phy) != curr_phy_upper32) { |
---|
| 805 | + acb->maxFreeCCB = i; |
---|
| 806 | + acb->host->can_queue = i; |
---|
| 807 | + break; |
---|
| 808 | + } |
---|
| 809 | + else |
---|
| 810 | + list_add_tail(&ccb_tmp->list, &acb->ccb_free_list); |
---|
739 | 811 | ccb_tmp = (struct CommandControlBlock *)((unsigned long)ccb_tmp + roundup_ccbsize); |
---|
740 | | - dma_coherent_handle = dma_coherent_handle + roundup_ccbsize; |
---|
| 812 | + dma_coherent_handle = next_ccb_phy; |
---|
741 | 813 | } |
---|
| 814 | + if (acb->adapter_type != ACB_ADAPTER_TYPE_F) { |
---|
| 815 | + acb->dma_coherent_handle2 = dma_coherent_handle; |
---|
| 816 | + acb->dma_coherent2 = ccb_tmp; |
---|
| 817 | + } |
---|
| 818 | + switch (acb->adapter_type) { |
---|
| 819 | + case ACB_ADAPTER_TYPE_B: |
---|
| 820 | + acb->pmuB = (struct MessageUnit_B *)acb->dma_coherent2; |
---|
| 821 | + arcmsr_hbaB_assign_regAddr(acb); |
---|
| 822 | + break; |
---|
| 823 | + case ACB_ADAPTER_TYPE_D: |
---|
| 824 | + acb->pmuD = (struct MessageUnit_D *)acb->dma_coherent2; |
---|
| 825 | + arcmsr_hbaD_assign_regAddr(acb); |
---|
| 826 | + break; |
---|
| 827 | + case ACB_ADAPTER_TYPE_E: |
---|
| 828 | + acb->pCompletionQ = acb->dma_coherent2; |
---|
| 829 | + acb->completionQ_entry = acb->ioqueue_size / sizeof(struct deliver_completeQ); |
---|
| 830 | + acb->doneq_index = 0; |
---|
| 831 | + break; |
---|
| 832 | + } |
---|
742 | 833 | return 0; |
---|
743 | 834 | } |
---|
744 | 835 | |
---|
.. | .. |
---|
753 | 844 | struct scsi_device *psdev; |
---|
754 | 845 | char diff, temp; |
---|
755 | 846 | |
---|
756 | | - acb->acb_flags &= ~ACB_F_MSG_GET_CONFIG; |
---|
757 | 847 | switch (acb->adapter_type) { |
---|
758 | 848 | case ACB_ADAPTER_TYPE_A: { |
---|
759 | 849 | struct MessageUnit_A __iomem *reg = acb->pmuA; |
---|
.. | .. |
---|
790 | 880 | devicemap = (char __iomem *)(®->msgcode_rwbuffer[21]); |
---|
791 | 881 | break; |
---|
792 | 882 | } |
---|
| 883 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 884 | + signature = (uint32_t __iomem *)(&acb->msgcode_rwbuffer[0]); |
---|
| 885 | + devicemap = (char __iomem *)(&acb->msgcode_rwbuffer[21]); |
---|
| 886 | + break; |
---|
| 887 | + } |
---|
793 | 888 | } |
---|
794 | | - atomic_inc(&acb->rq_map_token); |
---|
795 | 889 | if (readl(signature) != ARCMSR_SIGNATURE_GET_CONFIG) |
---|
796 | 890 | return; |
---|
797 | 891 | for (target = 0; target < ARCMSR_MAX_TARGETID - 1; |
---|
.. | .. |
---|
822 | 916 | devicemap++; |
---|
823 | 917 | acb_dev_map++; |
---|
824 | 918 | } |
---|
| 919 | + acb->acb_flags &= ~ACB_F_MSG_GET_CONFIG; |
---|
825 | 920 | } |
---|
826 | 921 | |
---|
827 | 922 | static int |
---|
.. | .. |
---|
874 | 969 | static void arcmsr_init_get_devmap_timer(struct AdapterControlBlock *pacb) |
---|
875 | 970 | { |
---|
876 | 971 | INIT_WORK(&pacb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn); |
---|
877 | | - atomic_set(&pacb->rq_map_token, 16); |
---|
878 | | - atomic_set(&pacb->ante_token_value, 16); |
---|
879 | 972 | pacb->fw_flag = FW_NORMAL; |
---|
880 | 973 | timer_setup(&pacb->eternal_timer, arcmsr_request_device_map, 0); |
---|
881 | 974 | pacb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ); |
---|
.. | .. |
---|
887 | 980 | timer_setup(&pacb->refresh_timer, arcmsr_set_iop_datetime, 0); |
---|
888 | 981 | pacb->refresh_timer.expires = jiffies + msecs_to_jiffies(60 * 1000); |
---|
889 | 982 | add_timer(&pacb->refresh_timer); |
---|
| 983 | +} |
---|
| 984 | + |
---|
| 985 | +static int arcmsr_set_dma_mask(struct AdapterControlBlock *acb) |
---|
| 986 | +{ |
---|
| 987 | + struct pci_dev *pcidev = acb->pdev; |
---|
| 988 | + |
---|
| 989 | + if (IS_DMA64) { |
---|
| 990 | + if (((acb->adapter_type == ACB_ADAPTER_TYPE_A) && !dma_mask_64) || |
---|
| 991 | + dma_set_mask(&pcidev->dev, DMA_BIT_MASK(64))) |
---|
| 992 | + goto dma32; |
---|
| 993 | + if (dma_set_coherent_mask(&pcidev->dev, DMA_BIT_MASK(64)) || |
---|
| 994 | + dma_set_mask_and_coherent(&pcidev->dev, DMA_BIT_MASK(64))) { |
---|
| 995 | + printk("arcmsr: set DMA 64 mask failed\n"); |
---|
| 996 | + return -ENXIO; |
---|
| 997 | + } |
---|
| 998 | + } else { |
---|
| 999 | +dma32: |
---|
| 1000 | + if (dma_set_mask(&pcidev->dev, DMA_BIT_MASK(32)) || |
---|
| 1001 | + dma_set_coherent_mask(&pcidev->dev, DMA_BIT_MASK(32)) || |
---|
| 1002 | + dma_set_mask_and_coherent(&pcidev->dev, DMA_BIT_MASK(32))) { |
---|
| 1003 | + printk("arcmsr: set DMA 32-bit mask failed\n"); |
---|
| 1004 | + return -ENXIO; |
---|
| 1005 | + } |
---|
| 1006 | + } |
---|
| 1007 | + return 0; |
---|
890 | 1008 | } |
---|
891 | 1009 | |
---|
892 | 1010 | static int arcmsr_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
---|
.. | .. |
---|
903 | 1021 | if(!host){ |
---|
904 | 1022 | goto pci_disable_dev; |
---|
905 | 1023 | } |
---|
906 | | - error = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); |
---|
907 | | - if(error){ |
---|
908 | | - error = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
---|
909 | | - if(error){ |
---|
910 | | - printk(KERN_WARNING |
---|
911 | | - "scsi%d: No suitable DMA mask available\n", |
---|
912 | | - host->host_no); |
---|
913 | | - goto scsi_host_release; |
---|
914 | | - } |
---|
915 | | - } |
---|
916 | 1024 | init_waitqueue_head(&wait_q); |
---|
917 | 1025 | bus = pdev->bus->number; |
---|
918 | 1026 | dev_fun = pdev->devfn; |
---|
919 | 1027 | acb = (struct AdapterControlBlock *) host->hostdata; |
---|
920 | 1028 | memset(acb,0,sizeof(struct AdapterControlBlock)); |
---|
921 | 1029 | acb->pdev = pdev; |
---|
| 1030 | + acb->adapter_type = id->driver_data; |
---|
| 1031 | + if (arcmsr_set_dma_mask(acb)) |
---|
| 1032 | + goto scsi_host_release; |
---|
922 | 1033 | acb->host = host; |
---|
923 | 1034 | host->max_lun = ARCMSR_MAX_TARGETLUN; |
---|
924 | 1035 | host->max_id = ARCMSR_MAX_TARGETID; /*16:8*/ |
---|
.. | .. |
---|
948 | 1059 | ACB_F_MESSAGE_WQBUFFER_READED); |
---|
949 | 1060 | acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER; |
---|
950 | 1061 | INIT_LIST_HEAD(&acb->ccb_free_list); |
---|
951 | | - acb->adapter_type = id->driver_data; |
---|
952 | 1062 | error = arcmsr_remap_pciregion(acb); |
---|
953 | 1063 | if(!error){ |
---|
954 | 1064 | goto pci_release_regs; |
---|
.. | .. |
---|
960 | 1070 | if(!error){ |
---|
961 | 1071 | goto free_hbb_mu; |
---|
962 | 1072 | } |
---|
| 1073 | + if (acb->adapter_type != ACB_ADAPTER_TYPE_F) |
---|
| 1074 | + arcmsr_free_io_queue(acb); |
---|
963 | 1075 | error = arcmsr_alloc_ccb_pool(acb); |
---|
964 | 1076 | if(error){ |
---|
965 | | - goto free_hbb_mu; |
---|
| 1077 | + goto unmap_pci_region; |
---|
966 | 1078 | } |
---|
967 | 1079 | error = scsi_add_host(host, &pdev->dev); |
---|
968 | 1080 | if(error){ |
---|
.. | .. |
---|
990 | 1102 | scsi_remove_host(host); |
---|
991 | 1103 | free_ccb_pool: |
---|
992 | 1104 | arcmsr_free_ccb_pool(acb); |
---|
| 1105 | + goto unmap_pci_region; |
---|
993 | 1106 | free_hbb_mu: |
---|
994 | | - arcmsr_free_mu(acb); |
---|
| 1107 | + arcmsr_free_io_queue(acb); |
---|
995 | 1108 | unmap_pci_region: |
---|
996 | 1109 | arcmsr_unmap_pciregion(acb); |
---|
997 | 1110 | pci_release_regs: |
---|
.. | .. |
---|
1015 | 1128 | |
---|
1016 | 1129 | static int arcmsr_suspend(struct pci_dev *pdev, pm_message_t state) |
---|
1017 | 1130 | { |
---|
1018 | | - uint32_t intmask_org; |
---|
1019 | 1131 | struct Scsi_Host *host = pci_get_drvdata(pdev); |
---|
1020 | 1132 | struct AdapterControlBlock *acb = |
---|
1021 | 1133 | (struct AdapterControlBlock *)host->hostdata; |
---|
1022 | 1134 | |
---|
1023 | | - intmask_org = arcmsr_disable_outbound_ints(acb); |
---|
| 1135 | + arcmsr_disable_outbound_ints(acb); |
---|
1024 | 1136 | arcmsr_free_irq(pdev, acb); |
---|
1025 | 1137 | del_timer_sync(&acb->eternal_timer); |
---|
1026 | 1138 | if (set_date_time) |
---|
.. | .. |
---|
1037 | 1149 | |
---|
1038 | 1150 | static int arcmsr_resume(struct pci_dev *pdev) |
---|
1039 | 1151 | { |
---|
1040 | | - int error; |
---|
1041 | 1152 | struct Scsi_Host *host = pci_get_drvdata(pdev); |
---|
1042 | 1153 | struct AdapterControlBlock *acb = |
---|
1043 | 1154 | (struct AdapterControlBlock *)host->hostdata; |
---|
.. | .. |
---|
1049 | 1160 | pr_warn("%s: pci_enable_device error\n", __func__); |
---|
1050 | 1161 | return -ENODEV; |
---|
1051 | 1162 | } |
---|
1052 | | - error = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); |
---|
1053 | | - if (error) { |
---|
1054 | | - error = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
---|
1055 | | - if (error) { |
---|
1056 | | - pr_warn("scsi%d: No suitable DMA mask available\n", |
---|
1057 | | - host->host_no); |
---|
1058 | | - goto controller_unregister; |
---|
1059 | | - } |
---|
1060 | | - } |
---|
| 1163 | + if (arcmsr_set_dma_mask(acb)) |
---|
| 1164 | + goto controller_unregister; |
---|
1061 | 1165 | pci_set_master(pdev); |
---|
1062 | 1166 | if (arcmsr_request_irq(pdev, acb) == FAILED) |
---|
1063 | 1167 | goto controller_stop; |
---|
1064 | | - if (acb->adapter_type == ACB_ADAPTER_TYPE_E) { |
---|
| 1168 | + switch (acb->adapter_type) { |
---|
| 1169 | + case ACB_ADAPTER_TYPE_B: { |
---|
| 1170 | + struct MessageUnit_B *reg = acb->pmuB; |
---|
| 1171 | + uint32_t i; |
---|
| 1172 | + for (i = 0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) { |
---|
| 1173 | + reg->post_qbuffer[i] = 0; |
---|
| 1174 | + reg->done_qbuffer[i] = 0; |
---|
| 1175 | + } |
---|
| 1176 | + reg->postq_index = 0; |
---|
| 1177 | + reg->doneq_index = 0; |
---|
| 1178 | + break; |
---|
| 1179 | + } |
---|
| 1180 | + case ACB_ADAPTER_TYPE_E: |
---|
1065 | 1181 | writel(0, &acb->pmuE->host_int_status); |
---|
1066 | 1182 | writel(ARCMSR_HBEMU_DOORBELL_SYNC, &acb->pmuE->iobound_doorbell); |
---|
1067 | 1183 | acb->in_doorbell = 0; |
---|
1068 | 1184 | acb->out_doorbell = 0; |
---|
1069 | 1185 | acb->doneq_index = 0; |
---|
| 1186 | + break; |
---|
| 1187 | + case ACB_ADAPTER_TYPE_F: |
---|
| 1188 | + writel(0, &acb->pmuF->host_int_status); |
---|
| 1189 | + writel(ARCMSR_HBFMU_DOORBELL_SYNC, &acb->pmuF->iobound_doorbell); |
---|
| 1190 | + acb->in_doorbell = 0; |
---|
| 1191 | + acb->out_doorbell = 0; |
---|
| 1192 | + acb->doneq_index = 0; |
---|
| 1193 | + arcmsr_hbaF_assign_regAddr(acb); |
---|
| 1194 | + break; |
---|
1070 | 1195 | } |
---|
1071 | 1196 | arcmsr_iop_init(acb); |
---|
1072 | 1197 | arcmsr_init_get_devmap_timer(acb); |
---|
.. | .. |
---|
1079 | 1204 | controller_unregister: |
---|
1080 | 1205 | scsi_remove_host(host); |
---|
1081 | 1206 | arcmsr_free_ccb_pool(acb); |
---|
| 1207 | + if (acb->adapter_type == ACB_ADAPTER_TYPE_F) |
---|
| 1208 | + arcmsr_free_io_queue(acb); |
---|
1082 | 1209 | arcmsr_unmap_pciregion(acb); |
---|
1083 | 1210 | pci_release_regions(pdev); |
---|
1084 | 1211 | scsi_host_put(host); |
---|
.. | .. |
---|
1158 | 1285 | { |
---|
1159 | 1286 | uint8_t rtnval = 0; |
---|
1160 | 1287 | switch (acb->adapter_type) { |
---|
1161 | | - case ACB_ADAPTER_TYPE_A: { |
---|
| 1288 | + case ACB_ADAPTER_TYPE_A: |
---|
1162 | 1289 | rtnval = arcmsr_hbaA_abort_allcmd(acb); |
---|
1163 | | - } |
---|
1164 | 1290 | break; |
---|
1165 | | - |
---|
1166 | | - case ACB_ADAPTER_TYPE_B: { |
---|
| 1291 | + case ACB_ADAPTER_TYPE_B: |
---|
1167 | 1292 | rtnval = arcmsr_hbaB_abort_allcmd(acb); |
---|
1168 | | - } |
---|
1169 | 1293 | break; |
---|
1170 | | - |
---|
1171 | | - case ACB_ADAPTER_TYPE_C: { |
---|
| 1294 | + case ACB_ADAPTER_TYPE_C: |
---|
1172 | 1295 | rtnval = arcmsr_hbaC_abort_allcmd(acb); |
---|
1173 | | - } |
---|
1174 | 1296 | break; |
---|
1175 | | - |
---|
1176 | 1297 | case ACB_ADAPTER_TYPE_D: |
---|
1177 | 1298 | rtnval = arcmsr_hbaD_abort_allcmd(acb); |
---|
1178 | 1299 | break; |
---|
1179 | 1300 | case ACB_ADAPTER_TYPE_E: |
---|
| 1301 | + case ACB_ADAPTER_TYPE_F: |
---|
1180 | 1302 | rtnval = arcmsr_hbaE_abort_allcmd(acb); |
---|
1181 | 1303 | break; |
---|
1182 | 1304 | } |
---|
.. | .. |
---|
1252 | 1374 | writel(ARCMSR_ARC1214_ALL_INT_DISABLE, reg->pcief0_int_enable); |
---|
1253 | 1375 | } |
---|
1254 | 1376 | break; |
---|
1255 | | - case ACB_ADAPTER_TYPE_E: { |
---|
| 1377 | + case ACB_ADAPTER_TYPE_E: |
---|
| 1378 | + case ACB_ADAPTER_TYPE_F: { |
---|
1256 | 1379 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
1257 | 1380 | orig_mask = readl(®->host_int_mask); |
---|
1258 | 1381 | writel(orig_mask | ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR | ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR, ®->host_int_mask); |
---|
.. | .. |
---|
1317 | 1440 | |
---|
1318 | 1441 | static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, struct CommandControlBlock *pCCB, bool error) |
---|
1319 | 1442 | { |
---|
1320 | | - int id, lun; |
---|
1321 | 1443 | if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) { |
---|
1322 | 1444 | if (pCCB->startdone == ARCMSR_CCB_ABORTED) { |
---|
1323 | 1445 | struct scsi_cmnd *abortcmd = pCCB->pcmd; |
---|
1324 | 1446 | if (abortcmd) { |
---|
1325 | | - id = abortcmd->device->id; |
---|
1326 | | - lun = abortcmd->device->lun; |
---|
1327 | 1447 | abortcmd->result |= DID_ABORT << 16; |
---|
1328 | 1448 | arcmsr_ccb_complete(pCCB); |
---|
1329 | 1449 | printk(KERN_NOTICE "arcmsr%d: pCCB ='0x%p' isr got aborted command \n", |
---|
.. | .. |
---|
1341 | 1461 | , pCCB->acb |
---|
1342 | 1462 | , pCCB->startdone |
---|
1343 | 1463 | , atomic_read(&acb->ccboutstandingcount)); |
---|
1344 | | - return; |
---|
| 1464 | + return; |
---|
1345 | 1465 | } |
---|
1346 | 1466 | arcmsr_report_ccb_state(acb, pCCB, error); |
---|
1347 | 1467 | } |
---|
.. | .. |
---|
1349 | 1469 | static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb) |
---|
1350 | 1470 | { |
---|
1351 | 1471 | int i = 0; |
---|
1352 | | - uint32_t flag_ccb, ccb_cdb_phy; |
---|
| 1472 | + uint32_t flag_ccb; |
---|
1353 | 1473 | struct ARCMSR_CDB *pARCMSR_CDB; |
---|
1354 | 1474 | bool error; |
---|
1355 | 1475 | struct CommandControlBlock *pCCB; |
---|
| 1476 | + unsigned long ccb_cdb_phy; |
---|
| 1477 | + |
---|
1356 | 1478 | switch (acb->adapter_type) { |
---|
1357 | 1479 | |
---|
1358 | 1480 | case ACB_ADAPTER_TYPE_A: { |
---|
.. | .. |
---|
1364 | 1486 | writel(outbound_intstatus, ®->outbound_intstatus);/*clear interrupt*/ |
---|
1365 | 1487 | while(((flag_ccb = readl(®->outbound_queueport)) != 0xFFFFFFFF) |
---|
1366 | 1488 | && (i++ < acb->maxOutstanding)) { |
---|
1367 | | - pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + (flag_ccb << 5));/*frame must be 32 bytes aligned*/ |
---|
| 1489 | + ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff; |
---|
| 1490 | + if (acb->cdb_phyadd_hipart) |
---|
| 1491 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
| 1492 | + pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); |
---|
1368 | 1493 | pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb); |
---|
1369 | 1494 | error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false; |
---|
1370 | 1495 | arcmsr_drain_donequeue(acb, pCCB, error); |
---|
.. | .. |
---|
1380 | 1505 | flag_ccb = reg->done_qbuffer[i]; |
---|
1381 | 1506 | if (flag_ccb != 0) { |
---|
1382 | 1507 | reg->done_qbuffer[i] = 0; |
---|
1383 | | - pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset+(flag_ccb << 5));/*frame must be 32 bytes aligned*/ |
---|
| 1508 | + ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff; |
---|
| 1509 | + if (acb->cdb_phyadd_hipart) |
---|
| 1510 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
| 1511 | + pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); |
---|
1384 | 1512 | pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb); |
---|
1385 | 1513 | error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false; |
---|
1386 | 1514 | arcmsr_drain_donequeue(acb, pCCB, error); |
---|
.. | .. |
---|
1397 | 1525 | /*need to do*/ |
---|
1398 | 1526 | flag_ccb = readl(®->outbound_queueport_low); |
---|
1399 | 1527 | ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0); |
---|
1400 | | - pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset+ccb_cdb_phy);/*frame must be 32 bytes aligned*/ |
---|
| 1528 | + if (acb->cdb_phyadd_hipart) |
---|
| 1529 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
| 1530 | + pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); |
---|
1401 | 1531 | pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb); |
---|
1402 | 1532 | error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ? true : false; |
---|
1403 | 1533 | arcmsr_drain_donequeue(acb, pCCB, error); |
---|
.. | .. |
---|
1428 | 1558 | addressLow = pmu->done_qbuffer[doneq_index & |
---|
1429 | 1559 | 0xFFF].addressLow; |
---|
1430 | 1560 | ccb_cdb_phy = (addressLow & 0xFFFFFFF0); |
---|
| 1561 | + if (acb->cdb_phyadd_hipart) |
---|
| 1562 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
1431 | 1563 | pARCMSR_CDB = (struct ARCMSR_CDB *) |
---|
1432 | 1564 | (acb->vir2phy_offset + ccb_cdb_phy); |
---|
1433 | 1565 | pCCB = container_of(pARCMSR_CDB, |
---|
.. | .. |
---|
1449 | 1581 | break; |
---|
1450 | 1582 | case ACB_ADAPTER_TYPE_E: |
---|
1451 | 1583 | arcmsr_hbaE_postqueue_isr(acb); |
---|
| 1584 | + break; |
---|
| 1585 | + case ACB_ADAPTER_TYPE_F: |
---|
| 1586 | + arcmsr_hbaF_postqueue_isr(acb); |
---|
1452 | 1587 | break; |
---|
1453 | 1588 | } |
---|
1454 | 1589 | } |
---|
.. | .. |
---|
1504 | 1639 | pdev = acb->pdev; |
---|
1505 | 1640 | arcmsr_free_irq(pdev, acb); |
---|
1506 | 1641 | arcmsr_free_ccb_pool(acb); |
---|
1507 | | - arcmsr_free_mu(acb); |
---|
| 1642 | + if (acb->adapter_type == ACB_ADAPTER_TYPE_F) |
---|
| 1643 | + arcmsr_free_io_queue(acb); |
---|
1508 | 1644 | arcmsr_unmap_pciregion(acb); |
---|
1509 | 1645 | pci_release_regions(pdev); |
---|
1510 | 1646 | scsi_host_put(host); |
---|
.. | .. |
---|
1562 | 1698 | } |
---|
1563 | 1699 | arcmsr_free_irq(pdev, acb); |
---|
1564 | 1700 | arcmsr_free_ccb_pool(acb); |
---|
1565 | | - arcmsr_free_mu(acb); |
---|
| 1701 | + if (acb->adapter_type == ACB_ADAPTER_TYPE_F) |
---|
| 1702 | + arcmsr_free_io_queue(acb); |
---|
1566 | 1703 | arcmsr_unmap_pciregion(acb); |
---|
1567 | 1704 | pci_release_regions(pdev); |
---|
1568 | 1705 | scsi_host_put(host); |
---|
.. | .. |
---|
1640 | 1777 | writel(intmask_org | mask, reg->pcief0_int_enable); |
---|
1641 | 1778 | break; |
---|
1642 | 1779 | } |
---|
1643 | | - case ACB_ADAPTER_TYPE_E: { |
---|
| 1780 | + case ACB_ADAPTER_TYPE_E: |
---|
| 1781 | + case ACB_ADAPTER_TYPE_F: { |
---|
1644 | 1782 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
1645 | 1783 | |
---|
1646 | 1784 | mask = ~(ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR | ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR); |
---|
.. | .. |
---|
1747 | 1885 | |
---|
1748 | 1886 | arc_cdb_size = (ccb->arc_cdb_size > 0x300) ? 0x300 : ccb->arc_cdb_size; |
---|
1749 | 1887 | ccb_post_stamp = (cdb_phyaddr | ((arc_cdb_size - 1) >> 6) | 1); |
---|
1750 | | - if (acb->cdb_phyaddr_hi32) { |
---|
1751 | | - writel(acb->cdb_phyaddr_hi32, &phbcmu->inbound_queueport_high); |
---|
1752 | | - writel(ccb_post_stamp, &phbcmu->inbound_queueport_low); |
---|
1753 | | - } else { |
---|
1754 | | - writel(ccb_post_stamp, &phbcmu->inbound_queueport_low); |
---|
1755 | | - } |
---|
| 1888 | + writel(upper_32_bits(ccb->cdb_phyaddr), &phbcmu->inbound_queueport_high); |
---|
| 1889 | + writel(ccb_post_stamp, &phbcmu->inbound_queueport_low); |
---|
1756 | 1890 | } |
---|
1757 | 1891 | break; |
---|
1758 | 1892 | case ACB_ADAPTER_TYPE_D: { |
---|
.. | .. |
---|
1765 | 1899 | spin_lock_irqsave(&acb->postq_lock, flags); |
---|
1766 | 1900 | postq_index = pmu->postq_index; |
---|
1767 | 1901 | pinbound_srb = (struct InBound_SRB *)&(pmu->post_qbuffer[postq_index & 0xFF]); |
---|
1768 | | - pinbound_srb->addressHigh = dma_addr_hi32(cdb_phyaddr); |
---|
1769 | | - pinbound_srb->addressLow = dma_addr_lo32(cdb_phyaddr); |
---|
| 1902 | + pinbound_srb->addressHigh = upper_32_bits(ccb->cdb_phyaddr); |
---|
| 1903 | + pinbound_srb->addressLow = cdb_phyaddr; |
---|
1770 | 1904 | pinbound_srb->length = ccb->arc_cdb_size >> 2; |
---|
1771 | 1905 | arcmsr_cdb->msgContext = dma_addr_lo32(cdb_phyaddr); |
---|
1772 | 1906 | toggle = postq_index & 0x4000; |
---|
.. | .. |
---|
1788 | 1922 | writel(ccb_post_stamp, &pmu->inbound_queueport_low); |
---|
1789 | 1923 | break; |
---|
1790 | 1924 | } |
---|
| 1925 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 1926 | + struct MessageUnit_F __iomem *pmu = acb->pmuF; |
---|
| 1927 | + u32 ccb_post_stamp, arc_cdb_size; |
---|
| 1928 | + |
---|
| 1929 | + if (ccb->arc_cdb_size <= 0x300) |
---|
| 1930 | + arc_cdb_size = (ccb->arc_cdb_size - 1) >> 6 | 1; |
---|
| 1931 | + else { |
---|
| 1932 | + arc_cdb_size = ((ccb->arc_cdb_size + 0xff) >> 8) + 2; |
---|
| 1933 | + if (arc_cdb_size > 0xF) |
---|
| 1934 | + arc_cdb_size = 0xF; |
---|
| 1935 | + arc_cdb_size = (arc_cdb_size << 1) | 1; |
---|
| 1936 | + } |
---|
| 1937 | + ccb_post_stamp = (ccb->smid | arc_cdb_size); |
---|
| 1938 | + writel(0, &pmu->inbound_queueport_high); |
---|
| 1939 | + writel(ccb_post_stamp, &pmu->inbound_queueport_low); |
---|
| 1940 | + break; |
---|
| 1941 | + } |
---|
1791 | 1942 | } |
---|
1792 | 1943 | } |
---|
1793 | 1944 | |
---|
.. | .. |
---|
1798 | 1949 | writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, ®->inbound_msgaddr0); |
---|
1799 | 1950 | if (!arcmsr_hbaA_wait_msgint_ready(acb)) { |
---|
1800 | 1951 | printk(KERN_NOTICE |
---|
1801 | | - "arcmsr%d: wait 'stop adapter background rebulid' timeout\n" |
---|
| 1952 | + "arcmsr%d: wait 'stop adapter background rebuild' timeout\n" |
---|
1802 | 1953 | , acb->host->host_no); |
---|
1803 | 1954 | } |
---|
1804 | 1955 | } |
---|
.. | .. |
---|
1811 | 1962 | |
---|
1812 | 1963 | if (!arcmsr_hbaB_wait_msgint_ready(acb)) { |
---|
1813 | 1964 | printk(KERN_NOTICE |
---|
1814 | | - "arcmsr%d: wait 'stop adapter background rebulid' timeout\n" |
---|
| 1965 | + "arcmsr%d: wait 'stop adapter background rebuild' timeout\n" |
---|
1815 | 1966 | , acb->host->host_no); |
---|
1816 | 1967 | } |
---|
1817 | 1968 | } |
---|
.. | .. |
---|
1824 | 1975 | writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, ®->inbound_doorbell); |
---|
1825 | 1976 | if (!arcmsr_hbaC_wait_msgint_ready(pACB)) { |
---|
1826 | 1977 | printk(KERN_NOTICE |
---|
1827 | | - "arcmsr%d: wait 'stop adapter background rebulid' timeout\n" |
---|
| 1978 | + "arcmsr%d: wait 'stop adapter background rebuild' timeout\n" |
---|
1828 | 1979 | , pACB->host->host_no); |
---|
1829 | 1980 | } |
---|
1830 | 1981 | return; |
---|
.. | .. |
---|
1837 | 1988 | pACB->acb_flags &= ~ACB_F_MSG_START_BGRB; |
---|
1838 | 1989 | writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, reg->inbound_msgaddr0); |
---|
1839 | 1990 | if (!arcmsr_hbaD_wait_msgint_ready(pACB)) |
---|
1840 | | - pr_notice("arcmsr%d: wait 'stop adapter background rebulid' " |
---|
| 1991 | + pr_notice("arcmsr%d: wait 'stop adapter background rebuild' " |
---|
1841 | 1992 | "timeout\n", pACB->host->host_no); |
---|
1842 | 1993 | } |
---|
1843 | 1994 | |
---|
.. | .. |
---|
1850 | 2001 | pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; |
---|
1851 | 2002 | writel(pACB->out_doorbell, ®->iobound_doorbell); |
---|
1852 | 2003 | if (!arcmsr_hbaE_wait_msgint_ready(pACB)) { |
---|
1853 | | - pr_notice("arcmsr%d: wait 'stop adapter background rebulid' " |
---|
| 2004 | + pr_notice("arcmsr%d: wait 'stop adapter background rebuild' " |
---|
1854 | 2005 | "timeout\n", pACB->host->host_no); |
---|
1855 | 2006 | } |
---|
1856 | 2007 | } |
---|
.. | .. |
---|
1858 | 2009 | static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb) |
---|
1859 | 2010 | { |
---|
1860 | 2011 | switch (acb->adapter_type) { |
---|
1861 | | - case ACB_ADAPTER_TYPE_A: { |
---|
| 2012 | + case ACB_ADAPTER_TYPE_A: |
---|
1862 | 2013 | arcmsr_hbaA_stop_bgrb(acb); |
---|
1863 | | - } |
---|
1864 | 2014 | break; |
---|
1865 | | - |
---|
1866 | | - case ACB_ADAPTER_TYPE_B: { |
---|
| 2015 | + case ACB_ADAPTER_TYPE_B: |
---|
1867 | 2016 | arcmsr_hbaB_stop_bgrb(acb); |
---|
1868 | | - } |
---|
1869 | 2017 | break; |
---|
1870 | | - case ACB_ADAPTER_TYPE_C: { |
---|
| 2018 | + case ACB_ADAPTER_TYPE_C: |
---|
1871 | 2019 | arcmsr_hbaC_stop_bgrb(acb); |
---|
1872 | | - } |
---|
1873 | 2020 | break; |
---|
1874 | 2021 | case ACB_ADAPTER_TYPE_D: |
---|
1875 | 2022 | arcmsr_hbaD_stop_bgrb(acb); |
---|
1876 | 2023 | break; |
---|
1877 | 2024 | case ACB_ADAPTER_TYPE_E: |
---|
| 2025 | + case ACB_ADAPTER_TYPE_F: |
---|
1878 | 2026 | arcmsr_hbaE_stop_bgrb(acb); |
---|
1879 | 2027 | break; |
---|
1880 | 2028 | } |
---|
.. | .. |
---|
1893 | 2041 | writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, ®->inbound_doorbell); |
---|
1894 | 2042 | } |
---|
1895 | 2043 | break; |
---|
1896 | | - |
---|
1897 | 2044 | case ACB_ADAPTER_TYPE_B: { |
---|
1898 | 2045 | struct MessageUnit_B *reg = acb->pmuB; |
---|
1899 | 2046 | writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell); |
---|
.. | .. |
---|
1911 | 2058 | reg->inbound_doorbell); |
---|
1912 | 2059 | } |
---|
1913 | 2060 | break; |
---|
1914 | | - case ACB_ADAPTER_TYPE_E: { |
---|
| 2061 | + case ACB_ADAPTER_TYPE_E: |
---|
| 2062 | + case ACB_ADAPTER_TYPE_F: { |
---|
1915 | 2063 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
1916 | 2064 | acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK; |
---|
1917 | 2065 | writel(acb->out_doorbell, ®->iobound_doorbell); |
---|
.. | .. |
---|
1957 | 2105 | reg->inbound_doorbell); |
---|
1958 | 2106 | } |
---|
1959 | 2107 | break; |
---|
1960 | | - case ACB_ADAPTER_TYPE_E: { |
---|
| 2108 | + case ACB_ADAPTER_TYPE_E: |
---|
| 2109 | + case ACB_ADAPTER_TYPE_F: { |
---|
1961 | 2110 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
1962 | 2111 | acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK; |
---|
1963 | 2112 | writel(acb->out_doorbell, ®->iobound_doorbell); |
---|
.. | .. |
---|
1976 | 2125 | qbuffer = (struct QBUFFER __iomem *)®->message_rbuffer; |
---|
1977 | 2126 | } |
---|
1978 | 2127 | break; |
---|
1979 | | - |
---|
1980 | 2128 | case ACB_ADAPTER_TYPE_B: { |
---|
1981 | 2129 | struct MessageUnit_B *reg = acb->pmuB; |
---|
1982 | 2130 | qbuffer = (struct QBUFFER __iomem *)reg->message_rbuffer; |
---|
.. | .. |
---|
1997 | 2145 | qbuffer = (struct QBUFFER __iomem *)®->message_rbuffer; |
---|
1998 | 2146 | } |
---|
1999 | 2147 | break; |
---|
| 2148 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 2149 | + qbuffer = (struct QBUFFER __iomem *)acb->message_rbuffer; |
---|
| 2150 | + } |
---|
| 2151 | + break; |
---|
2000 | 2152 | } |
---|
2001 | 2153 | return qbuffer; |
---|
2002 | 2154 | } |
---|
.. | .. |
---|
2011 | 2163 | pqbuffer = (struct QBUFFER __iomem *) ®->message_wbuffer; |
---|
2012 | 2164 | } |
---|
2013 | 2165 | break; |
---|
2014 | | - |
---|
2015 | 2166 | case ACB_ADAPTER_TYPE_B: { |
---|
2016 | 2167 | struct MessageUnit_B *reg = acb->pmuB; |
---|
2017 | 2168 | pqbuffer = (struct QBUFFER __iomem *)reg->message_wbuffer; |
---|
.. | .. |
---|
2031 | 2182 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
2032 | 2183 | pqbuffer = (struct QBUFFER __iomem *)®->message_wbuffer; |
---|
2033 | 2184 | } |
---|
| 2185 | + break; |
---|
| 2186 | + case ACB_ADAPTER_TYPE_F: |
---|
| 2187 | + pqbuffer = (struct QBUFFER __iomem *)acb->message_wbuffer; |
---|
2034 | 2188 | break; |
---|
2035 | 2189 | } |
---|
2036 | 2190 | return pqbuffer; |
---|
.. | .. |
---|
2270 | 2424 | |
---|
2271 | 2425 | static void arcmsr_hbaE_doorbell_isr(struct AdapterControlBlock *pACB) |
---|
2272 | 2426 | { |
---|
2273 | | - uint32_t outbound_doorbell, in_doorbell, tmp; |
---|
| 2427 | + uint32_t outbound_doorbell, in_doorbell, tmp, i; |
---|
2274 | 2428 | struct MessageUnit_E __iomem *reg = pACB->pmuE; |
---|
2275 | 2429 | |
---|
2276 | | - in_doorbell = readl(®->iobound_doorbell); |
---|
| 2430 | + if (pACB->adapter_type == ACB_ADAPTER_TYPE_F) { |
---|
| 2431 | + for (i = 0; i < 5; i++) { |
---|
| 2432 | + in_doorbell = readl(®->iobound_doorbell); |
---|
| 2433 | + if (in_doorbell != 0) |
---|
| 2434 | + break; |
---|
| 2435 | + } |
---|
| 2436 | + } else |
---|
| 2437 | + in_doorbell = readl(®->iobound_doorbell); |
---|
2277 | 2438 | outbound_doorbell = in_doorbell ^ pACB->in_doorbell; |
---|
2278 | 2439 | do { |
---|
2279 | 2440 | writel(0, ®->host_int_status); /* clear interrupt */ |
---|
.. | .. |
---|
2302 | 2463 | struct ARCMSR_CDB *pARCMSR_CDB; |
---|
2303 | 2464 | struct CommandControlBlock *pCCB; |
---|
2304 | 2465 | bool error; |
---|
| 2466 | + unsigned long cdb_phy_addr; |
---|
| 2467 | + |
---|
2305 | 2468 | while ((flag_ccb = readl(®->outbound_queueport)) != 0xFFFFFFFF) { |
---|
2306 | | - pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + (flag_ccb << 5));/*frame must be 32 bytes aligned*/ |
---|
| 2469 | + cdb_phy_addr = (flag_ccb << 5) & 0xffffffff; |
---|
| 2470 | + if (acb->cdb_phyadd_hipart) |
---|
| 2471 | + cdb_phy_addr = cdb_phy_addr | acb->cdb_phyadd_hipart; |
---|
| 2472 | + pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + cdb_phy_addr); |
---|
2307 | 2473 | pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb); |
---|
2308 | 2474 | error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false; |
---|
2309 | 2475 | arcmsr_drain_donequeue(acb, pCCB, error); |
---|
.. | .. |
---|
2317 | 2483 | struct ARCMSR_CDB *pARCMSR_CDB; |
---|
2318 | 2484 | struct CommandControlBlock *pCCB; |
---|
2319 | 2485 | bool error; |
---|
| 2486 | + unsigned long cdb_phy_addr; |
---|
| 2487 | + |
---|
2320 | 2488 | index = reg->doneq_index; |
---|
2321 | 2489 | while ((flag_ccb = reg->done_qbuffer[index]) != 0) { |
---|
2322 | | - reg->done_qbuffer[index] = 0; |
---|
2323 | | - pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset+(flag_ccb << 5));/*frame must be 32 bytes aligned*/ |
---|
| 2490 | + cdb_phy_addr = (flag_ccb << 5) & 0xffffffff; |
---|
| 2491 | + if (acb->cdb_phyadd_hipart) |
---|
| 2492 | + cdb_phy_addr = cdb_phy_addr | acb->cdb_phyadd_hipart; |
---|
| 2493 | + pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + cdb_phy_addr); |
---|
2324 | 2494 | pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb); |
---|
2325 | 2495 | error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false; |
---|
2326 | 2496 | arcmsr_drain_donequeue(acb, pCCB, error); |
---|
| 2497 | + reg->done_qbuffer[index] = 0; |
---|
2327 | 2498 | index++; |
---|
2328 | 2499 | index %= ARCMSR_MAX_HBB_POSTQUEUE; |
---|
2329 | 2500 | reg->doneq_index = index; |
---|
.. | .. |
---|
2335 | 2506 | struct MessageUnit_C __iomem *phbcmu; |
---|
2336 | 2507 | struct ARCMSR_CDB *arcmsr_cdb; |
---|
2337 | 2508 | struct CommandControlBlock *ccb; |
---|
2338 | | - uint32_t flag_ccb, ccb_cdb_phy, throttling = 0; |
---|
| 2509 | + uint32_t flag_ccb, throttling = 0; |
---|
| 2510 | + unsigned long ccb_cdb_phy; |
---|
2339 | 2511 | int error; |
---|
2340 | 2512 | |
---|
2341 | 2513 | phbcmu = acb->pmuC; |
---|
.. | .. |
---|
2345 | 2517 | while ((flag_ccb = readl(&phbcmu->outbound_queueport_low)) != |
---|
2346 | 2518 | 0xFFFFFFFF) { |
---|
2347 | 2519 | ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0); |
---|
| 2520 | + if (acb->cdb_phyadd_hipart) |
---|
| 2521 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
2348 | 2522 | arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset |
---|
2349 | 2523 | + ccb_cdb_phy); |
---|
2350 | 2524 | ccb = container_of(arcmsr_cdb, struct CommandControlBlock, |
---|
.. | .. |
---|
2365 | 2539 | static void arcmsr_hbaD_postqueue_isr(struct AdapterControlBlock *acb) |
---|
2366 | 2540 | { |
---|
2367 | 2541 | u32 outbound_write_pointer, doneq_index, index_stripped, toggle; |
---|
2368 | | - uint32_t addressLow, ccb_cdb_phy; |
---|
| 2542 | + uint32_t addressLow; |
---|
2369 | 2543 | int error; |
---|
2370 | 2544 | struct MessageUnit_D *pmu; |
---|
2371 | 2545 | struct ARCMSR_CDB *arcmsr_cdb; |
---|
2372 | 2546 | struct CommandControlBlock *ccb; |
---|
2373 | | - unsigned long flags; |
---|
| 2547 | + unsigned long flags, ccb_cdb_phy; |
---|
2374 | 2548 | |
---|
2375 | 2549 | spin_lock_irqsave(&acb->doneq_lock, flags); |
---|
2376 | 2550 | pmu = acb->pmuD; |
---|
.. | .. |
---|
2387 | 2561 | addressLow = pmu->done_qbuffer[doneq_index & |
---|
2388 | 2562 | 0xFFF].addressLow; |
---|
2389 | 2563 | ccb_cdb_phy = (addressLow & 0xFFFFFFF0); |
---|
| 2564 | + if (acb->cdb_phyadd_hipart) |
---|
| 2565 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
2390 | 2566 | arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset |
---|
2391 | 2567 | + ccb_cdb_phy); |
---|
2392 | 2568 | ccb = container_of(arcmsr_cdb, |
---|
.. | .. |
---|
2428 | 2604 | } |
---|
2429 | 2605 | acb->doneq_index = doneq_index; |
---|
2430 | 2606 | writel(doneq_index, &pmu->reply_post_consumer_index); |
---|
| 2607 | + spin_unlock_irqrestore(&acb->doneq_lock, flags); |
---|
| 2608 | +} |
---|
| 2609 | + |
---|
| 2610 | +static void arcmsr_hbaF_postqueue_isr(struct AdapterControlBlock *acb) |
---|
| 2611 | +{ |
---|
| 2612 | + uint32_t doneq_index; |
---|
| 2613 | + uint16_t cmdSMID; |
---|
| 2614 | + int error; |
---|
| 2615 | + struct MessageUnit_F __iomem *phbcmu; |
---|
| 2616 | + struct CommandControlBlock *ccb; |
---|
| 2617 | + unsigned long flags; |
---|
| 2618 | + |
---|
| 2619 | + spin_lock_irqsave(&acb->doneq_lock, flags); |
---|
| 2620 | + doneq_index = acb->doneq_index; |
---|
| 2621 | + phbcmu = acb->pmuF; |
---|
| 2622 | + while (1) { |
---|
| 2623 | + cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID; |
---|
| 2624 | + if (cmdSMID == 0xffff) |
---|
| 2625 | + break; |
---|
| 2626 | + ccb = acb->pccb_pool[cmdSMID]; |
---|
| 2627 | + error = (acb->pCompletionQ[doneq_index].cmdFlag & |
---|
| 2628 | + ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ? true : false; |
---|
| 2629 | + arcmsr_drain_donequeue(acb, ccb, error); |
---|
| 2630 | + acb->pCompletionQ[doneq_index].cmdSMID = 0xffff; |
---|
| 2631 | + doneq_index++; |
---|
| 2632 | + if (doneq_index >= acb->completionQ_entry) |
---|
| 2633 | + doneq_index = 0; |
---|
| 2634 | + } |
---|
| 2635 | + acb->doneq_index = doneq_index; |
---|
| 2636 | + writel(doneq_index, &phbcmu->reply_post_consumer_index); |
---|
2431 | 2637 | spin_unlock_irqrestore(&acb->doneq_lock, flags); |
---|
2432 | 2638 | } |
---|
2433 | 2639 | |
---|
.. | .. |
---|
2621 | 2827 | return IRQ_HANDLED; |
---|
2622 | 2828 | } |
---|
2623 | 2829 | |
---|
| 2830 | +static irqreturn_t arcmsr_hbaF_handle_isr(struct AdapterControlBlock *pACB) |
---|
| 2831 | +{ |
---|
| 2832 | + uint32_t host_interrupt_status; |
---|
| 2833 | + struct MessageUnit_F __iomem *phbcmu = pACB->pmuF; |
---|
| 2834 | + |
---|
| 2835 | + host_interrupt_status = readl(&phbcmu->host_int_status) & |
---|
| 2836 | + (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR | |
---|
| 2837 | + ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR); |
---|
| 2838 | + if (!host_interrupt_status) |
---|
| 2839 | + return IRQ_NONE; |
---|
| 2840 | + do { |
---|
| 2841 | + /* MU post queue interrupts*/ |
---|
| 2842 | + if (host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR) |
---|
| 2843 | + arcmsr_hbaF_postqueue_isr(pACB); |
---|
| 2844 | + |
---|
| 2845 | + /* MU ioctl transfer doorbell interrupts*/ |
---|
| 2846 | + if (host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR) |
---|
| 2847 | + arcmsr_hbaE_doorbell_isr(pACB); |
---|
| 2848 | + |
---|
| 2849 | + host_interrupt_status = readl(&phbcmu->host_int_status); |
---|
| 2850 | + } while (host_interrupt_status & (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR | |
---|
| 2851 | + ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR)); |
---|
| 2852 | + return IRQ_HANDLED; |
---|
| 2853 | +} |
---|
| 2854 | + |
---|
2624 | 2855 | static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb) |
---|
2625 | 2856 | { |
---|
2626 | 2857 | switch (acb->adapter_type) { |
---|
2627 | 2858 | case ACB_ADAPTER_TYPE_A: |
---|
2628 | 2859 | return arcmsr_hbaA_handle_isr(acb); |
---|
2629 | | - break; |
---|
2630 | 2860 | case ACB_ADAPTER_TYPE_B: |
---|
2631 | 2861 | return arcmsr_hbaB_handle_isr(acb); |
---|
2632 | | - break; |
---|
2633 | 2862 | case ACB_ADAPTER_TYPE_C: |
---|
2634 | 2863 | return arcmsr_hbaC_handle_isr(acb); |
---|
2635 | 2864 | case ACB_ADAPTER_TYPE_D: |
---|
2636 | 2865 | return arcmsr_hbaD_handle_isr(acb); |
---|
2637 | 2866 | case ACB_ADAPTER_TYPE_E: |
---|
2638 | 2867 | return arcmsr_hbaE_handle_isr(acb); |
---|
| 2868 | + case ACB_ADAPTER_TYPE_F: |
---|
| 2869 | + return arcmsr_hbaF_handle_isr(acb); |
---|
2639 | 2870 | default: |
---|
2640 | 2871 | return IRQ_NONE; |
---|
2641 | 2872 | } |
---|
.. | .. |
---|
3184 | 3415 | return true; |
---|
3185 | 3416 | } |
---|
3186 | 3417 | |
---|
| 3418 | +static bool arcmsr_hbaF_get_config(struct AdapterControlBlock *pACB) |
---|
| 3419 | +{ |
---|
| 3420 | + struct MessageUnit_F __iomem *reg = pACB->pmuF; |
---|
| 3421 | + uint32_t intmask_org; |
---|
| 3422 | + |
---|
| 3423 | + /* disable all outbound interrupt */ |
---|
| 3424 | + intmask_org = readl(®->host_int_mask); /* disable outbound message0 int */ |
---|
| 3425 | + writel(intmask_org | ARCMSR_HBEMU_ALL_INTMASKENABLE, ®->host_int_mask); |
---|
| 3426 | + /* wait firmware ready */ |
---|
| 3427 | + arcmsr_wait_firmware_ready(pACB); |
---|
| 3428 | + /* post "get config" instruction */ |
---|
| 3429 | + writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, ®->inbound_msgaddr0); |
---|
| 3430 | + |
---|
| 3431 | + pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; |
---|
| 3432 | + writel(pACB->out_doorbell, ®->iobound_doorbell); |
---|
| 3433 | + /* wait message ready */ |
---|
| 3434 | + if (!arcmsr_hbaE_wait_msgint_ready(pACB)) { |
---|
| 3435 | + pr_notice("arcmsr%d: wait get adapter firmware miscellaneous data timeout\n", |
---|
| 3436 | + pACB->host->host_no); |
---|
| 3437 | + return false; |
---|
| 3438 | + } |
---|
| 3439 | + arcmsr_get_adapter_config(pACB, pACB->msgcode_rwbuffer); |
---|
| 3440 | + return true; |
---|
| 3441 | +} |
---|
| 3442 | + |
---|
3187 | 3443 | static bool arcmsr_get_firmware_spec(struct AdapterControlBlock *acb) |
---|
3188 | 3444 | { |
---|
3189 | 3445 | bool rtn = false; |
---|
.. | .. |
---|
3203 | 3459 | break; |
---|
3204 | 3460 | case ACB_ADAPTER_TYPE_E: |
---|
3205 | 3461 | rtn = arcmsr_hbaE_get_config(acb); |
---|
| 3462 | + break; |
---|
| 3463 | + case ACB_ADAPTER_TYPE_F: |
---|
| 3464 | + rtn = arcmsr_hbaF_get_config(acb); |
---|
3206 | 3465 | break; |
---|
3207 | 3466 | default: |
---|
3208 | 3467 | break; |
---|
.. | .. |
---|
3227 | 3486 | uint32_t flag_ccb, outbound_intstatus, poll_ccb_done = 0, poll_count = 0; |
---|
3228 | 3487 | int rtn; |
---|
3229 | 3488 | bool error; |
---|
3230 | | - polling_hba_ccb_retry: |
---|
| 3489 | + unsigned long ccb_cdb_phy; |
---|
| 3490 | + |
---|
| 3491 | +polling_hba_ccb_retry: |
---|
3231 | 3492 | poll_count++; |
---|
3232 | 3493 | outbound_intstatus = readl(®->outbound_intstatus) & acb->outbound_int_enable; |
---|
3233 | 3494 | writel(outbound_intstatus, ®->outbound_intstatus);/*clear interrupt*/ |
---|
.. | .. |
---|
3245 | 3506 | goto polling_hba_ccb_retry; |
---|
3246 | 3507 | } |
---|
3247 | 3508 | } |
---|
3248 | | - arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + (flag_ccb << 5)); |
---|
| 3509 | + ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff; |
---|
| 3510 | + if (acb->cdb_phyadd_hipart) |
---|
| 3511 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
| 3512 | + arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); |
---|
3249 | 3513 | ccb = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb); |
---|
3250 | 3514 | poll_ccb_done |= (ccb == poll_ccb) ? 1 : 0; |
---|
3251 | 3515 | if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) { |
---|
.. | .. |
---|
3283 | 3547 | uint32_t flag_ccb, poll_ccb_done = 0, poll_count = 0; |
---|
3284 | 3548 | int index, rtn; |
---|
3285 | 3549 | bool error; |
---|
3286 | | - polling_hbb_ccb_retry: |
---|
| 3550 | + unsigned long ccb_cdb_phy; |
---|
3287 | 3551 | |
---|
| 3552 | +polling_hbb_ccb_retry: |
---|
3288 | 3553 | poll_count++; |
---|
3289 | 3554 | /* clear doorbell interrupt */ |
---|
3290 | 3555 | writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell); |
---|
.. | .. |
---|
3310 | 3575 | index %= ARCMSR_MAX_HBB_POSTQUEUE; |
---|
3311 | 3576 | reg->doneq_index = index; |
---|
3312 | 3577 | /* check if command done with no error*/ |
---|
3313 | | - arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + (flag_ccb << 5)); |
---|
| 3578 | + ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff; |
---|
| 3579 | + if (acb->cdb_phyadd_hipart) |
---|
| 3580 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
| 3581 | + arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); |
---|
3314 | 3582 | ccb = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb); |
---|
3315 | 3583 | poll_ccb_done |= (ccb == poll_ccb) ? 1 : 0; |
---|
3316 | 3584 | if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) { |
---|
.. | .. |
---|
3343 | 3611 | struct CommandControlBlock *poll_ccb) |
---|
3344 | 3612 | { |
---|
3345 | 3613 | struct MessageUnit_C __iomem *reg = acb->pmuC; |
---|
3346 | | - uint32_t flag_ccb, ccb_cdb_phy; |
---|
| 3614 | + uint32_t flag_ccb; |
---|
3347 | 3615 | struct ARCMSR_CDB *arcmsr_cdb; |
---|
3348 | 3616 | bool error; |
---|
3349 | 3617 | struct CommandControlBlock *pCCB; |
---|
3350 | 3618 | uint32_t poll_ccb_done = 0, poll_count = 0; |
---|
3351 | 3619 | int rtn; |
---|
| 3620 | + unsigned long ccb_cdb_phy; |
---|
| 3621 | + |
---|
3352 | 3622 | polling_hbc_ccb_retry: |
---|
3353 | 3623 | poll_count++; |
---|
3354 | 3624 | while (1) { |
---|
.. | .. |
---|
3367 | 3637 | } |
---|
3368 | 3638 | flag_ccb = readl(®->outbound_queueport_low); |
---|
3369 | 3639 | ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0); |
---|
3370 | | - arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);/*frame must be 32 bytes aligned*/ |
---|
| 3640 | + if (acb->cdb_phyadd_hipart) |
---|
| 3641 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
| 3642 | + arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy); |
---|
3371 | 3643 | pCCB = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb); |
---|
3372 | 3644 | poll_ccb_done |= (pCCB == poll_ccb) ? 1 : 0; |
---|
3373 | 3645 | /* check ifcommand done with no error*/ |
---|
.. | .. |
---|
3379 | 3651 | , pCCB->pcmd->device->id |
---|
3380 | 3652 | , (u32)pCCB->pcmd->device->lun |
---|
3381 | 3653 | , pCCB); |
---|
3382 | | - pCCB->pcmd->result = DID_ABORT << 16; |
---|
3383 | | - arcmsr_ccb_complete(pCCB); |
---|
| 3654 | + pCCB->pcmd->result = DID_ABORT << 16; |
---|
| 3655 | + arcmsr_ccb_complete(pCCB); |
---|
3384 | 3656 | continue; |
---|
3385 | 3657 | } |
---|
3386 | 3658 | printk(KERN_NOTICE "arcmsr%d: polling get an illegal ccb" |
---|
.. | .. |
---|
3401 | 3673 | struct CommandControlBlock *poll_ccb) |
---|
3402 | 3674 | { |
---|
3403 | 3675 | bool error; |
---|
3404 | | - uint32_t poll_ccb_done = 0, poll_count = 0, flag_ccb, ccb_cdb_phy; |
---|
| 3676 | + uint32_t poll_ccb_done = 0, poll_count = 0, flag_ccb; |
---|
3405 | 3677 | int rtn, doneq_index, index_stripped, outbound_write_pointer, toggle; |
---|
3406 | | - unsigned long flags; |
---|
| 3678 | + unsigned long flags, ccb_cdb_phy; |
---|
3407 | 3679 | struct ARCMSR_CDB *arcmsr_cdb; |
---|
3408 | 3680 | struct CommandControlBlock *pCCB; |
---|
3409 | 3681 | struct MessageUnit_D *pmu = acb->pmuD; |
---|
.. | .. |
---|
3437 | 3709 | spin_unlock_irqrestore(&acb->doneq_lock, flags); |
---|
3438 | 3710 | flag_ccb = pmu->done_qbuffer[doneq_index & 0xFFF].addressLow; |
---|
3439 | 3711 | ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0); |
---|
| 3712 | + if (acb->cdb_phyadd_hipart) |
---|
| 3713 | + ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart; |
---|
3440 | 3714 | arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + |
---|
3441 | 3715 | ccb_cdb_phy); |
---|
3442 | 3716 | pCCB = container_of(arcmsr_cdb, struct CommandControlBlock, |
---|
.. | .. |
---|
3546 | 3820 | int rtn = 0; |
---|
3547 | 3821 | switch (acb->adapter_type) { |
---|
3548 | 3822 | |
---|
3549 | | - case ACB_ADAPTER_TYPE_A: { |
---|
| 3823 | + case ACB_ADAPTER_TYPE_A: |
---|
3550 | 3824 | rtn = arcmsr_hbaA_polling_ccbdone(acb, poll_ccb); |
---|
3551 | | - } |
---|
3552 | 3825 | break; |
---|
3553 | | - |
---|
3554 | | - case ACB_ADAPTER_TYPE_B: { |
---|
| 3826 | + case ACB_ADAPTER_TYPE_B: |
---|
3555 | 3827 | rtn = arcmsr_hbaB_polling_ccbdone(acb, poll_ccb); |
---|
3556 | | - } |
---|
3557 | 3828 | break; |
---|
3558 | | - case ACB_ADAPTER_TYPE_C: { |
---|
| 3829 | + case ACB_ADAPTER_TYPE_C: |
---|
3559 | 3830 | rtn = arcmsr_hbaC_polling_ccbdone(acb, poll_ccb); |
---|
3560 | | - } |
---|
3561 | 3831 | break; |
---|
3562 | 3832 | case ACB_ADAPTER_TYPE_D: |
---|
3563 | 3833 | rtn = arcmsr_hbaD_polling_ccbdone(acb, poll_ccb); |
---|
3564 | 3834 | break; |
---|
3565 | 3835 | case ACB_ADAPTER_TYPE_E: |
---|
| 3836 | + case ACB_ADAPTER_TYPE_F: |
---|
3566 | 3837 | rtn = arcmsr_hbaE_polling_ccbdone(acb, poll_ccb); |
---|
3567 | 3838 | break; |
---|
3568 | 3839 | } |
---|
.. | .. |
---|
3643 | 3914 | writel(pacb->out_doorbell, ®->iobound_doorbell); |
---|
3644 | 3915 | break; |
---|
3645 | 3916 | } |
---|
| 3917 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 3918 | + struct MessageUnit_F __iomem *reg = pacb->pmuF; |
---|
| 3919 | + |
---|
| 3920 | + pacb->msgcode_rwbuffer[0] = datetime.b.msg_time[0]; |
---|
| 3921 | + pacb->msgcode_rwbuffer[1] = datetime.b.msg_time[1]; |
---|
| 3922 | + writel(ARCMSR_INBOUND_MESG0_SYNC_TIMER, ®->inbound_msgaddr0); |
---|
| 3923 | + pacb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; |
---|
| 3924 | + writel(pacb->out_doorbell, ®->iobound_doorbell); |
---|
| 3925 | + break; |
---|
| 3926 | + } |
---|
3646 | 3927 | } |
---|
3647 | 3928 | if (sys_tz.tz_minuteswest) |
---|
3648 | 3929 | next_time = ARCMSR_HOURS; |
---|
.. | .. |
---|
3668 | 3949 | dma_coherent_handle = acb->dma_coherent_handle2; |
---|
3669 | 3950 | break; |
---|
3670 | 3951 | case ACB_ADAPTER_TYPE_E: |
---|
| 3952 | + case ACB_ADAPTER_TYPE_F: |
---|
3671 | 3953 | dma_coherent_handle = acb->dma_coherent_handle + |
---|
3672 | 3954 | offsetof(struct CommandControlBlock, arcmsr_cdb); |
---|
3673 | 3955 | break; |
---|
.. | .. |
---|
3678 | 3960 | cdb_phyaddr = lower_32_bits(dma_coherent_handle); |
---|
3679 | 3961 | cdb_phyaddr_hi32 = upper_32_bits(dma_coherent_handle); |
---|
3680 | 3962 | acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32; |
---|
| 3963 | + acb->cdb_phyadd_hipart = ((uint64_t)cdb_phyaddr_hi32) << 32; |
---|
3681 | 3964 | /* |
---|
3682 | 3965 | *********************************************************************** |
---|
3683 | 3966 | ** if adapter type B, set window of "post command Q" |
---|
.. | .. |
---|
3742 | 4025 | } |
---|
3743 | 4026 | break; |
---|
3744 | 4027 | case ACB_ADAPTER_TYPE_C: { |
---|
3745 | | - if (cdb_phyaddr_hi32 != 0) { |
---|
3746 | 4028 | struct MessageUnit_C __iomem *reg = acb->pmuC; |
---|
3747 | 4029 | |
---|
3748 | 4030 | printk(KERN_NOTICE "arcmsr%d: cdb_phyaddr_hi32=0x%x\n", |
---|
.. | .. |
---|
3756 | 4038 | timeout \n", acb->host->host_no); |
---|
3757 | 4039 | return 1; |
---|
3758 | 4040 | } |
---|
3759 | | - } |
---|
3760 | 4041 | } |
---|
3761 | 4042 | break; |
---|
3762 | 4043 | case ACB_ADAPTER_TYPE_D: { |
---|
.. | .. |
---|
3786 | 4067 | writel(cdb_phyaddr, ®->msgcode_rwbuffer[2]); |
---|
3787 | 4068 | writel(cdb_phyaddr_hi32, ®->msgcode_rwbuffer[3]); |
---|
3788 | 4069 | writel(acb->ccbsize, ®->msgcode_rwbuffer[4]); |
---|
3789 | | - dma_coherent_handle = acb->dma_coherent_handle2; |
---|
3790 | | - cdb_phyaddr = (uint32_t)(dma_coherent_handle & 0xffffffff); |
---|
3791 | | - cdb_phyaddr_hi32 = (uint32_t)((dma_coherent_handle >> 16) >> 16); |
---|
3792 | | - writel(cdb_phyaddr, ®->msgcode_rwbuffer[5]); |
---|
3793 | | - writel(cdb_phyaddr_hi32, ®->msgcode_rwbuffer[6]); |
---|
3794 | | - writel(acb->roundup_ccbsize, ®->msgcode_rwbuffer[7]); |
---|
| 4070 | + writel(lower_32_bits(acb->dma_coherent_handle2), ®->msgcode_rwbuffer[5]); |
---|
| 4071 | + writel(upper_32_bits(acb->dma_coherent_handle2), ®->msgcode_rwbuffer[6]); |
---|
| 4072 | + writel(acb->ioqueue_size, ®->msgcode_rwbuffer[7]); |
---|
3795 | 4073 | writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, ®->inbound_msgaddr0); |
---|
3796 | 4074 | acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; |
---|
3797 | 4075 | writel(acb->out_doorbell, ®->iobound_doorbell); |
---|
3798 | 4076 | if (!arcmsr_hbaE_wait_msgint_ready(acb)) { |
---|
3799 | 4077 | pr_notice("arcmsr%d: 'set command Q window' timeout \n", |
---|
| 4078 | + acb->host->host_no); |
---|
| 4079 | + return 1; |
---|
| 4080 | + } |
---|
| 4081 | + } |
---|
| 4082 | + break; |
---|
| 4083 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 4084 | + struct MessageUnit_F __iomem *reg = acb->pmuF; |
---|
| 4085 | + |
---|
| 4086 | + acb->msgcode_rwbuffer[0] = ARCMSR_SIGNATURE_SET_CONFIG; |
---|
| 4087 | + acb->msgcode_rwbuffer[1] = ARCMSR_SIGNATURE_1886; |
---|
| 4088 | + acb->msgcode_rwbuffer[2] = cdb_phyaddr; |
---|
| 4089 | + acb->msgcode_rwbuffer[3] = cdb_phyaddr_hi32; |
---|
| 4090 | + acb->msgcode_rwbuffer[4] = acb->ccbsize; |
---|
| 4091 | + acb->msgcode_rwbuffer[5] = lower_32_bits(acb->dma_coherent_handle2); |
---|
| 4092 | + acb->msgcode_rwbuffer[6] = upper_32_bits(acb->dma_coherent_handle2); |
---|
| 4093 | + acb->msgcode_rwbuffer[7] = acb->completeQ_size; |
---|
| 4094 | + writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, ®->inbound_msgaddr0); |
---|
| 4095 | + acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; |
---|
| 4096 | + writel(acb->out_doorbell, ®->iobound_doorbell); |
---|
| 4097 | + if (!arcmsr_hbaE_wait_msgint_ready(acb)) { |
---|
| 4098 | + pr_notice("arcmsr%d: 'set command Q window' timeout\n", |
---|
3800 | 4099 | acb->host->host_no); |
---|
3801 | 4100 | return 1; |
---|
3802 | 4101 | } |
---|
.. | .. |
---|
3850 | 4149 | ARCMSR_ARC1214_MESSAGE_FIRMWARE_OK) == 0); |
---|
3851 | 4150 | } |
---|
3852 | 4151 | break; |
---|
3853 | | - case ACB_ADAPTER_TYPE_E: { |
---|
| 4152 | + case ACB_ADAPTER_TYPE_E: |
---|
| 4153 | + case ACB_ADAPTER_TYPE_F: { |
---|
3854 | 4154 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
3855 | 4155 | do { |
---|
3856 | 4156 | if (!(acb->acb_flags & ACB_F_IOP_INITED)) |
---|
.. | .. |
---|
3865 | 4165 | static void arcmsr_request_device_map(struct timer_list *t) |
---|
3866 | 4166 | { |
---|
3867 | 4167 | struct AdapterControlBlock *acb = from_timer(acb, t, eternal_timer); |
---|
3868 | | - if (unlikely(atomic_read(&acb->rq_map_token) == 0) || |
---|
3869 | | - (acb->acb_flags & ACB_F_BUS_RESET) || |
---|
3870 | | - (acb->acb_flags & ACB_F_ABORT)) { |
---|
3871 | | - mod_timer(&acb->eternal_timer, |
---|
3872 | | - jiffies + msecs_to_jiffies(6 * HZ)); |
---|
| 4168 | + if (acb->acb_flags & (ACB_F_MSG_GET_CONFIG | ACB_F_BUS_RESET | ACB_F_ABORT)) { |
---|
| 4169 | + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); |
---|
3873 | 4170 | } else { |
---|
3874 | 4171 | acb->fw_flag = FW_NORMAL; |
---|
3875 | | - if (atomic_read(&acb->ante_token_value) == |
---|
3876 | | - atomic_read(&acb->rq_map_token)) { |
---|
3877 | | - atomic_set(&acb->rq_map_token, 16); |
---|
3878 | | - } |
---|
3879 | | - atomic_set(&acb->ante_token_value, |
---|
3880 | | - atomic_read(&acb->rq_map_token)); |
---|
3881 | | - if (atomic_dec_and_test(&acb->rq_map_token)) { |
---|
3882 | | - mod_timer(&acb->eternal_timer, jiffies + |
---|
3883 | | - msecs_to_jiffies(6 * HZ)); |
---|
3884 | | - return; |
---|
3885 | | - } |
---|
3886 | 4172 | switch (acb->adapter_type) { |
---|
3887 | 4173 | case ACB_ADAPTER_TYPE_A: { |
---|
3888 | 4174 | struct MessageUnit_A __iomem *reg = acb->pmuA; |
---|
.. | .. |
---|
3912 | 4198 | writel(acb->out_doorbell, ®->iobound_doorbell); |
---|
3913 | 4199 | break; |
---|
3914 | 4200 | } |
---|
| 4201 | + case ACB_ADAPTER_TYPE_F: { |
---|
| 4202 | + struct MessageUnit_F __iomem *reg = acb->pmuF; |
---|
| 4203 | + uint32_t outMsg1 = readl(®->outbound_msgaddr1); |
---|
| 4204 | + |
---|
| 4205 | + if (!(outMsg1 & ARCMSR_HBFMU_MESSAGE_FIRMWARE_OK) || |
---|
| 4206 | + (outMsg1 & ARCMSR_HBFMU_MESSAGE_NO_VOLUME_CHANGE)) |
---|
| 4207 | + goto nxt6s; |
---|
| 4208 | + writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, ®->inbound_msgaddr0); |
---|
| 4209 | + acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; |
---|
| 4210 | + writel(acb->out_doorbell, ®->iobound_doorbell); |
---|
| 4211 | + break; |
---|
| 4212 | + } |
---|
3915 | 4213 | default: |
---|
3916 | 4214 | return; |
---|
3917 | 4215 | } |
---|
3918 | 4216 | acb->acb_flags |= ACB_F_MSG_GET_CONFIG; |
---|
| 4217 | +nxt6s: |
---|
3919 | 4218 | mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); |
---|
3920 | 4219 | } |
---|
3921 | 4220 | } |
---|
.. | .. |
---|
3927 | 4226 | writel(ARCMSR_INBOUND_MESG0_START_BGRB, ®->inbound_msgaddr0); |
---|
3928 | 4227 | if (!arcmsr_hbaA_wait_msgint_ready(acb)) { |
---|
3929 | 4228 | printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \ |
---|
3930 | | - rebulid' timeout \n", acb->host->host_no); |
---|
| 4229 | + rebuild' timeout \n", acb->host->host_no); |
---|
3931 | 4230 | } |
---|
3932 | 4231 | } |
---|
3933 | 4232 | |
---|
.. | .. |
---|
3938 | 4237 | writel(ARCMSR_MESSAGE_START_BGRB, reg->drv2iop_doorbell); |
---|
3939 | 4238 | if (!arcmsr_hbaB_wait_msgint_ready(acb)) { |
---|
3940 | 4239 | printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \ |
---|
3941 | | - rebulid' timeout \n",acb->host->host_no); |
---|
| 4240 | + rebuild' timeout \n",acb->host->host_no); |
---|
3942 | 4241 | } |
---|
3943 | 4242 | } |
---|
3944 | 4243 | |
---|
.. | .. |
---|
3950 | 4249 | writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &phbcmu->inbound_doorbell); |
---|
3951 | 4250 | if (!arcmsr_hbaC_wait_msgint_ready(pACB)) { |
---|
3952 | 4251 | printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \ |
---|
3953 | | - rebulid' timeout \n", pACB->host->host_no); |
---|
| 4252 | + rebuild' timeout \n", pACB->host->host_no); |
---|
3954 | 4253 | } |
---|
3955 | 4254 | return; |
---|
3956 | 4255 | } |
---|
.. | .. |
---|
3963 | 4262 | writel(ARCMSR_INBOUND_MESG0_START_BGRB, pmu->inbound_msgaddr0); |
---|
3964 | 4263 | if (!arcmsr_hbaD_wait_msgint_ready(pACB)) { |
---|
3965 | 4264 | pr_notice("arcmsr%d: wait 'start adapter " |
---|
3966 | | - "background rebulid' timeout\n", pACB->host->host_no); |
---|
| 4265 | + "background rebuild' timeout\n", pACB->host->host_no); |
---|
3967 | 4266 | } |
---|
3968 | 4267 | } |
---|
3969 | 4268 | |
---|
.. | .. |
---|
3977 | 4276 | writel(pACB->out_doorbell, &pmu->iobound_doorbell); |
---|
3978 | 4277 | if (!arcmsr_hbaE_wait_msgint_ready(pACB)) { |
---|
3979 | 4278 | pr_notice("arcmsr%d: wait 'start adapter " |
---|
3980 | | - "background rebulid' timeout \n", pACB->host->host_no); |
---|
| 4279 | + "background rebuild' timeout \n", pACB->host->host_no); |
---|
3981 | 4280 | } |
---|
3982 | 4281 | } |
---|
3983 | 4282 | |
---|
.. | .. |
---|
3997 | 4296 | arcmsr_hbaD_start_bgrb(acb); |
---|
3998 | 4297 | break; |
---|
3999 | 4298 | case ACB_ADAPTER_TYPE_E: |
---|
| 4299 | + case ACB_ADAPTER_TYPE_F: |
---|
4000 | 4300 | arcmsr_hbaE_start_bgrb(acb); |
---|
4001 | 4301 | break; |
---|
4002 | 4302 | } |
---|
.. | .. |
---|
4076 | 4376 | } |
---|
4077 | 4377 | } |
---|
4078 | 4378 | break; |
---|
4079 | | - case ACB_ADAPTER_TYPE_E: { |
---|
| 4379 | + case ACB_ADAPTER_TYPE_E: |
---|
| 4380 | + case ACB_ADAPTER_TYPE_F: { |
---|
4080 | 4381 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
4081 | 4382 | uint32_t i, tmp; |
---|
4082 | 4383 | |
---|
.. | .. |
---|
4203 | 4504 | true : false; |
---|
4204 | 4505 | } |
---|
4205 | 4506 | break; |
---|
4206 | | - case ACB_ADAPTER_TYPE_E:{ |
---|
| 4507 | + case ACB_ADAPTER_TYPE_E: |
---|
| 4508 | + case ACB_ADAPTER_TYPE_F:{ |
---|
4207 | 4509 | struct MessageUnit_E __iomem *reg = acb->pmuE; |
---|
4208 | 4510 | rtn = (readl(®->host_diagnostic_3xxx) & |
---|
4209 | 4511 | ARCMSR_ARC188X_RESET_ADAPTER) ? true : false; |
---|
.. | .. |
---|
4302 | 4604 | goto wait_reset_done; |
---|
4303 | 4605 | } |
---|
4304 | 4606 | arcmsr_iop_init(acb); |
---|
4305 | | - atomic_set(&acb->rq_map_token, 16); |
---|
4306 | | - atomic_set(&acb->ante_token_value, 16); |
---|
4307 | 4607 | acb->fw_flag = FW_NORMAL; |
---|
4308 | 4608 | mod_timer(&acb->eternal_timer, jiffies + |
---|
4309 | 4609 | msecs_to_jiffies(6 * HZ)); |
---|
.. | .. |
---|
4312 | 4612 | pr_notice("arcmsr: scsi bus reset eh returns with success\n"); |
---|
4313 | 4613 | } else { |
---|
4314 | 4614 | acb->acb_flags &= ~ACB_F_BUS_RESET; |
---|
4315 | | - atomic_set(&acb->rq_map_token, 16); |
---|
4316 | | - atomic_set(&acb->ante_token_value, 16); |
---|
4317 | 4615 | acb->fw_flag = FW_NORMAL; |
---|
4318 | 4616 | mod_timer(&acb->eternal_timer, jiffies + |
---|
4319 | 4617 | msecs_to_jiffies(6 * HZ)); |
---|
.. | .. |
---|
4383 | 4681 | case PCI_DEVICE_ID_ARECA_1202: |
---|
4384 | 4682 | case PCI_DEVICE_ID_ARECA_1210: |
---|
4385 | 4683 | raid6 = 0; |
---|
4386 | | - /*FALLTHRU*/ |
---|
| 4684 | + fallthrough; |
---|
4387 | 4685 | case PCI_DEVICE_ID_ARECA_1120: |
---|
4388 | 4686 | case PCI_DEVICE_ID_ARECA_1130: |
---|
4389 | 4687 | case PCI_DEVICE_ID_ARECA_1160: |
---|
.. | .. |
---|
4406 | 4704 | case PCI_DEVICE_ID_ARECA_1884: |
---|
4407 | 4705 | type = "SAS/SATA"; |
---|
4408 | 4706 | break; |
---|
| 4707 | + case PCI_DEVICE_ID_ARECA_1886: |
---|
| 4708 | + type = "NVMe/SAS/SATA"; |
---|
| 4709 | + break; |
---|
4409 | 4710 | default: |
---|
4410 | 4711 | type = "unknown"; |
---|
4411 | 4712 | raid6 = 0; |
---|