int bfad_worker (void *ptr) { struct bfad_s *bfad; unsigned long flags; bfad = (struct bfad_s *)ptr; while (!kthread_should_stop()) { /* Check if the FCS init is done from bfad_drv_init; * if not done do FCS init and set the flag. */ if (!(bfad->bfad_flags & BFAD_FCS_INIT_DONE)) { spin_lock_irqsave(&bfad->bfad_lock, flags); bfa_fcs_init(&bfad->bfa_fcs); bfad->bfad_flags |= BFAD_FCS_INIT_DONE; spin_unlock_irqrestore(&bfad->bfad_lock, flags); } /* Start the bfad operations after HAL init done */ bfad_start_ops(bfad); spin_lock_irqsave(&bfad->bfad_lock, flags); bfad->bfad_tsk = NULL; spin_unlock_irqrestore(&bfad->bfad_lock, flags); break; } return 0; }
bfa_status_t bfad_drv_init(struct bfad_s *bfad) { bfa_status_t rc; unsigned long flags; struct bfa_fcs_driver_info_s driver_info; int i; bfad->cfg_data.rport_del_timeout = rport_del_timeout; bfad->cfg_data.lun_queue_depth = bfa_lun_queue_depth; bfad->cfg_data.io_max_sge = bfa_io_max_sge; bfad->cfg_data.binding_method = FCP_PWWN_BINDING; rc = bfad_hal_mem_alloc(bfad); if (rc != BFA_STATUS_OK) { printk(KERN_WARNING "bfad%d bfad_hal_mem_alloc failure\n", bfad->inst_no); printk(KERN_WARNING "Not enough memory to attach all Brocade HBA ports," " System may need more memory.\n"); goto out_hal_mem_alloc_failure; } bfa_init_log(&bfad->bfa, bfad->logmod); bfa_init_trc(&bfad->bfa, bfad->trcmod); bfa_init_aen(&bfad->bfa, bfad->aen); INIT_LIST_HEAD(&bfad->file_q); INIT_LIST_HEAD(&bfad->file_free_q); for (i = 0; i < BFAD_AEN_MAX_APPS; i++) { bfa_q_qe_init(&bfad->file_buf[i].qe); list_add_tail(&bfad->file_buf[i].qe, &bfad->file_free_q); } bfa_init_plog(&bfad->bfa, &bfad->plog_buf); bfa_plog_init(&bfad->plog_buf); bfa_plog_str(&bfad->plog_buf, BFA_PL_MID_DRVR, BFA_PL_EID_DRIVER_START, 0, "Driver Attach"); bfa_attach(&bfad->bfa, bfad, &bfad->ioc_cfg, &bfad->meminfo, &bfad->hal_pcidev); init_completion(&bfad->comp); /* * Enable Interrupt and wait bfa_init completion */ if (bfad_setup_intr(bfad)) { printk(KERN_WARNING "bfad%d: bfad_setup_intr failed\n", bfad->inst_no); goto out_setup_intr_failure; } spin_lock_irqsave(&bfad->bfad_lock, flags); bfa_init(&bfad->bfa); spin_unlock_irqrestore(&bfad->bfad_lock, flags); /* * Set up interrupt handler for each vectors */ if ((bfad->bfad_flags & BFAD_MSIX_ON) && bfad_install_msix_handler(bfad)) { printk(KERN_WARNING "%s: install_msix failed, bfad%d\n", __func__, bfad->inst_no); } bfad_init_timer(bfad); wait_for_completion(&bfad->comp); memset(&driver_info, 0, sizeof(driver_info)); strncpy(driver_info.version, BFAD_DRIVER_VERSION, sizeof(driver_info.version) - 1); if (host_name) strncpy(driver_info.host_machine_name, host_name, sizeof(driver_info.host_machine_name) - 1); if (os_name) strncpy(driver_info.host_os_name, os_name, sizeof(driver_info.host_os_name) - 1); if (os_patch) strncpy(driver_info.host_os_patch, os_patch, sizeof(driver_info.host_os_patch) - 1); strncpy(driver_info.os_device_name, bfad->pci_name, sizeof(driver_info.os_device_name - 1)); /* * FCS INIT */ spin_lock_irqsave(&bfad->bfad_lock, flags); bfa_fcs_log_init(&bfad->bfa_fcs, bfad->logmod); bfa_fcs_trc_init(&bfad->bfa_fcs, bfad->trcmod); bfa_fcs_aen_init(&bfad->bfa_fcs, bfad->aen); bfa_fcs_init(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info); spin_unlock_irqrestore(&bfad->bfad_lock, flags); bfad->bfad_flags |= BFAD_DRV_INIT_DONE; return BFA_STATUS_OK; out_setup_intr_failure: bfa_detach(&bfad->bfa); bfad_hal_mem_release(bfad); out_hal_mem_alloc_failure: return BFA_STATUS_FAILED; }