Lines Matching +full:ext +full:- +full:irq +full:- +full:range
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
4 * Copyright (c) 2014- QLogic Corporation.
8 * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
47 int bfa_linkup_delay = -1;
59 #define BFAD_FW_FILE_CB "cbfw-3.2.5.1.bin"
60 #define BFAD_FW_FILE_CT "ctfw-3.2.5.1.bin"
61 #define BFAD_FW_FILE_CT2 "ct2fw-3.2.5.1.bin"
110 "Range[>0]");
112 MODULE_PARM_DESC(bfa_lun_queue_depth, "Lun queue depth, default=32, Range[>0]");
117 "Range[Critical:1|Error:2|Warning:3|Info:4]");
120 "Range[off:0|on:1]");
124 "[RHEL5, SLES10, ESX40] Range[>0]");
126 …sable_cb, "Disable Message Signaled Interrupts for QLogic-415/425/815/825 cards, default=0 Range[f…
128 …Message Signaled Interrupts if possible for QLogic-1010/1020/804/1007/902/1741 cards, default=0, R…
131 "Range[false:0|true:1]");
134 "(use system setting), Range[128|256|512|1024|2048|4096]");
137 " Range[false:0|true:1]");
140 " Range[64k|128k|256k|512k|1024k|2048k]");
170 bfad->bfad_tsk = kthread_create(bfad_worker, (void *) bfad, in bfad_sm_uninit()
172 if (IS_ERR(bfad->bfad_tsk)) { in bfad_sm_uninit()
174 "creation failed!\n", bfad->inst_no); in bfad_sm_uninit()
204 init_completion(&bfad->comp); in bfad_sm_created()
209 bfad->inst_no); in bfad_sm_created()
214 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_sm_created()
215 bfa_iocfc_init(&bfad->bfa); in bfad_sm_created()
216 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_sm_created()
219 if ((bfad->bfad_flags & BFAD_MSIX_ON) && in bfad_sm_created()
222 __func__, bfad->inst_no); in bfad_sm_created()
227 wait_for_completion(&bfad->comp); in bfad_sm_created()
229 if ((bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { in bfad_sm_created()
234 bfad->pci_name); in bfad_sm_created()
235 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_sm_created()
236 bfa_fcs_init(&bfad->bfa_fcs); in bfad_sm_created()
237 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_sm_created()
241 init_completion(&bfad->comp); in bfad_sm_created()
243 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_sm_created()
244 bfad->pport.flags |= BFAD_PORT_DELETE; in bfad_sm_created()
245 bfa_fcs_exit(&bfad->bfa_fcs); in bfad_sm_created()
246 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_sm_created()
248 wait_for_completion(&bfad->comp); in bfad_sm_created()
253 bfad->bfad_flags |= BFAD_HAL_INIT_FAIL; in bfad_sm_created()
278 kthread_stop(bfad->bfad_tsk); in bfad_sm_initializing()
279 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_sm_initializing()
280 bfad->bfad_tsk = NULL; in bfad_sm_initializing()
281 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_sm_initializing()
293 kthread_stop(bfad->bfad_tsk); in bfad_sm_initializing()
294 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_sm_initializing()
295 bfad->bfad_tsk = NULL; in bfad_sm_initializing()
296 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_sm_initializing()
330 del_timer_sync(&bfad->hal_tmo); in bfad_sm_failed()
379 del_timer_sync(&bfad->hal_tmo); in bfad_sm_stopping()
381 bfad->bfad_flags &= ~BFAD_FC4_PROBE_DONE; in bfad_sm_stopping()
399 fcomp->status = status; in bfad_hcb_comp()
400 complete(&fcomp->comp); in bfad_hcb_comp()
412 bfad->bfad_flags |= BFAD_HAL_INIT_DONE; in bfa_cb_init()
419 if ((bfad->bfad_flags & BFAD_HAL_INIT_FAIL)) { in bfa_cb_init()
420 bfad->bfad_flags &= ~BFAD_HAL_INIT_FAIL; in bfa_cb_init()
421 wake_up_process(bfad->bfad_tsk); in bfa_cb_init()
425 complete(&bfad->comp); in bfa_cb_init()
440 port_drv = &bfad->pport; in bfa_fcb_lport_new()
441 port_drv->pvb_type = BFAD_PORT_PHYS_BASE; in bfa_fcb_lport_new()
443 port_drv = &vf_drv->base_port; in bfa_fcb_lport_new()
444 port_drv->pvb_type = BFAD_PORT_VF_BASE; in bfa_fcb_lport_new()
446 port_drv = &vp_drv->drv_port; in bfa_fcb_lport_new()
447 port_drv->pvb_type = BFAD_PORT_PHYS_VPORT; in bfa_fcb_lport_new()
449 port_drv = &vp_drv->drv_port; in bfa_fcb_lport_new()
450 port_drv->pvb_type = BFAD_PORT_VF_VPORT; in bfa_fcb_lport_new()
453 port_drv->fcs_port = port; in bfa_fcb_lport_new()
454 port_drv->roles = roles; in bfa_fcb_lport_new()
479 goto ext; in bfa_fcb_rport_alloc()
482 *rport = &(*rport_drv)->fcs_rport; in bfa_fcb_rport_alloc()
484 ext: in bfa_fcb_rport_alloc()
505 vport->drv_port.bfad = bfad; in bfa_fcb_pbc_vport_create()
511 rc = bfa_fcs_pbc_vport_create(&vport->fcs_vport, &bfad->bfa_fcs, 0, in bfa_fcb_pbc_vport_create()
519 list_add_tail(&vport->list_entry, &bfad->pbc_vport_list); in bfa_fcb_pbc_vport_create()
525 struct bfa_meminfo_s *hal_meminfo = &bfad->meminfo; in bfad_hal_mem_release()
530 dma_info = &hal_meminfo->dma_info; in bfad_hal_mem_release()
531 kva_info = &hal_meminfo->kva_info; in bfad_hal_mem_release()
534 list_for_each(km_qe, &kva_info->qe) { in bfad_hal_mem_release()
536 vfree(kva_elem->kva); in bfad_hal_mem_release()
540 list_for_each(dm_qe, &dma_info->qe) { in bfad_hal_mem_release()
542 dma_free_coherent(&bfad->pcidev->dev, in bfad_hal_mem_release()
543 dma_elem->mem_len, dma_elem->kva, in bfad_hal_mem_release()
544 (dma_addr_t) dma_elem->dma); in bfad_hal_mem_release()
554 bfa_cfg->fwcfg.num_rports = num_rports; in bfad_update_hal_cfg()
556 bfa_cfg->fwcfg.num_ioim_reqs = num_ios; in bfad_update_hal_cfg()
558 bfa_cfg->fwcfg.num_tskim_reqs = num_tms; in bfad_update_hal_cfg()
560 bfa_cfg->fwcfg.num_fcxp_reqs = num_fcxps; in bfad_update_hal_cfg()
562 bfa_cfg->fwcfg.num_uf_bufs = num_ufbufs; in bfad_update_hal_cfg()
564 bfa_cfg->drvcfg.num_reqq_elems = reqq_size; in bfad_update_hal_cfg()
566 bfa_cfg->drvcfg.num_rspq_elems = rspq_size; in bfad_update_hal_cfg()
568 bfa_cfg->drvcfg.num_sgpgs = num_sgpgs; in bfad_update_hal_cfg()
574 num_rports = bfa_cfg->fwcfg.num_rports; in bfad_update_hal_cfg()
575 num_ios = bfa_cfg->fwcfg.num_ioim_reqs; in bfad_update_hal_cfg()
576 num_tms = bfa_cfg->fwcfg.num_tskim_reqs; in bfad_update_hal_cfg()
577 num_fcxps = bfa_cfg->fwcfg.num_fcxp_reqs; in bfad_update_hal_cfg()
578 num_ufbufs = bfa_cfg->fwcfg.num_uf_bufs; in bfad_update_hal_cfg()
579 reqq_size = bfa_cfg->drvcfg.num_reqq_elems; in bfad_update_hal_cfg()
580 rspq_size = bfa_cfg->drvcfg.num_rspq_elems; in bfad_update_hal_cfg()
581 num_sgpgs = bfa_cfg->drvcfg.num_sgpgs; in bfad_update_hal_cfg()
587 struct bfa_meminfo_s *hal_meminfo = &bfad->meminfo; in bfad_hal_mem_alloc()
594 bfa_cfg_get_default(&bfad->ioc_cfg); in bfad_hal_mem_alloc()
595 bfad_update_hal_cfg(&bfad->ioc_cfg); in bfad_hal_mem_alloc()
596 bfad->cfg_data.ioc_queue_depth = bfad->ioc_cfg.fwcfg.num_ioim_reqs; in bfad_hal_mem_alloc()
597 bfa_cfg_get_meminfo(&bfad->ioc_cfg, hal_meminfo, &bfad->bfa); in bfad_hal_mem_alloc()
599 dma_info = &hal_meminfo->dma_info; in bfad_hal_mem_alloc()
600 kva_info = &hal_meminfo->kva_info; in bfad_hal_mem_alloc()
603 list_for_each(km_qe, &kva_info->qe) { in bfad_hal_mem_alloc()
605 kva_elem->kva = vzalloc(kva_elem->mem_len); in bfad_hal_mem_alloc()
606 if (kva_elem->kva == NULL) { in bfad_hal_mem_alloc()
609 goto ext; in bfad_hal_mem_alloc()
614 list_for_each(dm_qe, &dma_info->qe) { in bfad_hal_mem_alloc()
616 dma_elem->kva = dma_alloc_coherent(&bfad->pcidev->dev, in bfad_hal_mem_alloc()
617 dma_elem->mem_len, in bfad_hal_mem_alloc()
619 if (dma_elem->kva == NULL) { in bfad_hal_mem_alloc()
622 goto ext; in bfad_hal_mem_alloc()
624 dma_elem->dma = phys_addr; in bfad_hal_mem_alloc()
625 memset(dma_elem->kva, 0, dma_elem->mem_len); in bfad_hal_mem_alloc()
627 ext: in bfad_hal_mem_alloc()
646 goto ext; in bfad_vport_create()
649 vport->drv_port.bfad = bfad; in bfad_vport_create()
650 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_vport_create()
651 rc = bfa_fcs_vport_create(&vport->fcs_vport, &bfad->bfa_fcs, vf_id, in bfad_vport_create()
653 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_vport_create()
658 if (port_cfg->roles & BFA_LPORT_ROLE_FCP_IM) { in bfad_vport_create()
659 rc = bfad_im_scsi_host_alloc(bfad, vport->drv_port.im_port, in bfad_vport_create()
665 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_vport_create()
666 bfa_fcs_vport_start(&vport->fcs_vport); in bfad_vport_create()
667 list_add_tail(&vport->list_entry, &bfad->vport_list); in bfad_vport_create()
668 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_vport_create()
673 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_vport_create()
674 vport->comp_del = &fcomp; in bfad_vport_create()
675 init_completion(vport->comp_del); in bfad_vport_create()
676 bfa_fcs_vport_delete(&vport->fcs_vport); in bfad_vport_create()
677 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_vport_create()
678 wait_for_completion(vport->comp_del); in bfad_vport_create()
681 ext: in bfad_vport_create()
692 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_bfa_tmo()
694 bfa_timer_beat(&bfad->bfa.timer_mod); in bfad_bfa_tmo()
696 bfa_comp_deq(&bfad->bfa, &doneq); in bfad_bfa_tmo()
697 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_bfa_tmo()
700 bfa_comp_process(&bfad->bfa, &doneq); in bfad_bfa_tmo()
701 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_bfa_tmo()
702 bfa_comp_free(&bfad->bfa, &doneq); in bfad_bfa_tmo()
703 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_bfa_tmo()
706 mod_timer(&bfad->hal_tmo, in bfad_bfa_tmo()
713 timer_setup(&bfad->hal_tmo, bfad_bfa_tmo, 0); in bfad_init_timer()
715 mod_timer(&bfad->hal_tmo, in bfad_init_timer()
722 int rc = -ENODEV; in bfad_pci_init()
734 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in bfad_pci_init()
736 rc = -ENODEV; in bfad_pci_init()
741 bfad->pci_bar0_kva = pci_iomap(pdev, 0, pci_resource_len(pdev, 0)); in bfad_pci_init()
742 bfad->pci_bar2_kva = pci_iomap(pdev, 2, pci_resource_len(pdev, 2)); in bfad_pci_init()
744 if (bfad->pci_bar0_kva == NULL) { in bfad_pci_init()
746 rc = -ENODEV; in bfad_pci_init()
750 bfad->hal_pcidev.pci_slot = PCI_SLOT(pdev->devfn); in bfad_pci_init()
751 bfad->hal_pcidev.pci_func = PCI_FUNC(pdev->devfn); in bfad_pci_init()
752 bfad->hal_pcidev.pci_bar_kva = bfad->pci_bar0_kva; in bfad_pci_init()
753 bfad->hal_pcidev.device_id = pdev->device; in bfad_pci_init()
754 bfad->hal_pcidev.ssid = pdev->subsystem_device; in bfad_pci_init()
755 bfad->pci_name = pci_name(pdev); in bfad_pci_init()
757 bfad->pci_attr.vendor_id = pdev->vendor; in bfad_pci_init()
758 bfad->pci_attr.device_id = pdev->device; in bfad_pci_init()
759 bfad->pci_attr.ssid = pdev->subsystem_device; in bfad_pci_init()
760 bfad->pci_attr.ssvid = pdev->subsystem_vendor; in bfad_pci_init()
761 bfad->pci_attr.pcifn = PCI_FUNC(pdev->devfn); in bfad_pci_init()
763 bfad->pcidev = pdev; in bfad_pci_init()
773 "reset to %d\n", bfad->pci_name, max_rq, in bfad_pci_init()
779 bfad->pci_name, pcie_max_read_reqsz); in bfad_pci_init()
798 pci_iounmap(pdev, bfad->pci_bar0_kva); in bfad_pci_uninit()
799 pci_iounmap(pdev, bfad->pci_bar2_kva); in bfad_pci_uninit()
810 bfad->cfg_data.rport_del_timeout = rport_del_timeout; in bfad_drv_init()
811 bfad->cfg_data.lun_queue_depth = bfa_lun_queue_depth; in bfad_drv_init()
812 bfad->cfg_data.io_max_sge = bfa_io_max_sge; in bfad_drv_init()
813 bfad->cfg_data.binding_method = FCP_PWWN_BINDING; in bfad_drv_init()
818 bfad->inst_no); in bfad_drv_init()
820 "Not enough memory to attach all QLogic BR-series HBA ports. System may need more memory.\n"); in bfad_drv_init()
824 bfad->bfa.trcmod = bfad->trcmod; in bfad_drv_init()
825 bfad->bfa.plog = &bfad->plog_buf; in bfad_drv_init()
826 bfa_plog_init(&bfad->plog_buf); in bfad_drv_init()
827 bfa_plog_str(&bfad->plog_buf, BFA_PL_MID_DRVR, BFA_PL_EID_DRIVER_START, in bfad_drv_init()
830 bfa_attach(&bfad->bfa, bfad, &bfad->ioc_cfg, &bfad->meminfo, in bfad_drv_init()
831 &bfad->hal_pcidev); in bfad_drv_init()
834 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_drv_init()
835 bfad->bfa_fcs.trcmod = bfad->trcmod; in bfad_drv_init()
836 bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); in bfad_drv_init()
837 bfad->bfa_fcs.fdmi_enabled = fdmi_enable; in bfad_drv_init()
838 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_drv_init()
840 bfad->bfad_flags |= BFAD_DRV_INIT_DONE; in bfad_drv_init()
850 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_drv_start()
851 bfa_iocfc_start(&bfad->bfa); in bfad_drv_start()
852 bfa_fcs_pbc_vport_init(&bfad->bfa_fcs); in bfad_drv_start()
853 bfa_fcs_fabric_modstart(&bfad->bfa_fcs); in bfad_drv_start()
854 bfad->bfad_flags |= BFAD_HAL_START_DONE; in bfad_drv_start()
855 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_drv_start()
857 if (bfad->im) in bfad_drv_start()
858 flush_workqueue(bfad->im->drv_workq); in bfad_drv_start()
866 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_fcs_stop()
867 init_completion(&bfad->comp); in bfad_fcs_stop()
868 bfad->pport.flags |= BFAD_PORT_DELETE; in bfad_fcs_stop()
869 bfa_fcs_exit(&bfad->bfa_fcs); in bfad_fcs_stop()
870 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_fcs_stop()
871 wait_for_completion(&bfad->comp); in bfad_fcs_stop()
881 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_stop()
882 init_completion(&bfad->comp); in bfad_stop()
883 bfa_iocfc_stop(&bfad->bfa); in bfad_stop()
884 bfad->bfad_flags &= ~BFAD_HAL_START_DONE; in bfad_stop()
885 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_stop()
886 wait_for_completion(&bfad->comp); in bfad_stop()
899 if (bfad->pport.im_port == NULL) { in bfad_cfg_pport()
904 rc = bfad_im_scsi_host_alloc(bfad, bfad->pport.im_port, in bfad_cfg_pport()
905 &bfad->pcidev->dev); in bfad_cfg_pport()
909 bfad->pport.roles |= BFA_LPORT_ROLE_FCP_IM; in bfad_cfg_pport()
912 bfad->bfad_flags |= BFAD_CFG_PPORT_DONE; in bfad_cfg_pport()
922 (bfad->pport.roles & BFA_LPORT_ROLE_FCP_IM)) { in bfad_uncfg_pport()
923 bfad_im_scsi_host_free(bfad, bfad->pport.im_port); in bfad_uncfg_pport()
924 bfad_im_port_clean(bfad->pport.im_port); in bfad_uncfg_pport()
925 kfree(bfad->pport.im_port); in bfad_uncfg_pport()
926 bfad->pport.roles &= ~BFA_LPORT_ROLE_FCP_IM; in bfad_uncfg_pport()
929 bfad->bfad_flags &= ~BFAD_CFG_PPORT_DONE; in bfad_uncfg_pport()
940 /* Limit min/max. xfer size to [64k-32MB] */ in bfad_start_ops()
960 strscpy(driver_info.os_device_name, bfad->pci_name, in bfad_start_ops()
964 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_start_ops()
965 bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info); in bfad_start_ops()
967 if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE) in bfad_start_ops()
968 bfa_fcs_update_cfg(&bfad->bfa_fcs); in bfad_start_ops()
970 bfa_fcs_init(&bfad->bfa_fcs); in bfad_start_ops()
972 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_start_ops()
974 if (!(bfad->bfad_flags & BFAD_CFG_PPORT_DONE)) { in bfad_start_ops()
981 bfad_fc_host_init(bfad->pport.im_port); in bfad_start_ops()
991 bfad->bfad_flags |= BFAD_FC4_PROBE_DONE; in bfad_start_ops()
996 list_for_each_entry_safe(vport, vport_new, &bfad->pbc_vport_list, in bfad_start_ops()
1007 (&((vport->fcs_vport).lport.port_cfg.nwwn))); in bfad_start_ops()
1009 (&((vport->fcs_vport).lport.port_cfg.pwwn))); in bfad_start_ops()
1010 fc_vport = fc_vport_create(bfad->pport.im_port->shost, 0, &vid); in bfad_start_ops()
1014 " %s\n", bfad->inst_no, pwwn_buf); in bfad_start_ops()
1016 list_del(&vport->list_entry); in bfad_start_ops()
1021 * If bfa_linkup_delay is set to -1 default; try to retrive the in bfad_start_ops()
1028 bfa_linkup_delay = -1; in bfad_start_ops()
1049 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_worker()
1050 bfad->bfad_tsk = NULL; in bfad_worker()
1051 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_worker()
1060 bfad_intx(int irq, void *dev_id) in bfad_intx() argument
1067 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_intx()
1068 rc = bfa_intx(&bfad->bfa); in bfad_intx()
1070 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_intx()
1074 bfa_comp_deq(&bfad->bfa, &doneq); in bfad_intx()
1075 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_intx()
1078 bfa_comp_process(&bfad->bfa, &doneq); in bfad_intx()
1080 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_intx()
1081 bfa_comp_free(&bfad->bfa, &doneq); in bfad_intx()
1082 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_intx()
1090 bfad_msix(int irq, void *dev_id) in bfad_msix() argument
1093 struct bfad_s *bfad = vec->bfad; in bfad_msix()
1097 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_msix()
1099 bfa_msix(&bfad->bfa, vec->msix.entry); in bfad_msix()
1100 bfa_comp_deq(&bfad->bfa, &doneq); in bfad_msix()
1101 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_msix()
1104 bfa_comp_process(&bfad->bfa, &doneq); in bfad_msix()
1106 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_msix()
1107 bfa_comp_free(&bfad->bfa, &doneq); in bfad_msix()
1108 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_msix()
1124 for (i = 0, bfad->nvec = 0; i < MAX_MSIX_ENTRY; i++) { in bfad_init_msix_entry()
1126 bfad->msix_tab[bfad->nvec].msix.entry = i; in bfad_init_msix_entry()
1127 bfad->msix_tab[bfad->nvec].bfad = bfad; in bfad_init_msix_entry()
1128 msix_entries[bfad->nvec].entry = i; in bfad_init_msix_entry()
1129 bfad->nvec++; in bfad_init_msix_entry()
1142 for (i = 0; i < bfad->nvec; i++) { in bfad_install_msix_handler()
1143 sprintf(bfad->msix_tab[i].name, "bfa-%s-%s", in bfad_install_msix_handler()
1144 bfad->pci_name, in bfad_install_msix_handler()
1145 ((bfa_asic_id_cb(bfad->hal_pcidev.device_id)) ? in bfad_install_msix_handler()
1148 error = request_irq(bfad->msix_tab[i].msix.vector, in bfad_install_msix_handler()
1150 bfad->msix_tab[i].name, &bfad->msix_tab[i]); in bfad_install_msix_handler()
1152 bfa_trc(bfad, bfad->msix_tab[i].msix.vector); in bfad_install_msix_handler()
1157 free_irq(bfad->msix_tab[j].msix.vector, in bfad_install_msix_handler()
1158 &bfad->msix_tab[j]); in bfad_install_msix_handler()
1160 bfad->bfad_flags &= ~BFAD_MSIX_ON; in bfad_install_msix_handler()
1161 pci_disable_msix(bfad->pcidev); in bfad_install_msix_handler()
1179 struct pci_dev *pdev = bfad->pcidev; in bfad_setup_intr()
1183 bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit); in bfad_setup_intr()
1188 if ((bfa_asic_id_ctc(pdev->device) && !msix_disable_ct) || in bfad_setup_intr()
1189 (bfa_asic_id_cb(pdev->device) && !msix_disable_cb)) { in bfad_setup_intr()
1191 error = pci_enable_msix_exact(bfad->pcidev, in bfad_setup_intr()
1192 msix_entries, bfad->nvec); in bfad_setup_intr()
1194 if (error == -ENOSPC && bfa_asic_id_ctc(pdev->device)) { in bfad_setup_intr()
1197 bfad->pci_name, bfad->nvec, error); in bfad_setup_intr()
1198 bfad->nvec = 1; in bfad_setup_intr()
1199 error = pci_enable_msix_exact(bfad->pcidev, in bfad_setup_intr()
1207 bfad->inst_no, error); in bfad_setup_intr()
1211 /* Disable INTX in MSI-X mode */ in bfad_setup_intr()
1219 for (i = 0; i < bfad->nvec; i++) { in bfad_setup_intr()
1221 bfad->msix_tab[i].msix.vector = msix_entries[i].vector; in bfad_setup_intr()
1224 bfa_msix_init(&bfad->bfa, bfad->nvec); in bfad_setup_intr()
1226 bfad->bfad_flags |= BFAD_MSIX_ON; in bfad_setup_intr()
1232 error = request_irq(bfad->pcidev->irq, (irq_handler_t)bfad_intx, in bfad_setup_intr()
1237 bfad->bfad_flags |= BFAD_INTX_ON; in bfad_setup_intr()
1247 if (bfad->bfad_flags & BFAD_MSIX_ON) { in bfad_remove_intr()
1248 for (i = 0; i < bfad->nvec; i++) in bfad_remove_intr()
1249 free_irq(bfad->msix_tab[i].msix.vector, in bfad_remove_intr()
1250 &bfad->msix_tab[i]); in bfad_remove_intr()
1252 pci_disable_msix(bfad->pcidev); in bfad_remove_intr()
1253 bfad->bfad_flags &= ~BFAD_MSIX_ON; in bfad_remove_intr()
1254 } else if (bfad->bfad_flags & BFAD_INTX_ON) { in bfad_remove_intr()
1255 free_irq(bfad->pcidev->irq, bfad); in bfad_remove_intr()
1266 int error = -ENODEV, retval, i; in bfad_pci_probe()
1268 /* For single port cards - only claim function 0 */ in bfad_pci_probe()
1269 if ((pdev->device == BFA_PCI_DEVICE_ID_FC_8G1P) && in bfad_pci_probe()
1270 (PCI_FUNC(pdev->devfn) != 0)) in bfad_pci_probe()
1271 return -ENODEV; in bfad_pci_probe()
1275 error = -ENOMEM; in bfad_pci_probe()
1279 bfad->trcmod = kzalloc(sizeof(struct bfa_trc_mod_s), GFP_KERNEL); in bfad_pci_probe()
1280 if (!bfad->trcmod) { in bfad_pci_probe()
1282 error = -ENOMEM; in bfad_pci_probe()
1287 bfa_trc_init(bfad->trcmod); in bfad_pci_probe()
1291 INIT_LIST_HEAD(&bfad->free_aen_q); in bfad_pci_probe()
1292 INIT_LIST_HEAD(&bfad->active_aen_q); in bfad_pci_probe()
1294 list_add_tail(&bfad->aen_list[i].qe, &bfad->free_aen_q); in bfad_pci_probe()
1297 kfree(bfad->trcmod); in bfad_pci_probe()
1309 bfad->inst_no = bfad_inst++; in bfad_pci_probe()
1310 list_add_tail(&bfad->list_entry, &bfad_list); in bfad_pci_probe()
1316 spin_lock_init(&bfad->bfad_lock); in bfad_pci_probe()
1317 spin_lock_init(&bfad->bfad_aen_spinlock); in bfad_pci_probe()
1321 bfad->ref_count = 0; in bfad_pci_probe()
1322 bfad->pport.bfad = bfad; in bfad_pci_probe()
1323 INIT_LIST_HEAD(&bfad->pbc_vport_list); in bfad_pci_probe()
1324 INIT_LIST_HEAD(&bfad->vport_list); in bfad_pci_probe()
1328 bfad_debugfs_init(&bfad->pport); in bfad_pci_probe()
1345 kfree(bfad->regdata); in bfad_pci_probe()
1346 bfad_debugfs_exit(&bfad->pport); in bfad_pci_probe()
1348 bfad_inst--; in bfad_pci_probe()
1349 list_del(&bfad->list_entry); in bfad_pci_probe()
1353 kfree(bfad->trcmod); in bfad_pci_probe()
1369 bfa_trc(bfad, bfad->inst_no); in bfad_pci_remove()
1371 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_pci_remove()
1372 if (bfad->bfad_tsk != NULL) { in bfad_pci_remove()
1373 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_remove()
1374 kthread_stop(bfad->bfad_tsk); in bfad_pci_remove()
1376 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_remove()
1383 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_pci_remove()
1384 bfa_detach(&bfad->bfa); in bfad_pci_remove()
1385 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_remove()
1389 kfree(bfad->regdata); in bfad_pci_remove()
1390 bfad_debugfs_exit(&bfad->pport); in bfad_pci_remove()
1394 bfad_inst--; in bfad_pci_remove()
1395 list_del(&bfad->list_entry); in bfad_pci_remove()
1399 kfree(bfad->trcmod); in bfad_pci_remove()
1413 dev_printk(KERN_ERR, &pdev->dev, in bfad_pci_error_detected()
1414 "error detected state: %d - flags: 0x%x\n", in bfad_pci_error_detected()
1415 state, bfad->bfad_flags); in bfad_pci_error_detected()
1418 case pci_channel_io_normal: /* non-fatal error */ in bfad_pci_error_detected()
1419 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_pci_error_detected()
1420 bfad->bfad_flags &= ~BFAD_EEH_BUSY; in bfad_pci_error_detected()
1422 bfa_ioc_suspend(&bfad->bfa.ioc); in bfad_pci_error_detected()
1423 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_error_detected()
1424 del_timer_sync(&bfad->hal_tmo); in bfad_pci_error_detected()
1428 init_completion(&bfad->comp); in bfad_pci_error_detected()
1429 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_pci_error_detected()
1430 bfad->bfad_flags |= BFAD_EEH_BUSY; in bfad_pci_error_detected()
1432 bfa_ioc_suspend(&bfad->bfa.ioc); in bfad_pci_error_detected()
1433 bfa_fcs_stop(&bfad->bfa_fcs); in bfad_pci_error_detected()
1434 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_error_detected()
1435 wait_for_completion(&bfad->comp); in bfad_pci_error_detected()
1438 del_timer_sync(&bfad->hal_tmo); in bfad_pci_error_detected()
1443 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_pci_error_detected()
1444 bfad->bfad_flags |= BFAD_EEH_BUSY | in bfad_pci_error_detected()
1446 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_error_detected()
1449 * pci_channel_io_perm_failure - it will subsequently call in bfad_pci_error_detected()
1451 * system - So defer the cleanup to pci_remove(); cleaning up in bfad_pci_error_detected()
1466 struct pci_dev *pdev = bfad->pcidev; in restart_bfa()
1468 bfa_attach(&bfad->bfa, bfad, &bfad->ioc_cfg, in restart_bfa()
1469 &bfad->meminfo, &bfad->hal_pcidev); in restart_bfa()
1473 dev_printk(KERN_WARNING, &pdev->dev, in restart_bfa()
1474 "%s: bfad_setup_intr failed\n", bfad->pci_name); in restart_bfa()
1476 return -1; in restart_bfa()
1479 init_completion(&bfad->comp); in restart_bfa()
1480 spin_lock_irqsave(&bfad->bfad_lock, flags); in restart_bfa()
1481 bfa_iocfc_init(&bfad->bfa); in restart_bfa()
1482 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in restart_bfa()
1485 if ((bfad->bfad_flags & BFAD_MSIX_ON) && in restart_bfa()
1487 dev_printk(KERN_WARNING, &pdev->dev, in restart_bfa()
1488 "%s: install_msix failed.\n", bfad->pci_name); in restart_bfa()
1491 wait_for_completion(&bfad->comp); in restart_bfa()
1498 * PCI Error Recovery entry, re-initialize the chip.
1507 dev_printk(KERN_ERR, &pdev->dev, in bfad_pci_slot_reset()
1508 "bfad_pci_slot_reset flags: 0x%x\n", bfad->bfad_flags); in bfad_pci_slot_reset()
1511 dev_printk(KERN_ERR, &pdev->dev, "Cannot re-enable " in bfad_pci_slot_reset()
1520 * be 0xff any time) to make sure - we did not hit another PCI error in bfad_pci_slot_reset()
1525 dev_printk(KERN_ERR, &pdev->dev, in bfad_pci_slot_reset()
1533 rc = dma_set_mask_and_coherent(&bfad->pcidev->dev, DMA_BIT_MASK(64)); in bfad_pci_slot_reset()
1537 if (restart_bfa(bfad) == -1) in bfad_pci_slot_reset()
1540 dev_printk(KERN_WARNING, &pdev->dev, in bfad_pci_slot_reset()
1541 "slot_reset completed flags: 0x%x!\n", bfad->bfad_flags); in bfad_pci_slot_reset()
1556 dev_printk(KERN_INFO, &pdev->dev, "mmio_enabled\n"); in bfad_pci_mmio_enabled()
1559 bfa_ioc_debug_save_ftrc(&bfad->bfa.ioc); in bfad_pci_mmio_enabled()
1562 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_pci_mmio_enabled()
1563 init_completion(&bfad->comp); in bfad_pci_mmio_enabled()
1564 bfa_fcs_stop(&bfad->bfa_fcs); in bfad_pci_mmio_enabled()
1565 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_mmio_enabled()
1566 wait_for_completion(&bfad->comp); in bfad_pci_mmio_enabled()
1569 del_timer_sync(&bfad->hal_tmo); in bfad_pci_mmio_enabled()
1581 dev_printk(KERN_WARNING, &pdev->dev, "resume\n"); in bfad_pci_resume()
1586 spin_lock_irqsave(&bfad->bfad_lock, flags); in bfad_pci_resume()
1587 bfad->bfad_flags &= ~BFAD_EEH_BUSY; in bfad_pci_resume()
1588 spin_unlock_irqrestore(&bfad->bfad_lock, flags); in bfad_pci_resume()
1668 pr_info("QLogic BR-series BFA FC/FCOE SCSI driver - version: %s\n", in bfad_init()
1677 return -ENOMEM; in bfad_init()
1690 goto ext; in bfad_init()
1695 ext: in bfad_init()
1718 if (request_firmware(&fw, fw_name, &pdev->dev)) { in bfad_read_firmware()
1724 *bfi_image = vmalloc(fw->size); in bfad_read_firmware()
1727 "size=%x!\n", (u32) fw->size); in bfad_read_firmware()
1731 memcpy(*bfi_image, fw->data, fw->size); in bfad_read_firmware()
1732 *bfi_image_size = fw->size/sizeof(u32); in bfad_read_firmware()
1740 if (bfa_asic_id_ct2(pdev->device)) { in bfad_load_fwimg()
1745 } else if (bfa_asic_id_ct(pdev->device)) { in bfad_load_fwimg()
1750 } else if (bfa_asic_id_cb(pdev->device)) { in bfad_load_fwimg()
1774 MODULE_DESCRIPTION("QLogic BR-series Fibre Channel HBA Driver" BFAD_PROTO_NAME);