/** * @brief This function allocates buffer for the members of adapter * structure like command buffer and BSSID list. * * @param pmadapter A pointer to mlan_adapter structure * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ static mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter) { int i; mlan_status ret = MLAN_STATUS_SUCCESS; mlan_callbacks *pcb = (mlan_callbacks *) & pmadapter->callbacks; t_u32 buf_size; BSSDescriptor_t *ptemp_scan_table; ENTER(); /* Allocate buffer to store the BSSID list */ buf_size = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST; ret = pcb->moal_malloc(buf_size, (t_u8 **) & ptemp_scan_table); if (ret != MLAN_STATUS_SUCCESS || !ptemp_scan_table) { PRINTM(ERROR, "Failed to allocate scan table\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->pscan_table = ptemp_scan_table; /* Initialize cmd_free_q */ util_init_list_head(&pmadapter->cmd_free_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Initialize cmd_pending_q */ util_init_list_head(&pmadapter->cmd_pending_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Initialize scan_pending_q */ util_init_list_head(&pmadapter->scan_pending_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Allocate command buffer */ if (wlan_alloc_cmd_buffer(pmadapter) != MLAN_STATUS_SUCCESS) { PRINTM(ERROR, "Failed to allocate command buffer\n"); LEAVE(); return MLAN_STATUS_FAILURE; } memset(&pmadapter->sleep_cfm_buf.ps_cfm_sleep, 0, sizeof(PS_CMD_ConfirmSleep)); pmadapter->sleep_cfm_buf.ps_cfm_sleep.command = wlan_cpu_to_le16(HostCmd_CMD_802_11_PS_MODE); pmadapter->sleep_cfm_buf.ps_cfm_sleep.size = wlan_cpu_to_le16(sizeof(PS_CMD_ConfirmSleep)); pmadapter->sleep_cfm_buf.ps_cfm_sleep.result = 0; pmadapter->sleep_cfm_buf.ps_cfm_sleep.action = wlan_cpu_to_le16(HostCmd_SubCmd_Sleep_Confirmed); for (i = 0; i < MLAN_MAX_BSS_NUM; ++i) { util_init_list_head(&pmadapter->bssprio_tbl[i].bssprio_head, MTRUE, pmadapter->callbacks.moal_init_lock); pmadapter->bssprio_tbl[i].bssprio_cur = MNULL; } LEAVE(); return MLAN_STATUS_SUCCESS; }
/** * @brief This function allocates buffer for the member of adapter * structure like command buffer and BSSID list. * * @param priv A pointer to wlan_private structure * @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE */ static int wlan_allocate_adapter(wlan_private * priv) { u32 ulBufSize; wlan_adapter *Adapter = priv->adapter; BSSDescriptor_t *pTempScanTable; ENTER(); /* Allocate buffer to store the BSSID list */ ulBufSize = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST; if (!(pTempScanTable = kmalloc(ulBufSize, GFP_KERNEL))) { LEAVE(); return WLAN_STATUS_FAILURE; } Adapter->ScanTable = pTempScanTable; memset(Adapter->ScanTable, 0, ulBufSize); if (!(Adapter->bgScanConfig = kmalloc(sizeof(HostCmd_DS_802_11_BG_SCAN_CONFIG), GFP_KERNEL))) { LEAVE(); return WLAN_STATUS_FAILURE; } Adapter->bgScanConfigSize = sizeof(HostCmd_DS_802_11_BG_SCAN_CONFIG); memset(Adapter->bgScanConfig, 0, Adapter->bgScanConfigSize); spin_lock_init(&Adapter->QueueSpinLock); INIT_LIST_HEAD(&Adapter->CmdFreeQ); INIT_LIST_HEAD(&Adapter->CmdPendingQ); /* Allocate the command buffers */ if (wlan_alloc_cmd_buffer(priv) != WLAN_STATUS_SUCCESS) return WLAN_STATUS_FAILURE; memset(&Adapter->PSConfirmSleep, 0, sizeof(PS_CMD_ConfirmSleep)); Adapter->PSConfirmSleep.SeqNum = wlan_cpu_to_le16(++Adapter->SeqNum); Adapter->PSConfirmSleep.Command = wlan_cpu_to_le16(HostCmd_CMD_802_11_PS_MODE); Adapter->PSConfirmSleep.Size = wlan_cpu_to_le16(sizeof(PS_CMD_ConfirmSleep)); Adapter->PSConfirmSleep.Result = 0; Adapter->PSConfirmSleep.Action = wlan_cpu_to_le16(HostCmd_SubCmd_Sleep_Confirmed); LEAVE(); return WLAN_STATUS_SUCCESS; }
/** * @brief This function allocates buffer for the members of adapter * structure like command buffer and BSSID list. * * @param pmadapter A pointer to mlan_adapter structure * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ static mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter) { int i; mlan_status ret = MLAN_STATUS_SUCCESS; t_u32 buf_size; BSSDescriptor_t *ptemp_scan_table; t_u8 *head_ptr = MNULL; ENTER(); /* Allocate buffer to store the BSSID list */ buf_size = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST; ret = pmadapter->callbacks.moal_malloc(buf_size, (t_u8 **) & ptemp_scan_table); if (ret != MLAN_STATUS_SUCCESS || !ptemp_scan_table) { PRINTM(MERROR, "Failed to allocate scan table\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->pscan_table = ptemp_scan_table; /* Initialize cmd_free_q */ util_init_list_head(&pmadapter->cmd_free_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Initialize cmd_pending_q */ util_init_list_head(&pmadapter->cmd_pending_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Initialize scan_pending_q */ util_init_list_head(&pmadapter->scan_pending_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Allocate command buffer */ ret = wlan_alloc_cmd_buffer(pmadapter); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate command buffer\n"); LEAVE(); return MLAN_STATUS_FAILURE; } for (i = 0; i < MLAN_MAX_BSS_NUM; ++i) { util_init_list_head(&pmadapter->bssprio_tbl[i].bssprio_head, MTRUE, pmadapter->callbacks.moal_init_lock); pmadapter->bssprio_tbl[i].bssprio_cur = MNULL; } ret = pmadapter->callbacks.moal_malloc(MAX_MP_REGS + HEADER_ALIGNMENT, (t_u8 **) & pmadapter->mp_regs_buf); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->mp_regs_buf) { PRINTM(MERROR, "Failed to allocate mp_regs_buf\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->mp_regs = (t_u8 *) ALIGN_ADDR(pmadapter->mp_regs_buf, HEADER_ALIGNMENT); PRINTM(MINFO, "Try to assign mp_regs to handle\n"); ret = pmadapter->callbacks.moal_get_cardregs(pmadapter->pmoal_handle, pmadapter->mp_regs); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to assign mp_regs to handle\n"); LEAVE(); return MLAN_STATUS_FAILURE; } #if defined(SDIO_MULTI_PORT_TX_AGGR) || defined(SDIO_MULTI_PORT_RX_AGGR) ret = wlan_alloc_sdio_mpa_buffers(pmadapter, SDIO_MP_TX_AGGR_DEF_BUF_SIZE, SDIO_MP_RX_AGGR_DEF_BUF_SIZE); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate sdio mp-a buffers\n"); LEAVE(); return MLAN_STATUS_FAILURE; } #endif if ((wlan_get_priv(pmadapter, MLAN_BSS_TYPE_ANY))->bss_type == MLAN_BSS_TYPE_STA) pmadapter->psleep_cfm = wlan_alloc_mlan_buffer(&pmadapter->callbacks, HEADER_ALIGNMENT + sizeof(opt_sleep_confirm_buffer)); if (!pmadapter->psleep_cfm) { PRINTM(MERROR, "Failed to allocate sleep confirm buffers\n"); LEAVE(); return MLAN_STATUS_FAILURE; } head_ptr = (t_u8 *) ALIGN_ADDR(pmadapter->psleep_cfm->pbuf + pmadapter->psleep_cfm->data_offset, HEADER_ALIGNMENT); pmadapter->psleep_cfm->data_offset += head_ptr - (pmadapter->psleep_cfm->pbuf + pmadapter->psleep_cfm->data_offset); LEAVE(); return MLAN_STATUS_SUCCESS; }
/** * @brief This function allocates buffer for the members of adapter * structure like command buffer and BSSID list. * * @param pmadapter A pointer to mlan_adapter structure * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter) { mlan_status ret = MLAN_STATUS_SUCCESS; #ifdef STA_SUPPORT t_u32 buf_size; BSSDescriptor_t *ptemp_scan_table = MNULL; #endif ENTER(); #ifdef STA_SUPPORT /* Allocate buffer to store the BSSID list */ buf_size = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST; ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, buf_size, MLAN_MEM_DEF, (t_u8 **) & ptemp_scan_table); if (ret != MLAN_STATUS_SUCCESS || !ptemp_scan_table) { PRINTM(MERROR, "Failed to allocate scan table\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->pscan_table = ptemp_scan_table; ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, DEFAULT_SCAN_BEACON_BUFFER, MLAN_MEM_DEF, (t_u8 **) & pmadapter->bcn_buf); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->bcn_buf) { PRINTM(MERROR, "Failed to allocate bcn buf\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->bcn_buf_size = DEFAULT_SCAN_BEACON_BUFFER; #endif /* Allocate command buffer */ ret = wlan_alloc_cmd_buffer(pmadapter); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate command buffer\n"); LEAVE(); return MLAN_STATUS_FAILURE; } ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, MAX_MP_REGS + DMA_ALIGNMENT, MLAN_MEM_DEF | MLAN_MEM_DMA, (t_u8 **) & pmadapter->mp_regs_buf); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->mp_regs_buf) { PRINTM(MERROR, "Failed to allocate mp_regs_buf\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->mp_regs = (t_u8 *) ALIGN_ADDR(pmadapter->mp_regs_buf, DMA_ALIGNMENT); #if defined(SDIO_MULTI_PORT_TX_AGGR) || defined(SDIO_MULTI_PORT_RX_AGGR) ret = wlan_alloc_sdio_mpa_buffers(pmadapter, SDIO_MP_TX_AGGR_DEF_BUF_SIZE, SDIO_MP_RX_AGGR_DEF_BUF_SIZE); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate sdio mp-a buffers\n"); LEAVE(); return MLAN_STATUS_FAILURE; } #endif pmadapter->psleep_cfm = wlan_alloc_mlan_buffer(pmadapter, sizeof(opt_sleep_confirm_buffer), 0, MTRUE); LEAVE(); return MLAN_STATUS_SUCCESS; }
/** * @brief This function allocates buffer for the members of adapter * structure like command buffer and BSSID list. * * @param pmadapter A pointer to mlan_adapter structure * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter) { mlan_status ret = MLAN_STATUS_SUCCESS; #ifdef STA_SUPPORT t_u32 buf_size; BSSDescriptor_t *ptemp_scan_table = MNULL; t_u8 chan_2g[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; t_u8 chan_5g[] = { 12, 16, 34, 38, 42, 46, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 149, 153, 157, 161, 165 }; #endif t_u32 max_mp_regs = pmadapter->psdio_device->reg->max_mp_regs; #if defined(SDIO_MULTI_PORT_TX_AGGR) || defined(SDIO_MULTI_PORT_RX_AGGR) t_u32 mp_tx_aggr_buf_size = pmadapter->psdio_device->mp_tx_aggr_buf_size; t_u32 mp_rx_aggr_buf_size = pmadapter->psdio_device->mp_rx_aggr_buf_size; #endif ENTER(); #ifdef STA_SUPPORT /* Allocate buffer to store the BSSID list */ buf_size = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST; if (pmadapter->callbacks.moal_vmalloc && pmadapter->callbacks.moal_vfree) ret = pmadapter->callbacks.moal_vmalloc(pmadapter->pmoal_handle, buf_size, (t_u8 **) &ptemp_scan_table); else ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, buf_size, MLAN_MEM_DEF, (t_u8 **) &ptemp_scan_table); if (ret != MLAN_STATUS_SUCCESS || !ptemp_scan_table) { PRINTM(MERROR, "Failed to allocate scan table\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->pscan_table = ptemp_scan_table; if (pmadapter->callbacks.moal_vmalloc && pmadapter->callbacks.moal_vfree) ret = pmadapter->callbacks.moal_vmalloc(pmadapter->pmoal_handle, DEFAULT_SCAN_BEACON_BUFFER, (t_u8 **)&pmadapter-> bcn_buf); else ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, DEFAULT_SCAN_BEACON_BUFFER, MLAN_MEM_DEF, (t_u8 **)&pmadapter-> bcn_buf); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->bcn_buf) { PRINTM(MERROR, "Failed to allocate bcn buf\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->bcn_buf_size = DEFAULT_SCAN_BEACON_BUFFER; pmadapter->num_in_chan_stats = sizeof(chan_2g); pmadapter->num_in_chan_stats += sizeof(chan_5g); buf_size = sizeof(ChanStatistics_t) * pmadapter->num_in_chan_stats; if (pmadapter->callbacks.moal_vmalloc && pmadapter->callbacks.moal_vfree) ret = pmadapter->callbacks.moal_vmalloc(pmadapter->pmoal_handle, buf_size, (t_u8 **)&pmadapter-> pchan_stats); else ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, buf_size, MLAN_MEM_DEF, (t_u8 **)&pmadapter-> pchan_stats); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->pchan_stats) { PRINTM(MERROR, "Failed to allocate channel statistics\n"); LEAVE(); return MLAN_STATUS_FAILURE; } #endif /* Allocate command buffer */ ret = wlan_alloc_cmd_buffer(pmadapter); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate command buffer\n"); LEAVE(); return MLAN_STATUS_FAILURE; } ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, max_mp_regs + DMA_ALIGNMENT, MLAN_MEM_DEF | MLAN_MEM_DMA, (t_u8 **)&pmadapter-> mp_regs_buf); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->mp_regs_buf) { PRINTM(MERROR, "Failed to allocate mp_regs_buf\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->mp_regs = (t_u8 *)ALIGN_ADDR(pmadapter->mp_regs_buf, DMA_ALIGNMENT); #if defined(SDIO_MULTI_PORT_TX_AGGR) || defined(SDIO_MULTI_PORT_RX_AGGR) pmadapter->max_sp_tx_size = MAX_SUPPORT_AMSDU_SIZE; pmadapter->max_sp_rx_size = MAX_SUPPORT_AMSDU_SIZE; ret = wlan_alloc_sdio_mpa_buffers(pmadapter, mp_tx_aggr_buf_size, mp_rx_aggr_buf_size); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate sdio mp-a buffers\n"); LEAVE(); return MLAN_STATUS_FAILURE; } if (mlan_drvdbg & MMPA_D) { pmadapter->mpa_buf_size = SDIO_MP_DBG_NUM * pmadapter->psdio_device->mp_aggr_pkt_limit * MLAN_SDIO_BLOCK_SIZE; if (pmadapter->callbacks.moal_vmalloc && pmadapter->callbacks.moal_vfree) ret = pmadapter->callbacks.moal_vmalloc(pmadapter-> pmoal_handle, pmadapter-> mpa_buf_size, (t_u8 **) &pmadapter-> mpa_buf); else ret = pmadapter->callbacks.moal_malloc(pmadapter-> pmoal_handle, pmadapter-> mpa_buf_size, MLAN_MEM_DEF, (t_u8 **) &pmadapter-> mpa_buf); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->mpa_buf) { PRINTM(MERROR, "Failed to allocate mpa buf\n"); LEAVE(); return MLAN_STATUS_FAILURE; } } #endif pmadapter->psleep_cfm = wlan_alloc_mlan_buffer(pmadapter, sizeof(opt_sleep_confirm_buffer), 0, MOAL_MALLOC_BUFFER); LEAVE(); return MLAN_STATUS_SUCCESS; }
/** * @brief This function allocates buffer for the members of adapter * structure like command buffer and BSSID list. * * @param pmadapter A pointer to mlan_adapter structure * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ static mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter) { int i; mlan_status ret = MLAN_STATUS_SUCCESS; #ifdef STA_SUPPORT t_u32 buf_size; BSSDescriptor_t *ptemp_scan_table = MNULL; #endif ENTER(); #ifdef STA_SUPPORT /* Allocate buffer to store the BSSID list */ buf_size = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST; ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, buf_size, MLAN_MEM_DEF, (t_u8 **) & ptemp_scan_table); if (ret != MLAN_STATUS_SUCCESS || !ptemp_scan_table) { PRINTM(MERROR, "Failed to allocate scan table\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->pscan_table = ptemp_scan_table; #endif /* Initialize cmd_free_q */ util_init_list_head((t_void *) pmadapter->pmoal_handle, &pmadapter->cmd_free_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Initialize cmd_pending_q */ util_init_list_head((t_void *) pmadapter->pmoal_handle, &pmadapter->cmd_pending_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Initialize scan_pending_q */ util_init_list_head((t_void *) pmadapter->pmoal_handle, &pmadapter->scan_pending_q, MTRUE, pmadapter->callbacks.moal_init_lock); /* Allocate command buffer */ ret = wlan_alloc_cmd_buffer(pmadapter); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate command buffer\n"); LEAVE(); return MLAN_STATUS_FAILURE; } for (i = 0; i < MLAN_MAX_BSS_NUM; ++i) { util_init_list_head((t_void *) pmadapter->pmoal_handle, &pmadapter->bssprio_tbl[i].bssprio_head, MTRUE, pmadapter->callbacks.moal_init_lock); pmadapter->bssprio_tbl[i].bssprio_cur = MNULL; } ret = pmadapter->callbacks.moal_malloc(pmadapter->pmoal_handle, MAX_MP_REGS + HEADER_ALIGNMENT, MLAN_MEM_DEF | MLAN_MEM_DMA, (t_u8 **) & pmadapter->mp_regs_buf); if (ret != MLAN_STATUS_SUCCESS || !pmadapter->mp_regs_buf) { PRINTM(MERROR, "Failed to allocate mp_regs_buf\n"); LEAVE(); return MLAN_STATUS_FAILURE; } pmadapter->mp_regs = (t_u8 *) ALIGN_ADDR(pmadapter->mp_regs_buf, HEADER_ALIGNMENT); #if defined(SDIO_MULTI_PORT_TX_AGGR) || defined(SDIO_MULTI_PORT_RX_AGGR) ret = wlan_alloc_sdio_mpa_buffers(pmadapter, SDIO_MP_TX_AGGR_DEF_BUF_SIZE, SDIO_MP_RX_AGGR_DEF_BUF_SIZE); if (ret != MLAN_STATUS_SUCCESS) { PRINTM(MERROR, "Failed to allocate sdio mp-a buffers\n"); LEAVE(); return MLAN_STATUS_FAILURE; } #endif pmadapter->psleep_cfm = wlan_alloc_mlan_buffer(pmadapter, sizeof(opt_sleep_confirm_buffer), 0, MTRUE); LEAVE(); return MLAN_STATUS_SUCCESS; }