/** * PCI remove entry. */ void bfad_pci_remove(struct pci_dev *pdev) { struct bfad_s *bfad = pci_get_drvdata(pdev); unsigned long flags; bfa_trc(bfad, bfad->inst_no); if ((bfad->bfad_flags & BFAD_DRV_INIT_DONE) && !(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { spin_lock_irqsave(&bfad->bfad_lock, flags); init_completion(&bfad->comp); bfa_stop(&bfad->bfa); spin_unlock_irqrestore(&bfad->bfad_lock, flags); wait_for_completion(&bfad->comp); bfad_remove_intr(bfad); del_timer_sync(&bfad->hal_tmo); goto hal_detach; } else if (!(bfad->bfad_flags & BFAD_DRV_INIT_DONE)) { goto remove_sysfs; } if (bfad->bfad_flags & BFAD_HAL_START_DONE) bfad_drv_stop(bfad); bfad_remove_intr(bfad); del_timer_sync(&bfad->hal_tmo); bfad_fc4_probe_undo(bfad); if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE) bfad_uncfg_pport(bfad); hal_detach: spin_lock_irqsave(&bfad->bfad_lock, flags); bfa_detach(&bfad->bfa); spin_unlock_irqrestore(&bfad->bfad_lock, flags); bfad_hal_mem_release(bfad); remove_sysfs: mutex_lock(&bfad_mutex); bfad_inst--; list_del(&bfad->list_entry); mutex_unlock(&bfad_mutex); bfad_pci_uninit(pdev, bfad); kfree(bfad->trcmod); kfree(bfad); }
bfa_status_t bfad_start_ops(struct bfad_s *bfad) { int retval; /* PPORT FCS config */ bfad_fcs_port_cfg(bfad); retval = bfad_cfg_pport(bfad, BFA_PORT_ROLE_FCP_IM); if (retval != BFA_STATUS_OK) goto out_cfg_pport_failure; /* BFAD level FC4 (IM/TM/IPFC) specific resource allocation */ retval = bfad_fc4_probe(bfad); if (retval != BFA_STATUS_OK) { printk(KERN_WARNING "bfad_fc4_probe failed\n"); goto out_fc4_probe_failure; } bfad_drv_start(bfad); /* * If bfa_linkup_delay is set to -1 default; try to retrive the * value using the bfad_os_get_linkup_delay(); else use the * passed in module param value as the bfa_linkup_delay. */ if (bfa_linkup_delay < 0) { bfa_linkup_delay = bfad_os_get_linkup_delay(bfad); bfad_os_rport_online_wait(bfad); bfa_linkup_delay = -1; } else { bfad_os_rport_online_wait(bfad); } bfa_log(bfad->logmod, BFA_LOG_LINUX_DEVICE_CLAIMED, bfad->pci_name); return BFA_STATUS_OK; out_fc4_probe_failure: bfad_fc4_probe_undo(bfad); bfad_uncfg_pport(bfad); out_cfg_pport_failure: return BFA_STATUS_FAILED; }
/** * PCI probe entry. */ int bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) { struct bfad_s *bfad; int error = -ENODEV, retval; char buf[16]; /* * For single port cards - only claim function 0 */ if ((pdev->device == BFA_PCI_DEVICE_ID_FC_8G1P) && (PCI_FUNC(pdev->devfn) != 0)) return -ENODEV; BFA_TRACE(BFA_INFO, "bfad_pci_probe entry"); bfad = kzalloc(sizeof(struct bfad_s), GFP_KERNEL); if (!bfad) { error = -ENOMEM; goto out; } bfad->trcmod = kzalloc(sizeof(struct bfa_trc_mod_s), GFP_KERNEL); if (!bfad->trcmod) { printk(KERN_WARNING "Error alloc trace buffer!\n"); error = -ENOMEM; goto out_alloc_trace_failure; } /* * LOG/TRACE INIT */ bfa_trc_init(bfad->trcmod); bfa_trc(bfad, bfad_inst); bfad->logmod = &bfad->log_data; sprintf(buf, "%d", bfad_inst); bfa_log_init(bfad->logmod, buf, bfa_os_printf); bfad_drv_log_level_set(bfad); bfad->aen = &bfad->aen_buf; if (!(bfad_load_fwimg(pdev))) { printk(KERN_WARNING "bfad_load_fwimg failure!\n"); kfree(bfad->trcmod); goto out_alloc_trace_failure; } retval = bfad_pci_init(pdev, bfad); if (retval) { printk(KERN_WARNING "bfad_pci_init failure!\n"); error = retval; goto out_pci_init_failure; } mutex_lock(&bfad_mutex); bfad->inst_no = bfad_inst++; list_add_tail(&bfad->list_entry, &bfad_list); mutex_unlock(&bfad_mutex); spin_lock_init(&bfad->bfad_lock); pci_set_drvdata(pdev, bfad); bfad->ref_count = 0; bfad->pport.bfad = bfad; retval = bfad_drv_init(bfad); if (retval != BFA_STATUS_OK) goto out_drv_init_failure; if (!(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { printk(KERN_WARNING "bfad%d: hal init failed\n", bfad->inst_no); goto ok; } /* * PPORT FCS config */ bfad_fcs_port_cfg(bfad); retval = bfad_cfg_pport(bfad, BFA_PORT_ROLE_FCP_IM); if (retval != BFA_STATUS_OK) goto out_cfg_pport_failure; /* * BFAD level FC4 (IM/TM/IPFC) specific resource allocation */ retval = bfad_fc4_probe(bfad); if (retval != BFA_STATUS_OK) { printk(KERN_WARNING "bfad_fc4_probe failed\n"); goto out_fc4_probe_failure; } bfad_drv_start(bfad); /* * If bfa_linkup_delay is set to -1 default; try to retrive the * value using the bfad_os_get_linkup_delay(); else use the * passed in module param value as the bfa_linkup_delay. */ if (bfa_linkup_delay < 0) { bfa_linkup_delay = bfad_os_get_linkup_delay(bfad); bfad_os_rport_online_wait(bfad); bfa_linkup_delay = -1; } else { bfad_os_rport_online_wait(bfad); } bfa_log(bfad->logmod, BFA_LOG_LINUX_DEVICE_CLAIMED, bfad->pci_name); ok: return 0; out_fc4_probe_failure: bfad_fc4_probe_undo(bfad); bfad_uncfg_pport(bfad); out_cfg_pport_failure: bfad_drv_uninit(bfad); out_drv_init_failure: mutex_lock(&bfad_mutex); bfad_inst--; list_del(&bfad->list_entry); mutex_unlock(&bfad_mutex); bfad_pci_uninit(pdev, bfad); out_pci_init_failure: kfree(bfad->trcmod); out_alloc_trace_failure: kfree(bfad); out: return error; }