Lines Matching refs:a

46 static bool esas2r_initmem_alloc(struct esas2r_adapter *a,  in esas2r_initmem_alloc()  argument
53 mem_desc->esas2r_data = dma_alloc_coherent(&a->pcid->dev, in esas2r_initmem_alloc()
75 static void esas2r_initmem_free(struct esas2r_adapter *a, in esas2r_initmem_free() argument
92 dma_free_coherent(&a->pcid->dev, in esas2r_initmem_free()
103 static bool alloc_vda_req(struct esas2r_adapter *a, in alloc_vda_req() argument
117 if (!esas2r_initmem_alloc(a, memdesc, 256)) { in alloc_vda_req()
123 a->num_vrqs++; in alloc_vda_req()
124 list_add(&memdesc->next_desc, &a->vrq_mds_head); in alloc_vda_req()
128 rq->vrq->scsi.handle = a->num_vrqs; in alloc_vda_req()
133 static void esas2r_unmap_regions(struct esas2r_adapter *a) in esas2r_unmap_regions() argument
135 if (a->regs) in esas2r_unmap_regions()
136 iounmap((void __iomem *)a->regs); in esas2r_unmap_regions()
138 a->regs = NULL; in esas2r_unmap_regions()
140 pci_release_region(a->pcid, 2); in esas2r_unmap_regions()
142 if (a->data_window) in esas2r_unmap_regions()
143 iounmap((void __iomem *)a->data_window); in esas2r_unmap_regions()
145 a->data_window = NULL; in esas2r_unmap_regions()
147 pci_release_region(a->pcid, 0); in esas2r_unmap_regions()
150 static int esas2r_map_regions(struct esas2r_adapter *a) in esas2r_map_regions() argument
154 a->regs = NULL; in esas2r_map_regions()
155 a->data_window = NULL; in esas2r_map_regions()
157 error = pci_request_region(a->pcid, 2, a->name); in esas2r_map_regions()
166 a->regs = (void __force *)ioremap(pci_resource_start(a->pcid, 2), in esas2r_map_regions()
167 pci_resource_len(a->pcid, 2)); in esas2r_map_regions()
168 if (a->regs == NULL) { in esas2r_map_regions()
171 pci_release_region(a->pcid, 2); in esas2r_map_regions()
175 error = pci_request_region(a->pcid, 0, a->name); in esas2r_map_regions()
180 esas2r_unmap_regions(a); in esas2r_map_regions()
184 a->data_window = (void __force *)ioremap(pci_resource_start(a->pcid, in esas2r_map_regions()
186 pci_resource_len(a->pcid, 0)); in esas2r_map_regions()
187 if (a->data_window == NULL) { in esas2r_map_regions()
190 esas2r_unmap_regions(a); in esas2r_map_regions()
197 static void esas2r_setup_interrupts(struct esas2r_adapter *a, int intr_mode) in esas2r_setup_interrupts() argument
205 a->intr_mode = INTR_MODE_LEGACY; in esas2r_setup_interrupts()
209 i = pci_enable_msi(a->pcid); in esas2r_setup_interrupts()
214 "(err=%d)", a->index, in esas2r_setup_interrupts()
218 a->intr_mode = INTR_MODE_MSI; in esas2r_setup_interrupts()
219 set_bit(AF2_MSI_ENABLED, &a->flags2); in esas2r_setup_interrupts()
232 static void esas2r_claim_interrupts(struct esas2r_adapter *a) in esas2r_claim_interrupts() argument
236 if (a->intr_mode == INTR_MODE_LEGACY) in esas2r_claim_interrupts()
241 a->pcid->irq, a, a->name, flags); in esas2r_claim_interrupts()
243 if (request_irq(a->pcid->irq, in esas2r_claim_interrupts()
244 (a->intr_mode == in esas2r_claim_interrupts()
248 a->name, in esas2r_claim_interrupts()
249 a)) { in esas2r_claim_interrupts()
251 a->pcid->irq); in esas2r_claim_interrupts()
255 set_bit(AF2_IRQ_CLAIMED, &a->flags2); in esas2r_claim_interrupts()
258 a->pcid->irq, flags); in esas2r_claim_interrupts()
264 struct esas2r_adapter *a; in esas2r_init_adapter() local
284 a = (struct esas2r_adapter *)host->hostdata; in esas2r_init_adapter()
285 memset(a, 0, sizeof(struct esas2r_adapter)); in esas2r_init_adapter()
286 a->pcid = pcid; in esas2r_init_adapter()
287 a->host = host; in esas2r_init_adapter()
297 &(a->pcid->dev), in esas2r_init_adapter()
303 &(a->pcid->dev), in esas2r_init_adapter()
316 &(a->pcid->dev), in esas2r_init_adapter()
325 esas2r_adapters[index] = a; in esas2r_init_adapter()
326 sprintf(a->name, ESAS2R_DRVR_NAME "_%02d", index); in esas2r_init_adapter()
327 esas2r_debug("new adapter %p, name %s", a, a->name); in esas2r_init_adapter()
328 spin_lock_init(&a->request_lock); in esas2r_init_adapter()
329 spin_lock_init(&a->fw_event_lock); in esas2r_init_adapter()
330 sema_init(&a->fm_api_semaphore, 1); in esas2r_init_adapter()
331 sema_init(&a->fs_api_semaphore, 1); in esas2r_init_adapter()
332 sema_init(&a->nvram_semaphore, 1); in esas2r_init_adapter()
334 esas2r_fw_event_off(a); in esas2r_init_adapter()
335 snprintf(a->fw_event_q_name, ESAS2R_KOBJ_NAME_LEN, "esas2r/%d", in esas2r_init_adapter()
336 a->index); in esas2r_init_adapter()
337 a->fw_event_q = create_singlethread_workqueue(a->fw_event_q_name); in esas2r_init_adapter()
339 init_waitqueue_head(&a->buffered_ioctl_waiter); in esas2r_init_adapter()
340 init_waitqueue_head(&a->nvram_waiter); in esas2r_init_adapter()
341 init_waitqueue_head(&a->fm_api_waiter); in esas2r_init_adapter()
342 init_waitqueue_head(&a->fs_api_waiter); in esas2r_init_adapter()
343 init_waitqueue_head(&a->vda_waiter); in esas2r_init_adapter()
345 INIT_LIST_HEAD(&a->general_req.req_list); in esas2r_init_adapter()
346 INIT_LIST_HEAD(&a->active_list); in esas2r_init_adapter()
347 INIT_LIST_HEAD(&a->defer_list); in esas2r_init_adapter()
348 INIT_LIST_HEAD(&a->free_sg_list_head); in esas2r_init_adapter()
349 INIT_LIST_HEAD(&a->avail_request); in esas2r_init_adapter()
350 INIT_LIST_HEAD(&a->vrq_mds_head); in esas2r_init_adapter()
351 INIT_LIST_HEAD(&a->fw_event_list); in esas2r_init_adapter()
353 first_request = (struct esas2r_request *)((u8 *)(a + 1)); in esas2r_init_adapter()
358 list_add_tail(&last_request->comp_list, &a->avail_request); in esas2r_init_adapter()
359 if (!alloc_vda_req(a, last_request)) { in esas2r_init_adapter()
372 if (esas2r_map_regions(a) != 0) { in esas2r_init_adapter()
378 a->index = index; in esas2r_init_adapter()
381 atomic_inc(&a->dis_ints_cnt); in esas2r_init_adapter()
382 atomic_inc(&a->disable_cnt); in esas2r_init_adapter()
383 set_bit(AF_CHPRST_PENDING, &a->flags); in esas2r_init_adapter()
384 set_bit(AF_DISC_PENDING, &a->flags); in esas2r_init_adapter()
385 set_bit(AF_FIRST_INIT, &a->flags); in esas2r_init_adapter()
386 set_bit(AF_LEGACY_SGE_MODE, &a->flags); in esas2r_init_adapter()
388 a->init_msg = ESAS2R_INIT_MSG_START; in esas2r_init_adapter()
389 a->max_vdareq_size = 128; in esas2r_init_adapter()
390 a->build_sgl = esas2r_build_sg_list_sge; in esas2r_init_adapter()
392 esas2r_setup_interrupts(a, interrupt_mode); in esas2r_init_adapter()
394 a->uncached_size = esas2r_get_uncached_size(a); in esas2r_init_adapter()
395 a->uncached = dma_alloc_coherent(&pcid->dev, in esas2r_init_adapter()
396 (size_t)a->uncached_size, in esas2r_init_adapter()
399 if (a->uncached == NULL) { in esas2r_init_adapter()
402 a->uncached_size); in esas2r_init_adapter()
407 a->uncached_phys = bus_addr; in esas2r_init_adapter()
410 a->uncached_size, in esas2r_init_adapter()
411 a->uncached, in esas2r_init_adapter()
414 memset(a->uncached, 0, a->uncached_size); in esas2r_init_adapter()
415 next_uncached = a->uncached; in esas2r_init_adapter()
417 if (!esas2r_init_adapter_struct(a, in esas2r_init_adapter()
425 tasklet_init(&a->tasklet, in esas2r_init_adapter()
427 (unsigned long)a); in esas2r_init_adapter()
433 esas2r_disable_chip_interrupts(a); in esas2r_init_adapter()
434 esas2r_check_adapter(a); in esas2r_init_adapter()
436 if (!esas2r_init_adapter_hw(a, true)) in esas2r_init_adapter()
441 esas2r_claim_interrupts(a); in esas2r_init_adapter()
443 if (test_bit(AF2_IRQ_CLAIMED, &a->flags2)) in esas2r_init_adapter()
444 esas2r_enable_chip_interrupts(a); in esas2r_init_adapter()
446 set_bit(AF2_INIT_DONE, &a->flags2); in esas2r_init_adapter()
447 if (!test_bit(AF_DEGRADED_MODE, &a->flags)) in esas2r_init_adapter()
448 esas2r_kickoff_timer(a); in esas2r_init_adapter()
450 a, a->disable_cnt); in esas2r_init_adapter()
455 static void esas2r_adapter_power_down(struct esas2r_adapter *a, in esas2r_adapter_power_down() argument
460 if ((test_bit(AF2_INIT_DONE, &a->flags2)) in esas2r_adapter_power_down()
461 && (!test_bit(AF_DEGRADED_MODE, &a->flags))) { in esas2r_adapter_power_down()
463 del_timer_sync(&a->timer); in esas2r_adapter_power_down()
464 tasklet_kill(&a->tasklet); in esas2r_adapter_power_down()
466 esas2r_power_down(a); in esas2r_adapter_power_down()
478 if (a->sysfs_fw_created) { in esas2r_adapter_power_down()
479 sysfs_remove_bin_file(&a->host->shost_dev.kobj, &bin_attr_fw); in esas2r_adapter_power_down()
480 a->sysfs_fw_created = 0; in esas2r_adapter_power_down()
483 if (a->sysfs_fs_created) { in esas2r_adapter_power_down()
484 sysfs_remove_bin_file(&a->host->shost_dev.kobj, &bin_attr_fs); in esas2r_adapter_power_down()
485 a->sysfs_fs_created = 0; in esas2r_adapter_power_down()
488 if (a->sysfs_vda_created) { in esas2r_adapter_power_down()
489 sysfs_remove_bin_file(&a->host->shost_dev.kobj, &bin_attr_vda); in esas2r_adapter_power_down()
490 a->sysfs_vda_created = 0; in esas2r_adapter_power_down()
493 if (a->sysfs_hw_created) { in esas2r_adapter_power_down()
494 sysfs_remove_bin_file(&a->host->shost_dev.kobj, &bin_attr_hw); in esas2r_adapter_power_down()
495 a->sysfs_hw_created = 0; in esas2r_adapter_power_down()
498 if (a->sysfs_live_nvram_created) { in esas2r_adapter_power_down()
499 sysfs_remove_bin_file(&a->host->shost_dev.kobj, in esas2r_adapter_power_down()
501 a->sysfs_live_nvram_created = 0; in esas2r_adapter_power_down()
504 if (a->sysfs_default_nvram_created) { in esas2r_adapter_power_down()
505 sysfs_remove_bin_file(&a->host->shost_dev.kobj, in esas2r_adapter_power_down()
507 a->sysfs_default_nvram_created = 0; in esas2r_adapter_power_down()
511 if (test_bit(AF2_IRQ_CLAIMED, &a->flags2)) { in esas2r_adapter_power_down()
513 &(a->pcid->dev), in esas2r_adapter_power_down()
514 "free_irq(%d) called", a->pcid->irq); in esas2r_adapter_power_down()
516 free_irq(a->pcid->irq, a); in esas2r_adapter_power_down()
518 clear_bit(AF2_IRQ_CLAIMED, &a->flags2); in esas2r_adapter_power_down()
521 if (test_bit(AF2_MSI_ENABLED, &a->flags2)) { in esas2r_adapter_power_down()
522 pci_disable_msi(a->pcid); in esas2r_adapter_power_down()
523 clear_bit(AF2_MSI_ENABLED, &a->flags2); in esas2r_adapter_power_down()
527 if (a->inbound_list_md.virt_addr) in esas2r_adapter_power_down()
528 esas2r_initmem_free(a, &a->inbound_list_md); in esas2r_adapter_power_down()
530 if (a->outbound_list_md.virt_addr) in esas2r_adapter_power_down()
531 esas2r_initmem_free(a, &a->outbound_list_md); in esas2r_adapter_power_down()
533 list_for_each_entry_safe(memdesc, next, &a->free_sg_list_head, in esas2r_adapter_power_down()
535 esas2r_initmem_free(a, memdesc); in esas2r_adapter_power_down()
539 list_for_each_entry_safe(memdesc, next, &a->vrq_mds_head, next_desc) { in esas2r_adapter_power_down()
540 esas2r_initmem_free(a, memdesc); in esas2r_adapter_power_down()
545 kfree(a->first_ae_req); in esas2r_adapter_power_down()
546 a->first_ae_req = NULL; in esas2r_adapter_power_down()
548 kfree(a->sg_list_mds); in esas2r_adapter_power_down()
549 a->sg_list_mds = NULL; in esas2r_adapter_power_down()
551 kfree(a->req_table); in esas2r_adapter_power_down()
552 a->req_table = NULL; in esas2r_adapter_power_down()
554 if (a->regs) { in esas2r_adapter_power_down()
555 esas2r_unmap_regions(a); in esas2r_adapter_power_down()
556 a->regs = NULL; in esas2r_adapter_power_down()
557 a->data_window = NULL; in esas2r_adapter_power_down()
565 struct esas2r_adapter *a = esas2r_adapters[i]; in esas2r_kill_adapter() local
567 if (a) { in esas2r_kill_adapter()
570 esas2r_debug("killing adapter %p [%d] ", a, i); in esas2r_kill_adapter()
571 esas2r_fw_event_off(a); in esas2r_kill_adapter()
572 esas2r_adapter_power_down(a, 0); in esas2r_kill_adapter()
574 (a->pcid == esas2r_buffered_ioctl_pcid)) { in esas2r_kill_adapter()
575 dma_free_coherent(&a->pcid->dev, in esas2r_kill_adapter()
582 if (a->vda_buffer) { in esas2r_kill_adapter()
583 dma_free_coherent(&a->pcid->dev, in esas2r_kill_adapter()
585 a->vda_buffer, in esas2r_kill_adapter()
586 (dma_addr_t)a->ppvda_buffer); in esas2r_kill_adapter()
587 a->vda_buffer = NULL; in esas2r_kill_adapter()
589 if (a->fs_api_buffer) { in esas2r_kill_adapter()
590 dma_free_coherent(&a->pcid->dev, in esas2r_kill_adapter()
591 (size_t)a->fs_api_buffer_size, in esas2r_kill_adapter()
592 a->fs_api_buffer, in esas2r_kill_adapter()
593 (dma_addr_t)a->ppfs_api_buffer); in esas2r_kill_adapter()
594 a->fs_api_buffer = NULL; in esas2r_kill_adapter()
597 kfree(a->local_atto_ioctl); in esas2r_kill_adapter()
598 a->local_atto_ioctl = NULL; in esas2r_kill_adapter()
600 spin_lock_irqsave(&a->fw_event_lock, flags); in esas2r_kill_adapter()
601 wq = a->fw_event_q; in esas2r_kill_adapter()
602 a->fw_event_q = NULL; in esas2r_kill_adapter()
603 spin_unlock_irqrestore(&a->fw_event_lock, flags); in esas2r_kill_adapter()
607 if (a->uncached) { in esas2r_kill_adapter()
608 dma_free_coherent(&a->pcid->dev, in esas2r_kill_adapter()
609 (size_t)a->uncached_size, in esas2r_kill_adapter()
610 a->uncached, in esas2r_kill_adapter()
611 (dma_addr_t)a->uncached_phys); in esas2r_kill_adapter()
612 a->uncached = NULL; in esas2r_kill_adapter()
617 &(a->pcid->dev), in esas2r_kill_adapter()
620 a->pcid->msix_enabled, in esas2r_kill_adapter()
621 a->pcid->msi_enabled, in esas2r_kill_adapter()
622 a->pcid->irq, in esas2r_kill_adapter()
623 a->pcid->pin); in esas2r_kill_adapter()
626 &(a->pcid->dev), in esas2r_kill_adapter()
628 a->pcid->enable_cnt.counter); in esas2r_kill_adapter()
630 pci_disable_device(a->pcid); in esas2r_kill_adapter()
632 &(a->pcid->dev), in esas2r_kill_adapter()
634 a->pcid->enable_cnt.counter); in esas2r_kill_adapter()
637 &(a->pcid->dev), in esas2r_kill_adapter()
639 a->pcid); in esas2r_kill_adapter()
641 pci_set_drvdata(a->pcid, NULL); in esas2r_kill_adapter()
644 if (test_bit(AF2_INIT_DONE, &a->flags2)) { in esas2r_kill_adapter()
645 clear_bit(AF2_INIT_DONE, &a->flags2); in esas2r_kill_adapter()
647 set_bit(AF_DEGRADED_MODE, &a->flags); in esas2r_kill_adapter()
650 &(a->host->shost_gendev), in esas2r_kill_adapter()
653 scsi_remove_host(a->host); in esas2r_kill_adapter()
656 &(a->host->shost_gendev), in esas2r_kill_adapter()
659 scsi_host_put(a->host); in esas2r_kill_adapter()
666 struct esas2r_adapter *a; in esas2r_cleanup() local
679 a = (struct esas2r_adapter *)host->hostdata; in esas2r_cleanup()
680 index = a->index; in esas2r_cleanup()
689 struct esas2r_adapter *a = (struct esas2r_adapter *)host->hostdata; in esas2r_suspend() local
692 if (!a) in esas2r_suspend()
695 esas2r_adapter_power_down(a, 1); in esas2r_suspend()
713 struct esas2r_adapter *a = (struct esas2r_adapter *)host->hostdata; in esas2r_resume() local
733 if (!a) { in esas2r_resume()
738 if (esas2r_map_regions(a) != 0) { in esas2r_resume()
745 esas2r_setup_interrupts(a, a->intr_mode); in esas2r_resume()
751 esas2r_disable_chip_interrupts(a); in esas2r_resume()
752 if (!esas2r_power_up(a, true)) { in esas2r_resume()
758 esas2r_claim_interrupts(a); in esas2r_resume()
760 if (test_bit(AF2_IRQ_CLAIMED, &a->flags2)) { in esas2r_resume()
765 esas2r_enable_chip_interrupts(a); in esas2r_resume()
766 esas2r_kickoff_timer(a); in esas2r_resume()
780 bool esas2r_set_degraded_mode(struct esas2r_adapter *a, char *error_str) in esas2r_set_degraded_mode() argument
782 set_bit(AF_DEGRADED_MODE, &a->flags); in esas2r_set_degraded_mode()
788 u32 esas2r_get_uncached_size(struct esas2r_adapter *a) in esas2r_get_uncached_size() argument
805 static void esas2r_init_pci_cfg_space(struct esas2r_adapter *a) in esas2r_init_pci_cfg_space() argument
809 pcie_cap_reg = pci_find_capability(a->pcid, PCI_CAP_ID_EXP); in esas2r_init_pci_cfg_space()
813 pci_read_config_word(a->pcid, pcie_cap_reg + PCI_EXP_DEVCTL, in esas2r_init_pci_cfg_space()
823 pci_write_config_word(a->pcid, in esas2r_init_pci_cfg_space()
834 bool esas2r_init_adapter_struct(struct esas2r_adapter *a, in esas2r_init_adapter_struct() argument
843 spin_lock_init(&a->sg_list_lock); in esas2r_init_adapter_struct()
844 spin_lock_init(&a->mem_lock); in esas2r_init_adapter_struct()
845 spin_lock_init(&a->queue_lock); in esas2r_init_adapter_struct()
847 a->targetdb_end = &a->targetdb[ESAS2R_MAX_TARGETS]; in esas2r_init_adapter_struct()
849 if (!alloc_vda_req(a, &a->general_req)) { in esas2r_init_adapter_struct()
856 a->first_ae_req = in esas2r_init_adapter_struct()
860 if (a->first_ae_req == NULL) { in esas2r_init_adapter_struct()
867 a->sg_list_mds = kzalloc( in esas2r_init_adapter_struct()
870 if (a->sg_list_mds == NULL) { in esas2r_init_adapter_struct()
877 a->req_table = in esas2r_init_adapter_struct()
881 if (a->req_table == NULL) { in esas2r_init_adapter_struct()
888 esas2r_init_pci_cfg_space(a); in esas2r_init_adapter_struct()
894 if ((a->pcid->subsystem_vendor == ATTO_VENDOR_ID) in esas2r_init_adapter_struct()
895 && (a->pcid->subsystem_device & ATTO_SSDID_TBT)) in esas2r_init_adapter_struct()
896 a->flags2 |= AF2_THUNDERBOLT; in esas2r_init_adapter_struct()
898 if (test_bit(AF2_THUNDERBOLT, &a->flags2)) in esas2r_init_adapter_struct()
899 a->flags2 |= AF2_SERIAL_FLASH; in esas2r_init_adapter_struct()
901 if (a->pcid->subsystem_device == ATTO_TLSH_1068) in esas2r_init_adapter_struct()
902 a->flags2 |= AF2_THUNDERLINK; in esas2r_init_adapter_struct()
909 for (i = 0, sgl = a->sg_list_mds; i < num_sg_lists; i++, sgl++) { in esas2r_init_adapter_struct()
912 list_add_tail(&sgl->next_desc, &a->free_sg_list_head); in esas2r_init_adapter_struct()
914 if (!esas2r_initmem_alloc(a, sgl, ESAS2R_SGL_ALIGN)) { in esas2r_init_adapter_struct()
923 a->list_size = num_requests + ESAS2R_LIST_EXTRA; in esas2r_init_adapter_struct()
926 a->inbound_list_md.size = a->list_size * in esas2r_init_adapter_struct()
930 if (!esas2r_initmem_alloc(a, &a->inbound_list_md, ESAS2R_LIST_ALIGN)) { in esas2r_init_adapter_struct()
936 a->outbound_list_md.size = a->list_size * in esas2r_init_adapter_struct()
939 if (!esas2r_initmem_alloc(a, &a->outbound_list_md, in esas2r_init_adapter_struct()
946 a->nvram = (struct esas2r_sas_nvram *)high; in esas2r_init_adapter_struct()
950 a->disc_buffer = high; in esas2r_init_adapter_struct()
955 a->outbound_copy = (u32 volatile *)high; in esas2r_init_adapter_struct()
958 if (!test_bit(AF_NVR_VALID, &a->flags)) in esas2r_init_adapter_struct()
959 esas2r_nvram_set_defaults(a); in esas2r_init_adapter_struct()
965 if (test_bit(AF_FIRST_INIT, &a->flags)) { in esas2r_init_adapter_struct()
966 memset(a->req_table, 0, in esas2r_init_adapter_struct()
970 esas2r_targ_db_initialize(a); in esas2r_init_adapter_struct()
974 (struct esas2r_inbound_list_source_entry *)a-> in esas2r_init_adapter_struct()
978 for (i = 0; i < a->list_size; i++) { in esas2r_init_adapter_struct()
990 for (rq = a->first_ae_req, i = 0; i < num_ae_requests; rq++, in esas2r_init_adapter_struct()
993 if (!alloc_vda_req(a, rq)) { in esas2r_init_adapter_struct()
999 esas2r_rq_init_request(rq, a); in esas2r_init_adapter_struct()
1010 bool esas2r_check_adapter(struct esas2r_adapter *a) in esas2r_check_adapter() argument
1021 if (test_bit(AF_CHPRST_DETECTED, &a->flags)) in esas2r_check_adapter()
1028 esas2r_write_register_dword(a, MU_INT_MASK_OUT, ESAS2R_INT_DIS_MASK); in esas2r_check_adapter()
1029 esas2r_flush_register_dword(a, MU_INT_MASK_OUT); in esas2r_check_adapter()
1038 esas2r_force_interrupt(a); in esas2r_check_adapter()
1039 doorbell = esas2r_read_register_dword(a, MU_DOORBELL_OUT); in esas2r_check_adapter()
1046 return esas2r_set_degraded_mode(a, in esas2r_check_adapter()
1055 esas2r_write_register_dword(a, MU_DOORBELL_OUT, in esas2r_check_adapter()
1059 set_bit(AF_LEGACY_SGE_MODE, &a->flags); in esas2r_check_adapter()
1061 a->max_vdareq_size = 128; in esas2r_check_adapter()
1062 a->build_sgl = esas2r_build_sg_list_sge; in esas2r_check_adapter()
1064 clear_bit(AF_LEGACY_SGE_MODE, &a->flags); in esas2r_check_adapter()
1066 a->max_vdareq_size = 1024; in esas2r_check_adapter()
1067 a->build_sgl = esas2r_build_sg_list_prd; in esas2r_check_adapter()
1069 return esas2r_set_degraded_mode(a, in esas2r_check_adapter()
1081 return esas2r_set_degraded_mode(a, in esas2r_check_adapter()
1087 esas2r_write_register_dword(a, MU_DOORBELL_IN, DRBL_MSG_IFC_DOWN); in esas2r_check_adapter()
1091 doorbell = esas2r_read_register_dword(a, MU_DOORBELL_OUT); in esas2r_check_adapter()
1093 esas2r_write_register_dword(a, MU_DOORBELL_OUT, in esas2r_check_adapter()
1110 dw = esas2r_read_register_dword(a, MU_IN_LIST_CONFIG); in esas2r_check_adapter()
1112 esas2r_write_register_dword(a, MU_IN_LIST_CONFIG, dw); in esas2r_check_adapter()
1113 dw = esas2r_read_register_dword(a, MU_OUT_LIST_CONFIG); in esas2r_check_adapter()
1115 esas2r_write_register_dword(a, MU_OUT_LIST_CONFIG, dw); in esas2r_check_adapter()
1118 ppaddr = a->inbound_list_md.phys_addr; in esas2r_check_adapter()
1119 esas2r_write_register_dword(a, MU_IN_LIST_ADDR_LO, in esas2r_check_adapter()
1121 esas2r_write_register_dword(a, MU_IN_LIST_ADDR_HI, in esas2r_check_adapter()
1123 ppaddr = a->outbound_list_md.phys_addr; in esas2r_check_adapter()
1124 esas2r_write_register_dword(a, MU_OUT_LIST_ADDR_LO, in esas2r_check_adapter()
1126 esas2r_write_register_dword(a, MU_OUT_LIST_ADDR_HI, in esas2r_check_adapter()
1128 ppaddr = a->uncached_phys + in esas2r_check_adapter()
1129 ((u8 *)a->outbound_copy - a->uncached); in esas2r_check_adapter()
1130 esas2r_write_register_dword(a, MU_OUT_LIST_COPY_PTR_LO, in esas2r_check_adapter()
1132 esas2r_write_register_dword(a, MU_OUT_LIST_COPY_PTR_HI, in esas2r_check_adapter()
1136 *a->outbound_copy = in esas2r_check_adapter()
1137 a->last_write = in esas2r_check_adapter()
1138 a->last_read = a->list_size - 1; in esas2r_check_adapter()
1139 set_bit(AF_COMM_LIST_TOGGLE, &a->flags); in esas2r_check_adapter()
1140 esas2r_write_register_dword(a, MU_IN_LIST_WRITE, MU_ILW_TOGGLE | in esas2r_check_adapter()
1141 a->last_write); in esas2r_check_adapter()
1142 esas2r_write_register_dword(a, MU_OUT_LIST_COPY, MU_OLC_TOGGLE | in esas2r_check_adapter()
1143 a->last_write); in esas2r_check_adapter()
1144 esas2r_write_register_dword(a, MU_IN_LIST_READ, MU_ILR_TOGGLE | in esas2r_check_adapter()
1145 a->last_write); in esas2r_check_adapter()
1146 esas2r_write_register_dword(a, MU_OUT_LIST_WRITE, in esas2r_check_adapter()
1147 MU_OLW_TOGGLE | a->last_write); in esas2r_check_adapter()
1150 dw = esas2r_read_register_dword(a, MU_IN_LIST_IFC_CONFIG); in esas2r_check_adapter()
1152 esas2r_write_register_dword(a, MU_IN_LIST_IFC_CONFIG, in esas2r_check_adapter()
1154 dw = esas2r_read_register_dword(a, MU_OUT_LIST_IFC_CONFIG); in esas2r_check_adapter()
1156 esas2r_write_register_dword(a, MU_OUT_LIST_IFC_CONFIG, in esas2r_check_adapter()
1161 dw = esas2r_read_register_dword(a, MU_IN_LIST_CONFIG); in esas2r_check_adapter()
1164 | (a->list_size << MU_ILC_NUMBER_SHIFT); in esas2r_check_adapter()
1165 esas2r_write_register_dword(a, MU_IN_LIST_CONFIG, dw); in esas2r_check_adapter()
1166 dw = esas2r_read_register_dword(a, MU_OUT_LIST_CONFIG); in esas2r_check_adapter()
1168 dw |= MU_OLC_ENTRY_4_DW | (a->list_size << MU_OLC_NUMBER_SHIFT); in esas2r_check_adapter()
1169 esas2r_write_register_dword(a, MU_OUT_LIST_CONFIG, dw); in esas2r_check_adapter()
1176 esas2r_write_register_dword(a, MU_DOORBELL_IN, DRBL_MSG_IFC_INIT); in esas2r_check_adapter()
1180 doorbell = esas2r_read_register_dword(a, MU_DOORBELL_OUT); in esas2r_check_adapter()
1182 esas2r_write_register_dword(a, MU_DOORBELL_OUT, in esas2r_check_adapter()
1193 return esas2r_set_degraded_mode(a, in esas2r_check_adapter()
1202 doorbell = esas2r_read_register_dword(a, MU_DOORBELL_IN_ENB); in esas2r_check_adapter()
1204 set_bit(AF2_VDA_POWER_DOWN, &a->flags2); in esas2r_check_adapter()
1206 clear_bit(AF2_VDA_POWER_DOWN, &a->flags2); in esas2r_check_adapter()
1212 esas2r_write_register_dword(a, MU_OUT_LIST_INT_MASK, MU_OLIS_MASK); in esas2r_check_adapter()
1213 esas2r_write_register_dword(a, MU_DOORBELL_OUT_ENB, DRBL_ENB_MASK); in esas2r_check_adapter()
1218 static bool esas2r_format_init_msg(struct esas2r_adapter *a, in esas2r_format_init_msg() argument
1221 u32 msg = a->init_msg; in esas2r_format_init_msg()
1224 a->init_msg = 0; in esas2r_format_init_msg()
1233 esas2r_build_cfg_req(a, in esas2r_format_init_msg()
1242 a->init_msg = ESAS2R_INIT_MSG_INIT; in esas2r_format_init_msg()
1252 a->fw_version = le16_to_cpu( in esas2r_format_init_msg()
1254 a->fw_build = rq->func_rsp.cfg_rsp.fw_build; in esas2r_format_init_msg()
1259 a->fw_version += (major << 16) + (minor << 24); in esas2r_format_init_msg()
1269 if ((test_bit(AF2_THUNDERBOLT, &a->flags2)) in esas2r_format_init_msg()
1270 || (be32_to_cpu(a->fw_version) > 0x00524702)) { in esas2r_format_init_msg()
1272 esas2r_build_cfg_req(a, in esas2r_format_init_msg()
1287 a->init_msg = ESAS2R_INIT_MSG_GET_INIT; in esas2r_format_init_msg()
1295 a->num_targets_backend = in esas2r_format_init_msg()
1297 a->ioctl_tunnel = in esas2r_format_init_msg()
1316 bool esas2r_init_msgs(struct esas2r_adapter *a) in esas2r_init_msgs() argument
1319 struct esas2r_request *rq = &a->general_req; in esas2r_init_msgs()
1321 esas2r_rq_init_request(rq, a); in esas2r_init_msgs()
1324 if (a->init_msg == 0) in esas2r_init_msgs()
1325 a->init_msg = ESAS2R_INIT_MSG_REINIT; in esas2r_init_msgs()
1327 while (a->init_msg) { in esas2r_init_msgs()
1328 if (esas2r_format_init_msg(a, rq)) { in esas2r_init_msgs()
1331 spin_lock_irqsave(&a->queue_lock, flags); in esas2r_init_msgs()
1332 esas2r_start_vda_request(a, rq); in esas2r_init_msgs()
1333 spin_unlock_irqrestore(&a->queue_lock, flags); in esas2r_init_msgs()
1334 esas2r_wait_request(a, rq); in esas2r_init_msgs()
1346 a->init_msg, rq->req_stat, rq->flags); in esas2r_init_msgs()
1347 a->init_msg = ESAS2R_INIT_MSG_START; in esas2r_init_msgs()
1352 esas2r_rq_destroy_request(rq, a); in esas2r_init_msgs()
1357 bool esas2r_init_adapter_hw(struct esas2r_adapter *a, bool init_poll) in esas2r_init_adapter_hw() argument
1363 if (test_bit(AF_DEGRADED_MODE, &a->flags)) in esas2r_init_adapter_hw()
1366 if (!test_bit(AF_NVR_VALID, &a->flags)) { in esas2r_init_adapter_hw()
1367 if (!esas2r_nvram_read_direct(a)) in esas2r_init_adapter_hw()
1372 if (!esas2r_init_msgs(a)) { in esas2r_init_adapter_hw()
1373 esas2r_set_degraded_mode(a, "init messages failed"); in esas2r_init_adapter_hw()
1378 clear_bit(AF_DEGRADED_MODE, &a->flags); in esas2r_init_adapter_hw()
1379 clear_bit(AF_CHPRST_PENDING, &a->flags); in esas2r_init_adapter_hw()
1382 for (i = 0, rq = a->first_ae_req; i < num_ae_requests; i++, rq++) in esas2r_init_adapter_hw()
1383 esas2r_start_ae_request(a, rq); in esas2r_init_adapter_hw()
1385 if (!a->flash_rev[0]) in esas2r_init_adapter_hw()
1386 esas2r_read_flash_rev(a); in esas2r_init_adapter_hw()
1388 if (!a->image_type[0]) in esas2r_init_adapter_hw()
1389 esas2r_read_image_type(a); in esas2r_init_adapter_hw()
1391 if (a->fw_version == 0) in esas2r_init_adapter_hw()
1392 a->fw_rev[0] = 0; in esas2r_init_adapter_hw()
1394 sprintf(a->fw_rev, "%1d.%02d", in esas2r_init_adapter_hw()
1395 (int)LOBYTE(HIWORD(a->fw_version)), in esas2r_init_adapter_hw()
1396 (int)HIBYTE(HIWORD(a->fw_version))); in esas2r_init_adapter_hw()
1398 esas2r_hdebug("firmware revision: %s", a->fw_rev); in esas2r_init_adapter_hw()
1400 if (test_bit(AF_CHPRST_DETECTED, &a->flags) in esas2r_init_adapter_hw()
1401 && (test_bit(AF_FIRST_INIT, &a->flags))) { in esas2r_init_adapter_hw()
1402 esas2r_enable_chip_interrupts(a); in esas2r_init_adapter_hw()
1407 esas2r_disc_initialize(a); in esas2r_init_adapter_hw()
1417 u32 currtime = a->disc_start_time; in esas2r_init_adapter_hw()
1425 set_bit(AF_TASKLET_SCHEDULED, &a->flags); in esas2r_init_adapter_hw()
1426 set_bit(AF_DISC_POLLED, &a->flags); in esas2r_init_adapter_hw()
1433 if (test_bit(AF_FIRST_INIT, &a->flags)) in esas2r_init_adapter_hw()
1434 atomic_dec(&a->disable_cnt); in esas2r_init_adapter_hw()
1436 while (test_bit(AF_DISC_PENDING, &a->flags)) { in esas2r_init_adapter_hw()
1455 if (!test_bit(AF_CHPRST_PENDING, &a->flags)) in esas2r_init_adapter_hw()
1456 esas2r_disc_check_for_work(a); in esas2r_init_adapter_hw()
1463 esas2r_timer_tick(a); in esas2r_init_adapter_hw()
1470 if (esas2r_is_tasklet_pending(a)) in esas2r_init_adapter_hw()
1471 esas2r_do_tasklet_tasks(a); in esas2r_init_adapter_hw()
1475 if (test_bit(AF_FIRST_INIT, &a->flags)) in esas2r_init_adapter_hw()
1476 atomic_inc(&a->disable_cnt); in esas2r_init_adapter_hw()
1478 clear_bit(AF_DISC_POLLED, &a->flags); in esas2r_init_adapter_hw()
1479 clear_bit(AF_TASKLET_SCHEDULED, &a->flags); in esas2r_init_adapter_hw()
1483 esas2r_targ_db_report_changes(a); in esas2r_init_adapter_hw()
1492 esas2r_disc_start_waiting(a); in esas2r_init_adapter_hw()
1495 a->int_mask = ESAS2R_INT_STS_MASK; in esas2r_init_adapter_hw()
1496 esas2r_enable_chip_interrupts(a); in esas2r_init_adapter_hw()
1497 esas2r_enable_heartbeat(a); in esas2r_init_adapter_hw()
1506 if (test_bit(AF_CHPRST_DETECTED, &a->flags) && in esas2r_init_adapter_hw()
1507 test_bit(AF_FIRST_INIT, &a->flags)) { in esas2r_init_adapter_hw()
1514 clear_bit(AF_CHPRST_PENDING, &a->flags); in esas2r_init_adapter_hw()
1518 clear_bit(AF_CHPRST_PENDING, &a->flags); in esas2r_init_adapter_hw()
1519 clear_bit(AF_DISC_PENDING, &a->flags); in esas2r_init_adapter_hw()
1524 if (test_bit(AF_FIRST_INIT, &a->flags)) { in esas2r_init_adapter_hw()
1525 clear_bit(AF_FIRST_INIT, &a->flags); in esas2r_init_adapter_hw()
1527 if (atomic_dec_return(&a->disable_cnt) == 0) in esas2r_init_adapter_hw()
1528 esas2r_do_deferred_processes(a); in esas2r_init_adapter_hw()
1535 void esas2r_reset_adapter(struct esas2r_adapter *a) in esas2r_reset_adapter() argument
1537 set_bit(AF_OS_RESET, &a->flags); in esas2r_reset_adapter()
1538 esas2r_local_reset_adapter(a); in esas2r_reset_adapter()
1539 esas2r_schedule_tasklet(a); in esas2r_reset_adapter()
1542 void esas2r_reset_chip(struct esas2r_adapter *a) in esas2r_reset_chip() argument
1544 if (!esas2r_is_adapter_present(a)) in esas2r_reset_chip()
1552 if (test_bit(AF2_COREDUMP_AVAIL, &a->flags2) && in esas2r_reset_chip()
1553 !test_bit(AF2_COREDUMP_SAVED, &a->flags2)) { in esas2r_reset_chip()
1554 esas2r_read_mem_block(a, in esas2r_reset_chip()
1555 a->fw_coredump_buff, in esas2r_reset_chip()
1559 set_bit(AF2_COREDUMP_SAVED, &a->flags2); in esas2r_reset_chip()
1562 clear_bit(AF2_COREDUMP_AVAIL, &a->flags2); in esas2r_reset_chip()
1565 if (a->pcid->revision == MVR_FREY_B2) in esas2r_reset_chip()
1566 esas2r_write_register_dword(a, MU_CTL_STATUS_IN_B2, in esas2r_reset_chip()
1569 esas2r_write_register_dword(a, MU_CTL_STATUS_IN, in esas2r_reset_chip()
1577 static void esas2r_power_down_notify_firmware(struct esas2r_adapter *a) in esas2r_power_down_notify_firmware() argument
1582 esas2r_write_register_dword(a, MU_DOORBELL_IN, DRBL_POWER_DOWN); in esas2r_power_down_notify_firmware()
1586 doorbell = esas2r_read_register_dword(a, MU_DOORBELL_OUT); in esas2r_power_down_notify_firmware()
1588 esas2r_write_register_dword(a, MU_DOORBELL_OUT, in esas2r_power_down_notify_firmware()
1606 void esas2r_power_down(struct esas2r_adapter *a) in esas2r_power_down() argument
1608 set_bit(AF_POWER_MGT, &a->flags); in esas2r_power_down()
1609 set_bit(AF_POWER_DOWN, &a->flags); in esas2r_power_down()
1611 if (!test_bit(AF_DEGRADED_MODE, &a->flags)) { in esas2r_power_down()
1621 esas2r_disable_chip_interrupts(a); in esas2r_power_down()
1622 esas2r_disable_heartbeat(a); in esas2r_power_down()
1625 esas2r_write_register_dword(a, MU_DOORBELL_IN, in esas2r_power_down()
1631 esas2r_read_register_dword(a, MU_DOORBELL_OUT); in esas2r_power_down()
1633 esas2r_write_register_dword(a, MU_DOORBELL_OUT, in esas2r_power_down()
1651 if (test_bit(AF2_VDA_POWER_DOWN, &a->flags2)) in esas2r_power_down()
1652 esas2r_power_down_notify_firmware(a); in esas2r_power_down()
1656 set_bit(AF_OS_RESET, &a->flags); in esas2r_power_down()
1657 set_bit(AF_DISC_PENDING, &a->flags); in esas2r_power_down()
1658 set_bit(AF_CHPRST_PENDING, &a->flags); in esas2r_power_down()
1660 esas2r_process_adapter_reset(a); in esas2r_power_down()
1663 a->prev_dev_cnt = esas2r_targ_db_get_tgt_cnt(a); in esas2r_power_down()
1664 esas2r_targ_db_remove_all(a, false); in esas2r_power_down()
1671 bool esas2r_power_up(struct esas2r_adapter *a, bool init_poll) in esas2r_power_up() argument
1675 clear_bit(AF_POWER_DOWN, &a->flags); in esas2r_power_up()
1676 esas2r_init_pci_cfg_space(a); in esas2r_power_up()
1677 set_bit(AF_FIRST_INIT, &a->flags); in esas2r_power_up()
1678 atomic_inc(&a->disable_cnt); in esas2r_power_up()
1681 ret = esas2r_check_adapter(a); in esas2r_power_up()
1682 if (!esas2r_init_adapter_hw(a, init_poll)) in esas2r_power_up()
1686 esas2r_send_reset_ae(a, true); in esas2r_power_up()
1689 clear_bit(AF_POWER_MGT, &a->flags); in esas2r_power_up()
1693 bool esas2r_is_adapter_present(struct esas2r_adapter *a) in esas2r_is_adapter_present() argument
1695 if (test_bit(AF_NOT_PRESENT, &a->flags)) in esas2r_is_adapter_present()
1698 if (esas2r_read_register_dword(a, MU_DOORBELL_OUT) == 0xFFFFFFFF) { in esas2r_is_adapter_present()
1699 set_bit(AF_NOT_PRESENT, &a->flags); in esas2r_is_adapter_present()
1706 const char *esas2r_get_model_name(struct esas2r_adapter *a) in esas2r_get_model_name() argument
1708 switch (a->pcid->subsystem_device) { in esas2r_get_model_name()
1740 const char *esas2r_get_model_name_short(struct esas2r_adapter *a) in esas2r_get_model_name_short() argument
1742 switch (a->pcid->subsystem_device) { in esas2r_get_model_name_short()