/* * Uninitialize the resources used during PQI initialization. */ void pqisrc_pqi_uninit(pqisrc_softstate_t *softs) { int i; DBG_FUNC("IN\n"); if(softs->devlist_lockcreated==true){ os_uninit_spinlock(&softs->devlist_lock); softs->devlist_lockcreated = false; } for (i = 0; i < softs->num_op_raid_ibq; i++) { /* OP RAID IB Q */ if(softs->op_raid_ib_q[i].lockcreated==true){ OS_UNINIT_PQILOCK(&softs->op_raid_ib_q[i].lock); softs->op_raid_ib_q[i].lockcreated = false; } /* OP AIO IB Q */ if(softs->op_aio_ib_q[i].lockcreated==true){ OS_UNINIT_PQILOCK(&softs->op_aio_ib_q[i].lock); softs->op_aio_ib_q[i].lockcreated = false; } } /* Free Op queues */ os_dma_mem_free(softs, &softs->op_ibq_dma_mem); os_dma_mem_free(softs, &softs->op_obq_dma_mem); os_dma_mem_free(softs, &softs->event_q_dma_mem); /* Complete all pending commands. */ os_complete_outstanding_cmds_nodevice(softs); /* Free rcb */ pqisrc_free_rcb(softs, softs->max_outstanding_io + 1); /* Free request id lists */ pqisrc_destroy_taglist(softs,&softs->taglist); if(softs->admin_ib_queue.lockcreated==true){ OS_UNINIT_PQILOCK(&softs->admin_ib_queue.lock); softs->admin_ib_queue.lockcreated = false; } /* Free Admin Queue */ os_dma_mem_free(softs, &softs->admin_queue_dma_mem); /* Switch back to SIS mode */ if (pqisrc_force_sis(softs)) { DBG_ERR("Failed to switch back the adapter to SIS mode!\n"); } DBG_FUNC("OUT\n"); }
/* * Function to initialize the adapter settings. */ int pqisrc_init(pqisrc_softstate_t *softs) { int ret = 0; int i = 0, j = 0; DBG_FUNC("IN\n"); check_struct_sizes(); /* Init the Sync interface */ ret = pqisrc_sis_init(softs); if (ret) { DBG_ERR("SIS Init failed with error %d\n", ret); goto err_out; } ret = os_create_semaphore("scan_lock", 1, &softs->scan_lock); if(ret != PQI_STATUS_SUCCESS){ DBG_ERR(" Failed to initialize scan lock\n"); goto err_scan_lock; } /* Init the PQI interface */ ret = pqisrc_pqi_init(softs); if (ret) { DBG_ERR("PQI Init failed with error %d\n", ret); goto err_pqi; } /* Setup interrupt */ ret = os_setup_intr(softs); if (ret) { DBG_ERR("Interrupt setup failed with error %d\n", ret); goto err_intr; } /* Report event configuration */ ret = pqisrc_report_event_config(softs); if(ret){ DBG_ERR(" Failed to configure Report events\n"); goto err_event; } /* Set event configuration*/ ret = pqisrc_set_event_config(softs); if(ret){ DBG_ERR(" Failed to configure Set events\n"); goto err_event; } /* Check for For PQI spanning */ ret = pqisrc_get_ctrl_fw_version(softs); if(ret){ DBG_ERR(" Failed to get ctrl fw version\n"); goto err_fw_version; } /* update driver version in to FW */ ret = pqisrc_write_driver_version_to_host_wellness(softs); if (ret) { DBG_ERR(" Failed to update driver version in to FW"); goto err_host_wellness; } os_strlcpy(softs->devlist_lock_name, "devlist_lock", LOCKNAME_SIZE); ret = os_init_spinlock(softs, &softs->devlist_lock, softs->devlist_lock_name); if(ret){ DBG_ERR(" Failed to initialize devlist_lock\n"); softs->devlist_lockcreated=false; goto err_lock; } softs->devlist_lockcreated = true; OS_ATOMIC64_SET(softs, num_intrs, 0); softs->prev_num_intrs = softs->num_intrs; /* Get the PQI configuration table to read heart-beat counter*/ if (PQI_NEW_HEARTBEAT_MECHANISM(softs)) { ret = pqisrc_process_config_table(softs); if (ret) { DBG_ERR("Failed to process PQI configuration table %d\n", ret); goto err_config_tab; } } if (PQI_NEW_HEARTBEAT_MECHANISM(softs)) softs->prev_heartbeat_count = CTRLR_HEARTBEAT_CNT(softs) - OS_FW_HEARTBEAT_TIMER_INTERVAL; /* Init device list */ for(i = 0; i < PQI_MAX_DEVICES; i++) for(j = 0; j < PQI_MAX_MULTILUN; j++) softs->device_list[i][j] = NULL; pqisrc_init_targetid_pool(softs); DBG_FUNC("OUT\n"); return ret; err_config_tab: if(softs->devlist_lockcreated==true){ os_uninit_spinlock(&softs->devlist_lock); softs->devlist_lockcreated = false; } err_lock: err_fw_version: err_event: err_host_wellness: os_destroy_intr(softs); err_intr: pqisrc_pqi_uninit(softs); err_pqi: os_destroy_semaphore(&softs->scan_lock); err_scan_lock: pqisrc_sis_uninit(softs); err_out: DBG_FUNC("OUT failed\n"); return ret; }