/** @brief wpalDeviceInit provides a mechanism to initialize the DXE platform adaptation @param deviceCB: Implementation-specific device control block @see wpalDeviceClose @return SUCCESS if the DXE abstraction was opened */ wpt_status wpalDeviceInit ( void * deviceCB ) { hdd_context_t *pHddCtx = (hdd_context_t *)deviceCB; struct device *wcnss_device = pHddCtx->parent_dev; struct resource *wcnss_memory; int tx_irq; int rx_irq; if (NULL != gpEnv) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: invoked after subsystem initialized", __func__); return eWLAN_PAL_STATUS_E_INVAL; } if (NULL == wcnss_device) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: invalid device", __func__); return eWLAN_PAL_STATUS_E_INVAL; } wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device); if (NULL == wcnss_memory) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: WCNSS memory map unavailable", __func__); return eWLAN_PAL_STATUS_E_FAILURE; } tx_irq = wcnss_wlan_get_dxe_tx_irq(wcnss_device); if (0 > tx_irq) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: WCNSS TX IRQ unavailable", __func__); return eWLAN_PAL_STATUS_E_FAILURE; } rx_irq = wcnss_wlan_get_dxe_rx_irq(wcnss_device); if (0 > rx_irq) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: WCNSS RX IRQ unavailable", __func__); return eWLAN_PAL_STATUS_E_FAILURE; } gpEnv = &gEnv; if (NULL == gpEnv) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: memory allocation failure", __func__); return eWLAN_PAL_STATUS_E_NOMEM; } memset(gpEnv, 0, sizeof(*gpEnv)); gpEnv->wcnss_memory = wcnss_memory; gpEnv->tx_irq = tx_irq; gpEnv->rx_irq = rx_irq; /* note the we don't invoke request_mem_region(). the memory described by wcnss_memory encompases the entire register space (including BT and FM) and we do not want exclusive access to that memory */ gpEnv->mmio = ioremap(wcnss_memory->start, resource_size(wcnss_memory)); if (NULL == gpEnv->mmio) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: memory remap failure", __func__); goto err_ioremap; } gpEnv->tx_registered = 0; gpEnv->rx_registered = 0; /* successfully allocated environment, memory and IRQs */ return eWLAN_PAL_STATUS_SUCCESS; err_ioremap: gpEnv = NULL; return eWLAN_PAL_STATUS_E_FAILURE; }
wpt_status wpalDeviceInit ( void * deviceCB ) { hdd_context_t *pHddCtx = (hdd_context_t *)deviceCB; struct device *wcnss_device = pHddCtx->parent_dev; struct resource *wcnss_memory; int tx_irq; int rx_irq; if (NULL != gpEnv) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: invoked after subsystem initialized", __func__); return eWLAN_PAL_STATUS_E_INVAL; } if (NULL == wcnss_device) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: invalid device", __func__); return eWLAN_PAL_STATUS_E_INVAL; } wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device); if (NULL == wcnss_memory) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: WCNSS memory map unavailable", __func__); return eWLAN_PAL_STATUS_E_FAILURE; } tx_irq = wcnss_wlan_get_dxe_tx_irq(wcnss_device); if (0 > tx_irq) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: WCNSS TX IRQ unavailable", __func__); return eWLAN_PAL_STATUS_E_FAILURE; } rx_irq = wcnss_wlan_get_dxe_rx_irq(wcnss_device); if (0 > rx_irq) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: WCNSS RX IRQ unavailable", __func__); return eWLAN_PAL_STATUS_E_FAILURE; } gpEnv = &gEnv; if (NULL == gpEnv) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: memory allocation failure", __func__); return eWLAN_PAL_STATUS_E_NOMEM; } memset(gpEnv, 0, sizeof(*gpEnv)); gpEnv->wcnss_memory = wcnss_memory; gpEnv->tx_irq = tx_irq; gpEnv->rx_irq = rx_irq; gpEnv->mmio = ioremap(wcnss_memory->start, resource_size(wcnss_memory)); if (NULL == gpEnv->mmio) { WPAL_TRACE(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: memory remap failure", __func__); goto err_ioremap; } gpEnv->tx_registered = 0; gpEnv->rx_registered = 0; return eWLAN_PAL_STATUS_SUCCESS; err_ioremap: gpEnv = NULL; return eWLAN_PAL_STATUS_E_FAILURE; }