| .. | .. |
|---|
| 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; |
|---|