diff options
| author | Pitani Venkata Rajesh Kumar <vpitan@codeaurora.org> | 2014-08-12 14:57:28 +0530 |
|---|---|---|
| committer | Pitani Venkata Rajesh Kumar <vpitan@codeaurora.org> | 2014-08-12 14:59:20 +0530 |
| commit | d9f5c0e6918f5ffec355c6479508cc35c09fed67 (patch) | |
| tree | 9001934934ac0b8c218588cf350c5be7b4be5e34 | |
| parent | 3bed4b1c9597005409634d6089310d6b1c8e0864 (diff) | |
| parent | 60eec99c64ba6fa15c589ebf84b7cc96bc0c1296 (diff) | |
Release 1.0.0.167 QCACLD WLAN Driver
Merge remote-tracking branch 'origin/caf/caf-wlan/master'
* origin/caf/caf-wlan/master:
Cafstaging Release 1.0.0.167
Copyright Fix: wlan: Add nan-parser support for cnss_diag.
wlan: txrx: Remove obsolete ISOC and WIFI_2_0 conditions
qca_cld: convert reason code to string
qcacld-new: HDD: Provide fix for not decementing active session while roam
qcacld: Enable SIFS burst in cfg.ini by default
qcacld: Remove obsolete WDA layer (phase 1)
qcacld: Remove obsolete DXE modules
Change-Id: I02f59c879c565ff236a711865016187769a1f02a
41 files changed, 102 insertions, 29572 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_isoc.h b/CORE/CLD_TXRX/HTT/htt_isoc.h index a23e6496076e..3285a844cfd9 100644 --- a/CORE/CLD_TXRX/HTT/htt_isoc.h +++ b/CORE/CLD_TXRX/HTT/htt_isoc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -92,13 +92,8 @@ typedef enum htt_isoc_t2h_msg_type { (*((A_UINT8 *) msg_addr)) #ifndef INLINE -#ifdef QCA_WIFI_ISOC -/* host SW */ -#define INLINE inline -#else /* target FW */ #define INLINE __inline -#endif #define HTT_ISOC_INLINE_DEF #endif /* INLINE */ diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index f6eecac17574..f4c3969c83db 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -38,10 +38,6 @@ #include "adf_nbuf.h" #include "adf_os_mem.h" #include "adf_os_lock.h" -#ifdef QCA_WIFI_ISOC -#include "htt_dxe_types.h" -#include "isoc_hw_desc.h" -#endif #include "adf_nbuf.h" #include "wma_api.h" #include "vos_utils.h" @@ -324,88 +320,6 @@ tlshim_check_n_process_iapp_frame (pVosContextType pVosGCtx, #endif /* defined(FEATURE_WLAN_ESE) && !defined(FEATURE_WLAN_ESE_UPLOAD) */ -#ifdef QCA_WIFI_ISOC -static void tlshim_mgmt_rx_dxe_handler(void *context, adf_nbuf_t buflist) -{ - adf_nbuf_t tmp_next, cur = buflist; - isoc_rx_bd_t *rx_bd; - vos_pkt_t *rx_packet; - u_int8_t mpdu_header_offset = 0; - struct txrx_tl_shim_ctx *tl_shim = (struct txrx_tl_shim_ctx *)context; - void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, context); - - while(cur) { - /* Store the next buf in the list */ - tmp_next = adf_nbuf_next(cur); - - /* Move to next nBuf in list */ - adf_nbuf_set_next(cur, NULL); - - /* Get the Rx Bd */ - rx_bd = (isoc_rx_bd_t *)adf_nbuf_data(cur); - - /* Get MPDU Offset in RxBd */ - mpdu_header_offset = rx_bd->mpdu_header_offset; - - /* - * Allocate memory for the Rx Packet - * that has to be delivered to UMAC - */ - rx_packet = - (vos_pkt_t *)adf_os_mem_alloc(NULL, sizeof(vos_pkt_t)); - - if(!rx_packet) { - TLSHIM_LOGE("Rx Packet Mem Alloc Failed"); - adf_nbuf_free(cur); - goto next_nbuf; - } - - /* Fill packet related Meta Info */ - rx_packet->pkt_meta.channel = rx_bd->rx_channel; - rx_packet->pkt_meta.rssi = rx_bd->rssi0; - rx_packet->pkt_meta.snr = (((rx_bd->phy_stats1) >> 24) & 0xff); - rx_packet->pkt_meta.timestamp = rx_bd->rx_timestamp; - - rx_packet->pkt_meta.mpdu_hdr_len = rx_bd->mpdu_header_length; - rx_packet->pkt_meta.mpdu_len = rx_bd->mpdu_length; - rx_packet->pkt_meta.mpdu_data_len = - rx_bd->mpdu_length - rx_bd->mpdu_header_length; - - /* set the length of the packet buffer */ - adf_nbuf_put_tail(cur, - mpdu_header_offset + rx_bd->mpdu_length); - - /* - * Rx Bd is removed from adf_nbuf - * adf_nbuf is having only Rx Mgmt packet - */ - rx_packet->pkt_meta.mpdu_hdr_ptr = - adf_nbuf_pull_head(cur,mpdu_header_offset); - - /* Store the MPDU Data Pointer in Rx Packet */ - rx_packet->pkt_meta.mpdu_data_ptr = - rx_packet->pkt_meta.mpdu_hdr_ptr + rx_bd->mpdu_header_length; - - /* - * Rx Bd is removed from adf_nbuf data - * adf_nbuf data is having only Rx Mgmt packet - */ - rx_packet->pkt_buf = cur; - - /* - * Call the Callback registered by umac with wma - * for Rx Management Frames - */ - if(tl_shim->mgmt_rx) - tl_shim->mgmt_rx(vos_ctx, rx_packet); - else - vos_pkt_return_packet(rx_packet); -next_nbuf: - /* Move to next nBuf in the list */ - cur = tmp_next; - } -} -#else /*AR9888/AR6320 noise floor approx value*/ #define TLSHIM_TGT_NOISE_FLOOR_DBM (-96) @@ -820,7 +734,6 @@ static int tlshim_mgmt_rx_wmi_handler(void *context, u_int8_t *data, { return (tlshim_mgmt_rx_process(context, data, data_len, FALSE, 0)); } -#endif /* * tlshim_mgmt_roam_event_ind() is called from WMA layer when * BETTER_AP_FOUND event is received from roam engine. @@ -1503,12 +1416,7 @@ VOS_STATUS WLANTL_DisableUAPSDForAC(void *vos_ctx, u_int8_t sta_id, VOS_STATUS WLANTL_DeRegisterMgmtFrmClient(void *vos_ctx) { struct txrx_tl_shim_ctx *tl_shim; -#ifdef QCA_WIFI_ISOC - ol_txrx_pdev_handle txrx_pdev; - struct htt_dxe_pdev_t *htt_dxe_pdev; -#else tp_wma_handle wma_handle; -#endif ENTER(); #ifdef QCA_WIFI_FTM @@ -1523,22 +1431,6 @@ VOS_STATUS WLANTL_DeRegisterMgmtFrmClient(void *vos_ctx) return VOS_STATUS_E_FAILURE; } -#ifdef QCA_WIFI_ISOC - txrx_pdev = vos_get_context(VOS_MODULE_ID_TXRX, - vos_ctx); - if (!txrx_pdev) { - TLSHIM_LOGE("%s: Failed to get TXRX context", __func__); - return VOS_STATUS_E_FAILURE; - } - - htt_dxe_pdev = txrx_pdev->htt_pdev; - - if (dmux_dxe_register_callback_rx_mgmt(htt_dxe_pdev->dmux_dxe_pdev, - NULL, NULL) != 0) { - TLSHIM_LOGE("Failed to Unregister rx mgmt handler with dxe"); - return VOS_STATUS_E_FAILURE; - } -#else wma_handle = vos_get_context(VOS_MODULE_ID_WDA, vos_ctx); if (!wma_handle) { TLSHIM_LOGE("%s: Failed to get WMA context", __func__); @@ -1550,7 +1442,6 @@ VOS_STATUS WLANTL_DeRegisterMgmtFrmClient(void *vos_ctx) TLSHIM_LOGE("Failed to Unregister rx mgmt handler with wmi"); return VOS_STATUS_E_FAILURE; } -#endif tl_shim->mgmt_rx = NULL; return VOS_STATUS_SUCCESS; } @@ -1561,26 +1452,12 @@ VOS_STATUS WLANTL_RegisterMgmtFrmClient(void *vos_ctx, struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx); -#ifdef QCA_WIFI_ISOC - ol_txrx_pdev_handle txrx_pdev = vos_get_context(VOS_MODULE_ID_TXRX, - vos_ctx); - struct htt_dxe_pdev_t *htt_dxe_pdev = txrx_pdev->htt_pdev; -#else tp_wma_handle wma_handle = vos_get_context(VOS_MODULE_ID_WDA, vos_ctx); -#endif if (!tl_shim) { TLSHIM_LOGE("%s: Failed to get TLSHIM context", __func__); return VOS_STATUS_E_FAILURE; } -#ifdef QCA_WIFI_ISOC - if (dmux_dxe_register_callback_rx_mgmt(htt_dxe_pdev->dmux_dxe_pdev, - tlshim_mgmt_rx_dxe_handler, - tl_shim) != 0) { - TLSHIM_LOGE("Failed to register rx mgmt handler with dxe"); - return VOS_STATUS_E_FAILURE; - } -#else if (!wma_handle) { TLSHIM_LOGE("%s: Failed to get WMA context", __func__); return VOS_STATUS_E_FAILURE; @@ -1592,7 +1469,6 @@ VOS_STATUS WLANTL_RegisterMgmtFrmClient(void *vos_ctx, TLSHIM_LOGE("Failed to register rx mgmt handler with wmi"); return VOS_STATUS_E_FAILURE; } -#endif tl_shim->mgmt_rx = mgmt_frm_rx; return VOS_STATUS_SUCCESS; diff --git a/CORE/CLD_TXRX/TXRX/ol_cfg.c b/CORE/CLD_TXRX/TXRX/ol_cfg.c index 6d4aaf22e1f4..32dff6f7ed22 100644 --- a/CORE/CLD_TXRX/TXRX/ol_cfg.c +++ b/CORE/CLD_TXRX/TXRX/ol_cfg.c @@ -61,10 +61,8 @@ ol_pdev_handle ol_pdev_cfg_attach(adf_os_device_t osdev, */ cfg_ctx->tx_download_size = 16; #endif -#ifndef QCA_WIFI_ISOC /* temporarily diabled PN check for Riva/Pronto */ cfg_ctx->rx_pn_check = 1; -#endif #if CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK cfg_ctx->defrag_timeout_check = 1; #endif diff --git a/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h b/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h index 2a07a52caec4..e945870476bf 100644 --- a/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h +++ b/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -192,57 +192,10 @@ ol_rx_notify( void ol_tx_paused_peer_data(ol_peer_handle peer, int has_tx_data); -#ifdef QCA_WIFI_ISOC - -/** - * @brief Request the control SW to begin an ADDBA negotiation - * @details - * For systems in which ADDBA-request / response handshaking is handled - * by the host SW, the data SW will use this function to request for the - * control SW to perform ADDBA negotiation. - * The control SW will check whether it is able to do the ADDBA - * negotiation, and will use the return value to indicate whether the - * requested ADDBA negotiation was actually started. - * If the control SW starts ADDBA negotiation, it will call the - * reverse-direction ol_tx_addba_conf function to notify the data SW - * when the ADDBA negotiation completes. - * - * @param pdev - handle to the ctrl SW's physical device object - * @param peer_mac_addr - which peer the ADDBA negotiation is with - * @param tid - which traffic type the ADDBA negotiation is for - * @return ol_addba_status enum - */ -enum ol_addba_status -ol_ctrl_addba_req(ol_pdev_handle pdev, u_int8_t *peer_mac_addr, int tid); - -/** - * @brief Notify the control SW that rx aggregation setup is complete - * @details - * For systems in which responses to ADDBA-requests are handled by the host - * SW, the host control SW will tell the target to set up rx aggregation. - * The target, in turn, will send a HTT T2H RX_ADDBA message to the host - * data SW, to set up the host's side of rx aggregation. - * After the host data SW processes the RX_ADDBA message from the target, - * it will call this function to notify the host control SW that the target - * and the host data SW are fully prepared for rx aggregation. - * So, upon receiving this function call, the host control SW can send - * the ADDBA-response message. - * - * @param pdev - handle to the ctrl SW's physical device object - * @param peer_mac_addr - which peer the ADDBA request was from - * @param tid - which traffic type the ADDBA request was for - * @param failed - whether rx aggregation setup succeeded (0) or failed (1) - */ -void -ol_ctrl_rx_addba_complete( - ol_pdev_handle pdev, u_int8_t *peer_mac_addr, int tid, int failed); - -#else #define ol_ctrl_addba_req(pdev, peer_mac_addr, tid) ol_addba_req_reject #define ol_ctrl_rx_addba_complete(pdev, peer_mac_addr, tid, failed) /* no-op */ -#endif /* QCA_SUPPORT_HOST_ADDBA */ #endif /* _OL_CTRL_TXRX_API__H_ */ diff --git a/CORE/CLD_TXRX/TXRX/ol_rx.c b/CORE/CLD_TXRX/TXRX/ol_rx.c index 410df5e0486a..f7509e3eeed9 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -60,7 +60,7 @@ #include <ol_vowext_dbg_defs.h> #ifdef HTT_RX_RESTORE -#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) && defined(CONFIG_CNSS) +#if defined(CONFIG_CNSS) #include <net/cnss.h> #endif #endif diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c index 803e24a7379f..21294288ab71 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -71,40 +71,6 @@ static char g_log2ceil[] = { /*=== function definitions ===*/ /*---*/ -#ifdef QCA_WIFI_ISOC - -#define QCA_SUPPORT_RX_REORDER_RELEASE_CHECK 1 - -static inline void -OL_RX_REORDER_IDX_START_SELF_SELECT( - struct ol_txrx_peer_t *peer, unsigned tid, unsigned *idx_start) -{ - /* for simplicity, always use the next_rel_idx value */ - //if (*idx_start == ~0) - { - *idx_start = peer->tids_next_rel_idx[tid]; - } -} -#define OL_RX_REORDER_IDX_WRAP(idx, win_sz, win_sz_mask) \ - do { \ - if (idx >= win_sz) { \ - idx = 0; \ - } \ - } while (0) -#define OL_RX_REORDER_IDX_MAX(win_sz, win_sz_mask) (win_sz - 1) -/* - * For "integrated SoC", the reorder index represents the offset from the - * start of the block ack window. - * Hence, the initial value for this index is zero. - */ -#define OL_RX_REORDER_IDX_INIT(seq_num, win_sz, win_sz_mask) 0 -#define OL_RX_REORDER_NO_HOLES(rx_reorder) ((rx_reorder)->num_mpdus == 0) -#define OL_RX_REORDER_MPDU_CNT_INCR(rx_reorder, incr) \ - ((rx_reorder)->num_mpdus += (incr)) -#define OL_RX_REORDER_MPDU_CNT_DECR(rx_reorder, decr) \ - ((rx_reorder)->num_mpdus -= (decr)) - -#else #define QCA_SUPPORT_RX_REORDER_RELEASE_CHECK 0 #define OL_RX_REORDER_IDX_START_SELF_SELECT(peer, tid, idx_start) /* no-op */ @@ -115,31 +81,14 @@ OL_RX_REORDER_IDX_START_SELF_SELECT( #define OL_RX_REORDER_MPDU_CNT_INCR(rx_reorder, incr) /* n/a */ #define OL_RX_REORDER_MPDU_CNT_DECR(rx_reorder, decr) /* n/a */ -#endif /* QCA_WIFI_ISOC */ /*---*/ -#if defined (QCA_WIFI_ISOC) && defined (QCA_SUPPORT_RX_REORDER_RELEASE_CHECK) - -/* reorder array elements could be NULL */ -#define OL_RX_REORDER_PTR_CHECK(ptr) if (ptr) -#define OL_RX_REORDER_LIST_APPEND(head_msdu, tail_msdu, rx_reorder_array_elem) \ - do { \ - if (tail_msdu) { \ - adf_nbuf_set_next(tail_msdu, rx_reorder_array_elem->head); \ - } else { \ - head_msdu = rx_reorder_array_elem->head; \ - tail_msdu = rx_reorder_array_elem->tail; \ - } \ - } while (0) - -#else /* reorder array elements are known to be non-NULL */ #define OL_RX_REORDER_PTR_CHECK(ptr) /* no-op */ #define OL_RX_REORDER_LIST_APPEND(head_msdu, tail_msdu, rx_reorder_array_elem) \ adf_nbuf_set_next(tail_msdu, rx_reorder_array_elem->head) -#endif /* QCA_SUPPORT_RX_REORDER_RELEASE_CHECK */ /* functions called by txrx components */ @@ -204,14 +153,6 @@ ol_rx_reorder_store( idx &= peer->tids_rx_reorder[tid].win_sz_mask; rx_reorder_array_elem = &peer->tids_rx_reorder[tid].array[idx]; if (rx_reorder_array_elem->head) { -#ifdef QCA_WIFI_ISOC - /* This should not happen in Riva/Pronto case. Because - * A-MSDU within a MPDU is indicated together. Defragmentation - * is handled by RPE. So add an Assert here to catch potential - * rx reorder issues. - */ - TXRX_ASSERT2(0); -#endif adf_nbuf_set_next(rx_reorder_array_elem->tail, head_msdu); } else { rx_reorder_array_elem->head = head_msdu; @@ -440,23 +381,6 @@ ol_rx_reorder_peer_cleanup( OL_RX_REORDER_TIMEOUT_PEER_CLEANUP(peer); } -#ifdef QCA_WIFI_ISOC -/* - * (Responder Role) TXRX Data Path will invoke this API after - * Aggregation has been enabled for this peer-tid combination - * with appropriate status code. Send ADDBA Response to Peer with - * status. - */ -void ol_ctrl_rx_addba_complete(ol_pdev_handle pdev, - u_int8_t *peer_mac_addr, - int tid, int failed) -{ - /* - * TODO: Send Rx AddBA response to umac for the devices - * which does addba processing on host (pronto). - */ -} -#endif /* functions called by HTT */ diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.h b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.h index e7721205aa7c..920717b0da85 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.h +++ b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -89,20 +89,6 @@ ol_rx_reorder_seq_num_check( unsigned tid, unsigned seq_num); -#ifdef QCA_WIFI_ISOC - -/* - * Riva, Pronto, Northstar: do sequence number checking in the host - * for peer-TIDs with aggregation is enabled - */ -#define OL_RX_REORDER_SEQ_NUM_CHECK(pdev, peer, tid, rx_mpdu_desc) \ - (peer->tids_rx_reorder[tid].win_sz_mask != 0) ? \ - ol_rx_reorder_seq_num_check( \ - pdev, peer, tid, \ - htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, rx_mpdu_desc)) : \ - htt_rx_status_ok - -#else /* * Peregrine and Rome: do sequence number checking in the host @@ -115,7 +101,6 @@ ol_rx_reorder_seq_num_check( htt_rx_mpdu_desc_seq_num(pdev->htt_pdev, rx_mpdu_desc)) : \ htt_rx_status_ok -#endif /* QCA_WIFI_ISOC */ #endif /* _OL_RX_REORDER__H_ */ diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.c b/CORE/CLD_TXRX/TXRX/ol_tx.c index b340c549bdcb..ac828d79729c 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx.c @@ -469,14 +469,8 @@ ol_tx_non_std_ll( #define OL_TX_ENCAP_WRAPPER(pdev, vdev, tx_desc, msdu, tx_msdu_info) /* no-op */ #endif -#ifdef QCA_WIFI_ISOC -#define TX_FILTER_CHECK(tx_msdu_info) \ - ((tx_msdu_info)->peer && \ - ((tx_msdu_info)->peer->tx_filter(tx_msdu_info) != A_OK)) -#else /* tx filtering is handled within the target FW */ #define TX_FILTER_CHECK(tx_msdu_info) 0 /* don't filter */ -#endif static inline adf_nbuf_t ol_tx_hl_base( diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c index 333faabce46a..f3700f6b745d 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c @@ -54,46 +54,8 @@ #if defined(CONFIG_HL_SUPPORT) -#ifdef QCA_WIFI_ISOC - -A_STATUS -ol_tx_classify_extension( - struct ol_txrx_vdev_t *vdev, - struct ol_tx_desc_t *tx_desc, - adf_nbuf_t tx_nbuf, - struct ol_txrx_msdu_info_t *tx_msdu_info); - -A_STATUS -ol_tx_classify_mgmt_extension( - struct ol_txrx_vdev_t *vdev, - struct ol_tx_desc_t *tx_desc, - adf_nbuf_t tx_nbuf, - struct ol_txrx_msdu_info_t *tx_msdu_info); - -#define OL_TX_CLASSIFY_EXTENSION(vdev, tx_desc, netbuf, msdu_info, txq) \ - do { \ - A_STATUS status; \ - status = ol_tx_classify_extension( \ - vdev, tx_desc, netbuf, msdu_info); \ - if (A_OK != status) { \ - txq = NULL; /* error */ \ - } \ - } while (0) - -#define OL_TX_CLASSIFY_MGMT_EXTENSION(vdev, tx_desc, netbuf, msdu_info, txq) \ - do { \ - A_STATUS status; \ - status = ol_tx_classify_mgmt_extension( \ - vdev, tx_desc, netbuf, msdu_info); \ - if (A_OK != status) { \ - txq = NULL; /* error */ \ - } \ - } while (0) - -#else #define OL_TX_CLASSIFY_EXTENSION(vdev, tx_desc, netbuf, msdu_info, txq) #define OL_TX_CLASSIFY_MGMT_EXTENSION(vdev, tx_desc, netbuf, msdu_info, txq) -#endif /* QCA_WIFI_ISOC */ #ifdef QCA_TX_HTT2_SUPPORT static void diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_queue.c b/CORE/CLD_TXRX/TXRX/ol_tx_queue.c index b647c6356a1a..21da7590b64c 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_queue.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_queue.c @@ -82,20 +82,9 @@ ol_tx_queue_log_free( /*--- function prototypes for optional host ADDBA negotiation ---------------*/ -#ifdef QCA_WIFI_ISOC - -void -ol_tx_queue_addba_check( - struct ol_txrx_pdev_t *pdev, - struct ol_tx_frms_queue_t *txq, - struct ol_txrx_msdu_info_t *tx_msdu_info); -#define OL_TX_QUEUE_ADDBA_CHECK ol_tx_queue_addba_check - -#else #define OL_TX_QUEUE_ADDBA_CHECK(pdev, txq, tx_msdu_info) /* no-op */ -#endif /* QCA_SUPPORT_HOST_ADDBA */ #ifndef container_of #define container_of(ptr, type, member) ((type *)( \ @@ -430,24 +419,6 @@ ol_txrx_peer_tid_unpause_base( } } -#if defined(CONFIG_HL_SUPPORT) && defined(QCA_WIFI_ISOC) -void -ol_txrx_peer_pause(ol_txrx_peer_handle peer) -{ - struct ol_txrx_pdev_t *pdev = peer->vdev->pdev; - - /* TO DO: log the queue pause */ - - /* acquire the mutex lock, since we'll be modifying the queues */ - TX_SCHED_DEBUG_PRINT("Enter %s\n", __func__); - adf_os_spin_lock_bh(&pdev->tx_queue_spinlock); - - ol_txrx_peer_pause_base(pdev, peer); - - adf_os_spin_unlock_bh(&pdev->tx_queue_spinlock); - TX_SCHED_DEBUG_PRINT("Leave %s\n", __func__); -} -#endif void ol_txrx_peer_tid_unpause(ol_txrx_peer_handle peer, int tid) @@ -800,142 +771,6 @@ void ol_tx_throttle_init(struct ol_txrx_pdev_t *pdev) /*--- ADDBA triggering functions --------------------------------------------*/ -#ifdef QCA_WIFI_ISOC - -/** -* Request the control SW to begin an ADDBA negotiation -*/ -enum ol_addba_status -ol_ctrl_addba_req( - ol_pdev_handle pdev, - u_int8_t *peer_mac_addr, - int tidno) -{ - /* - * TODO: Process ADDBA request and send whether the requested - * ADDBA negotiation was started. - */ - return ol_addba_success; -} - -void -ol_tx_queue_addba_check( - struct ol_txrx_pdev_t *pdev, - struct ol_tx_frms_queue_t *txq, - struct ol_txrx_msdu_info_t *tx_msdu_info) -{ - struct ol_txrx_peer_t *peer; - int tid; - enum ol_addba_status status; - - if (!pdev->cfg.host_addba || /* host doesn't handle ADDBA negotiation */ - txq->aggr_state == ol_tx_aggr_enabled || /* ADDBA already done */ - txq->aggr_state == ol_tx_aggr_disabled || /* ADDBA not permitted */ - txq->aggr_state == ol_tx_aggr_in_progress) - { - return; - } - - /* if the tx queue is not marked as aggr_disabled, it belongs to a peer */ - TXRX_ASSERT1(tx_msdu_info->peer); - peer = tx_msdu_info->peer; - tid = tx_msdu_info->htt.info.ext_tid; - - if (ETHERTYPE_IS_EAPOL_WAPI(tx_msdu_info->htt.info.ethertype)) { - /* - * Don't start aggregation based on EAPOL frame, - * but do start for future real data frames. - */ - txq->aggr_state = ol_tx_aggr_retry; - return; - } - - if (txq->aggr_state == ol_tx_aggr_retry) { - if (tx_msdu_info->peer) { - /* - * The queue is probably currently unpaused. - * Pause it during the ADDBA negotiation. - */ - ol_txrx_peer_tid_pause_base(pdev, peer, tid); - } - } - - status = ol_ctrl_addba_req( - pdev->ctrl_pdev, &peer->mac_addr.raw[0], tid); - if (status == ol_addba_reject) { - /* Aggregation is disabled for this peer-TID. Unpause the tx queue. */ - txq->aggr_state = ol_tx_aggr_disabled; - ol_txrx_peer_tid_unpause_base(pdev, peer, tid); - } else if (status == ol_addba_busy) { - if (ol_cfg_addba_retry(pdev->ctrl_pdev)) { - /* ADDBA negotiation can't be done now, but try again next time */ - txq->aggr_state = ol_tx_aggr_retry; - } else { - txq->aggr_state = ol_tx_aggr_disabled; - } - /* unpause the tx queue, so the new frame can be sent */ - ol_txrx_peer_tid_unpause_base(pdev, peer, tid); - } else { - /* ADDBA negotiation successfully started */ - txq->aggr_state = ol_tx_aggr_in_progress; - } -} - -void -ol_tx_queue_decs_reinit( - ol_txrx_peer_handle peer, - u_int16_t peer_id) -{ - ol_tx_desc_list *tx_descs; - struct ol_tx_desc_t *tx_desc, *tmp; - - tx_descs = &peer->txqs[HTT_TX_EXT_TID_MGMT].head; - - TAILQ_FOREACH_SAFE(tx_desc, tx_descs, tx_desc_list_elem, tmp) { - /* initialize the HW tx descriptor */ - htt_tx_desc_set_peer_id((u_int32_t*)tx_desc->htt_tx_desc, peer_id); - } - - adf_os_print("%s peer_id=%d\n", __func__, peer_id); -} - -void -ol_tx_addba_conf(ol_txrx_peer_handle peer, int tid, enum ol_addba_status status) -{ - if (!peer->vdev->pdev->cfg.host_addba) { - /* - * In theory, this function should never be called if the - * host_addba configuration flag is not set. - * In practice, some test framework SW may call this function - * even if host_addba is not set, so handle this unexpected - * invocation gracefully. - */ - adf_os_print( - "UNEXPECTED CALL TO %s WHEN HOST ADDBA IS DISABLED!\n", __func__); - return; - } - /* mark the aggregation as being complete */ - TXRX_ASSERT1(peer->txqs[tid].aggr_state == ol_tx_aggr_in_progress); - /* - * It's possible that the ADDBA request was rejected, but regardless of - * whether it was accepted, mark the tx queue to show that ADDBA - * negotiation has already been done, and need not be attempted again. - * However, if the negotiation failed to complete (i.e. was aborted), - * then mark tx queue to try again later, unless the status says to - * not try again. - */ - if (status == ol_addba_success) { - peer->txqs[tid].aggr_state = ol_tx_aggr_enabled; - } else if (status == ol_addba_reject) { - peer->txqs[tid].aggr_state = ol_tx_aggr_disabled; - } else { /* busy */ - peer->txqs[tid].aggr_state = ol_tx_aggr_retry; - } - /* unpause the tx queue */ - ol_txrx_peer_tid_unpause(peer, tid); -} - -#endif /* QCA_SUPPORT_HOST_ADDBA */ /*=== debug functions =======================================================*/ diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_queue.h b/CORE/CLD_TXRX/TXRX/ol_tx_queue.h index b761e393a286..94ec2e39b821 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_queue.h +++ b/CORE/CLD_TXRX/TXRX/ol_tx_queue.h @@ -159,14 +159,7 @@ ol_tx_queues_display(struct ol_txrx_pdev_t *pdev); #define ol_tx_queues_display(pdev) /* no-op */ #endif -#ifdef QCA_WIFI_ISOC -void -ol_tx_queue_decs_reinit( - ol_txrx_peer_handle peer, - u_int16_t peer_id); -#else #define ol_tx_queue_decs_reinit(peer, peer_id) /* no-op */ -#endif /* CONFIG_HL_SUPPORT */ #ifdef QCA_SUPPORT_TX_THROTTLE /** diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c index b764573bd475..edb1bf6355bd 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -487,61 +487,6 @@ struct ol_tx_sched_wrr_adv_category_info_t { enum { OL_TX_SCHED_WRR_ADV_ ## cat ## _DISCARD_WEIGHT = \ (discard_weights) } -#ifdef QCA_WIFI_ISOC -/* Riva, Pronto, Northstar: - * For high-volume traffic flows (VI, BE, BK), use a credit threshold - * roughly equal to a large A-MPDU (5 fragments * 64 frames) to download - * AMPDU-sized batches of traffic. - * For high-priority, low-volume traffic flows (VO and mgmt), use no - * credit threshold, to minimize download latency. - */ -/* -* VO: -* - high priority (no skip) -* - download a.s.a.p. (don't wait for enough credit to download a batch) -* - allow a large number of frames to be downloaded at once -* (In real systems this is unneeded - voice traffic is such -* low bandwidth that no more than 1 frame per user will be -* present at a time. However, this setting allows for large -* volumes of fake voice traffic during testing.) -* - use all available credit -* - don't discard, if possible -* VI: -* - high priority (no skip) -* - wait for enough credit to download a moderately large batch -* - allow a moderately large batch to be downloaded at once -* - don't use all credit - leave enough for a single frame -* (which can be used by voice) -* - try not to discard, but if necessary discard the VI frames -* before VO frames -* BK: -* - low priority (skip twice between actual servicing) -* - wait for enough credit to download a small batch -* - allow a small batch to be downloaded at once -* - don't use all credit - leave enough for a single frame -* (which can be used by voice) -* - discard these frames before VI or VO -* BE: -* - moderate priority (skip once between actual servicing) -* - wait for enough credit to download a moderate batch -* - allow a moderate batch to be downloaded at once -* - don't use all credit - leave enough for a single frame -* (which can be used by voice) -* - discard these frames before VI or VO -*/ -// WRR send -// skip credit limit credit disc -// wts thresh (frms) reserv wts -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(VO, 1, 1, 32, 0, 1); -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(VI, 1, (5*32), 24, 5, 4); -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(BK, 3, (5*64), 10, 5, 8); -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(BE, 2, (5*64), 16, 5, 8); -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(NON_QOS_DATA, 3, (5*64), 4, 5, 8); -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(UCAST_MGMT, 1, 1, 4, 0, 0); -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(MCAST_DATA, 2, (5*64), 4, 5, 4); -OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(MCAST_MGMT, 1, 1, 4, 0, 1); - -#else /* Rome: * For high-volume traffic flows (VI, BE, BK), use a credit threshold * roughly equal to a large A-MPDU (occupying half the target memory @@ -562,7 +507,6 @@ OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(UCAST_MGMT, 1, 1, 4, 0, 1); OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(MCAST_DATA, 10, 16, 4, 1, 4); OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(MCAST_MGMT, 1, 1, 4, 0, 1); -#endif /* QCA_WIFI_ISOC */ #if DEBUG_SCHED_STAT @@ -1222,11 +1166,7 @@ ol_tx_sched_notify( } } -#ifdef QCA_WIFI_ISOC -#define OL_TX_MSDU_ID_STORAGE_ERR(ptr) 0 /* always have headroom in ISOC */ -#else #define OL_TX_MSDU_ID_STORAGE_ERR(ptr) (NULL == ptr) -#endif void ol_tx_sched_dispatch( diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c index ea8382edf4d2..925fbc5d0c97 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx.c +++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c @@ -1555,11 +1555,7 @@ ol_txrx_get_tx_pending(ol_txrx_pdev_handle pdev_handle) total = ol_cfg_target_tx_credit(pdev->ctrl_pdev); } -#ifndef QCA_WIFI_ISOC return (total - pdev->tx_desc.num_free); -#else - return total - adf_os_atomic_read(&pdev->target_tx_credit); -#endif } void diff --git a/CORE/DXE/inc/wlan_qct_dxe.h b/CORE/DXE/inc/wlan_qct_dxe.h deleted file mode 100644 index 1453d9b51a4e..000000000000 --- a/CORE/DXE/inc/wlan_qct_dxe.h +++ /dev/null @@ -1,474 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -#ifndef WLAN_QCT_DXE_H -#define WLAN_QCT_DXE_H - -/**========================================================================= - - @file wlan_qct_dxe.h - - @brief - - This file contains the external API exposed by the wlan data transfer abstraction layer module. -========================================================================*/ - -/*=========================================================================== - - EDIT HISTORY FOR FILE - - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - - $Header:$ $DateTime: $ $Author: $ - - -when who what, where, why --------- --- ---------------------------------------------------------- -08/03/10 schang Created module. - -===========================================================================*/ - -/*=========================================================================== - - INCLUDE FILES FOR MODULE - -===========================================================================*/ - -/*---------------------------------------------------------------------------- - * Include Files - * -------------------------------------------------------------------------*/ -#include "wlan_qct_pal_api.h" -#include "wlan_qct_pal_packet.h" -#include "wlan_qct_pal_status.h" -#include "wlan_qct_pal_type.h" -#include "wlan_qct_pal_msg.h" -#include "wlan_qct_pal_sync.h" -#include "wlan_qct_wdi_dts.h" - -/*---------------------------------------------------------------------------- - * Type Declarations - * -------------------------------------------------------------------------*/ -/* DXE Descriptor contents SWAP option flag */ - -//#define WLANDXE_ENDIAN_SWAP_ENABLE - -/* Default RX OS frame buffer size - * Size must be same with Vos Packet Size */ -#define WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE (VPKT_SIZE_BUFFER) - -/*The maximum number of packets that can be chained in dxe for the Low - priority channel - Note: Increased it to 240 from 128 for Windows(EA) becase Windows is - able to push 2~6 packet chain in one NET_BUFFER. It causes TX low - resource condition more easily than LA. It ends up to cause low - throughut number and spend more CPU time*/ -#ifdef WINDOWS_DT -#define WLANDXE_LO_PRI_RES_NUM 240 -#else -#define WLANDXE_LO_PRI_RES_NUM 128 -#endif - - -/*The maximum number of packets that can be chained in dxe for the HI - priority channel */ -#define WLANDXE_HI_PRI_RES_NUM 10 - -typedef enum -{ - WLANDXE_POWER_STATE_FULL, - WLANDXE_POWER_STATE_IMPS, - WLANDXE_POWER_STATE_BMPS, - WLANDXE_POWER_STATE_BMPS_PENDING, - WLANDXE_POWER_STATE_DOWN, - WLANDXE_POWER_STATE_MAX -} WLANDXE_PowerStateType; - -typedef enum -{ - WLANDXE_RIVA_POWER_STATE_ACTIVE, - WLANDXE_RIVA_POWER_STATE_IMPS_UNKNOWN, - WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN, - WLANDXE_RIVA_POWER_STATE_DOWN_UNKNOWN, - WLANDXE_RIVA_POWER_STATE_MAX -} WLANDXE_RivaPowerStateType; - -/*========================================================================== - @ Type Name - WLANDXE_RxFrameReadyCbType - - @ Description - RX Frame Ready indication CB - - @ Parameters - pVoid pAdapter : Driver global control block pointer - palPacket pRXFramePtr : Received Frame Pointer - pVoid userCtxt : DTS user contect pointer - - @ Return - wpt_status -===========================================================================*/ -typedef WDTS_RxFrameReadyCbType WLANDXE_RxFrameReadyCbType; - -/*========================================================================== - @ Type Name - WLANDXE_TxCompleteCbType - - @ Description - TX complete indication CB - - @ Parameters - pVoid pAdapter : Driver global control block pointer - void pTXFramePtr : Completed TX Frame Pointer - pVoid userCtxt : DTS user contect pointer - - @ Return - wpt_status -===========================================================================*/ -typedef WDTS_TxCompleteCbType WLANDXE_TxCompleteCbType; - -/*========================================================================== - @ Type Name - WLANDXE_LowResourceCbType - - @ Description - DXE Low resource indication CB - - @ Parameters - pVoid pAdapter : Driver global control block pointer - BOOL lowResourceCondition : DXE low resource or not - pVoid userCtxt : DTS user contect pointer - - @ Return - wpt_status -===========================================================================*/ -typedef WDTS_LowResourceCbType WLANDXE_LowResourceCbType; - -/*========================================================================== - @ Type Name - WLANDXE_SetPowerStateCbType - - @ Description - DXE Set power state ACK callback. This callback function should be - invoked by the DXE to notify WDI that set power state request is complete - - @ Parameters - status status of the set operation - pUserData Cookie that should be passed back to the caller along with the - callback. - - @ Return - None -===========================================================================*/ -typedef WDTS_SetPSCbType WLANDXE_SetPowerStateCbType; - -/*------------------------------------------------------------------------- - *Function declarations and documenation - *-------------------------------------------------------------------------*/ -/*========================================================================== - @ Function Name - WLANDXE_Open - - @ Description - Open host DXE driver, allocate DXE resources - Allocate, DXE local control block, DXE descriptor pool, DXE descriptor control block pool - - @ Parameters - pVoid pAdapter : Driver global control block pointer - - @ Return - pVoid DXE local module control block pointer -===========================================================================*/ -void *WLANDXE_Open -( - void -); - -/*========================================================================== - @ Function Name - WLANDXE_ClientRegistration - - @ Description - Make callback functions registration into DXE driver from DXE driver client - - @ Parameters - pVoid pDXEContext : DXE module control block - WDTS_RxFrameReadyCbType rxFrameReadyCB : RX Frame ready CB function pointer - WDTS_TxCompleteCbType txCompleteCB : TX complete CB function pointer - WDTS_LowResourceCbType lowResourceCB : Low DXE resource notification CB function pointer - void *userContext : DXE Cliennt control block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_ClientRegistration -( - void *pDXEContext, - WDTS_RxFrameReadyCbType rxFrameReadyCB, - WDTS_TxCompleteCbType txCompleteCB, - WDTS_LowResourceCbType lowResourceCB, - void *userContext -); - -/*========================================================================== - @ Function Name - WLANDXE_Start - - @ Description - Start Host DXE driver - Initialize DXE channels and start channel - - @ Parameters - pVoid pDXEContext : DXE module control block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_Start -( - void *pDXEContext -); - -/*========================================================================== - @ Function Name - WLANDXE_TXFrame - - @ Description - Trigger frame transmit from host to RIVA - - @ Parameters - pVoid pDXEContext : DXE Control Block - wpt_packet pPacket : transmit packet structure - WDTS_ChannelType channel : TX channel - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_TxFrame -( - void *pDXEContext, - wpt_packet *pPacket, - WDTS_ChannelType channel -); - - -/*========================================================================== - @ Function Name - WLANDXE_CompleteTX - - @ Description - Informs DXE that the current series of Tx packets is complete - - @ Parameters - pDXEContext : DXE Control Block - ucTxResReq TX resource number required by TL/WDI - - @ Return - wpt_status -===========================================================================*/ -wpt_status -WLANDXE_CompleteTX -( - void* pDXEContext, - wpt_uint32 ucTxResReq -); - -/*========================================================================== - @ Function Name - WLANDXE_Stop - - @ Description - Stop DXE channels and DXE engine operations - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_Stop -( - void *pDXEContext -); - -/*========================================================================== - @ Function Name - WLANDXE_Close - - @ Description - Close DXE channels - Free DXE related resources - DXE descriptor free - Descriptor control block free - Pre allocated RX buffer free - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_Close -( - void *pDXEContext -); - -/*========================================================================== - @ Function Name - WLANDXE_TriggerTX - - @ Description - TBD - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_TriggerTX -( - void *pDXEContext -); - -/*========================================================================== - @ Function Name - WLANDXE_SetPowerState - - @ Description - From Client let DXE knows what is the WLAN HW(RIVA) power state - - @ Parameters - pVoid pDXEContext : DXE Control Block - WLANDXE_PowerStateType powerState - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_SetPowerState -( - void *pDXEContext, - WDTS_PowerStateType powerState, - WDTS_SetPSCbType cBack -); - -/*========================================================================== - @ Function Name - WLANDXE_GetFreeTxDataResNumber - - @ Description - Returns free descriptor numbers for TX data channel (TX high priority) - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_uint32 Free descriptor number of TX high pri ch -===========================================================================*/ -wpt_uint32 WLANDXE_GetFreeTxDataResNumber -( - void *pDXEContext -); - -/*========================================================================== - @ Function Name - WLANDXE_ChannelDebug - - @ Description - Display DXE Channel debugging information - User may request to display DXE channel snapshot - Or if host driver detects any abnormal stcuk may display - - @ Parameters - displaySnapshot : Display DXE snapshot option - enableStallDetect : Enable stall detect feature - This feature will take effect to data performance - Not integrate till fully verification - - @ Return - NONE - -===========================================================================*/ -void WLANDXE_ChannelDebug -( - wpt_boolean displaySnapshot, - wpt_boolean enableStallDetect -); - -#ifdef WLANDXE_TEST_CHANNEL_ENABLE -/*========================================================================== - @ Function Name - WLANDXE_UnitTest - - @ Description - Temporary for the DXE module test - - @ Parameters - NONE - - @ Return - NONE - -===========================================================================*/ -void WLANDXE_UnitTestStartDXE -( - void -); - -/*========================================================================== - @ Function Name - - @ Description - - @ Parameters - - @ Return - -===========================================================================*/ -void WLANDXE_UnitTestDataTransfer -( - void -); - -/*========================================================================== - @ Function Name - - @ Description - - @ Parameters - - @ Return - -===========================================================================*/ -void WLANDXE_UnitTestEventHandle -( - void *dxeCB -); -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ -#endif /* WLAN_QCT_DXE_H */ diff --git a/CORE/DXE/src/wlan_qct_dxe.c b/CORE/DXE/src/wlan_qct_dxe.c deleted file mode 100644 index 378c0b65f67c..000000000000 --- a/CORE/DXE/src/wlan_qct_dxe.c +++ /dev/null @@ -1,5618 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/**========================================================================= - - @file wlan_qct_dxe.c - - @brief - - This file contains the external API exposed by the wlan data transfer abstraction layer module. -========================================================================*/ - -/*=========================================================================== - - EDIT HISTORY FOR FILE - - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - - $Header:$ $DateTime: $ $Author: $ - - -when who what, where, why --------- --- ---------------------------------------------------------- -08/03/10 schang Created module. - -===========================================================================*/ - -/*=========================================================================== - - INCLUDE FILES FOR MODULE - -===========================================================================*/ - -/*---------------------------------------------------------------------------- - * Include Files - * -------------------------------------------------------------------------*/ -#include "wlan_qct_dxe.h" -#include "wlan_qct_dxe_i.h" -#include "wlan_qct_pal_device.h" -#ifdef FEATURE_R33D -#include "wlan_qct_pal_bus.h" -#endif /* FEATURE_R33D */ - -/*---------------------------------------------------------------------------- - * Local Definitions - * -------------------------------------------------------------------------*/ -//#define WLANDXE_DEBUG_CH_INFO_DUMP - -/* Temporary configuration defines - * Have to find out permanent solution */ -#define T_WLANDXE_MAX_DESCRIPTOR_COUNT 40 -#define T_WLANDXE_MAX_FRAME_SIZE 2000 -#define T_WLANDXE_TX_INT_ENABLE_FCOUNT 1 -#define T_WLANDXE_MEMDUMP_BYTE_PER_LINE 16 -#define T_WLANDXE_MAX_RX_PACKET_WAIT 6000 -#define T_WLANDXE_SSR_TIMEOUT 5000 -#define T_WLANDXE_PERIODIC_HEALTH_M_TIME 2500 -#define T_WLANDXE_MAX_HW_ACCESS_WAIT 2000 -#define WLANDXE_MAX_REAPED_RX_FRAMES 512 - -#define WLANPAL_RX_INTERRUPT_PRO_MASK 0x20 -#define WLANDXE_RX_INTERRUPT_PRO_UNMASK 0x5F - -/* 1msec busy wait in case CSR is not valid */ -#define WLANDXE_CSR_NEXT_READ_WAIT 1000 -/* CSR max retry count */ -#define WLANDXE_CSR_MAX_READ_COUNT 30 - - -/* This is temporary fot the compile - * WDI will release official version - * This must be removed */ -#define WDI_GET_PAL_CTX() NULL - - -/*------------------------------------------------------------------------- - * Local Varables - *-------------------------------------------------------------------------*/ -/* This is temp, someone have to allocate for me, and must be part of global context */ -static WLANDXE_CtrlBlkType *tempDxeCtrlBlk; -static char *channelType[WDTS_CHANNEL_MAX] = - { - "TX_LOW_PRI", - "TX_HIGH_PRI", - "RX_LOW_PRI", -#ifndef WLANDXE_TEST_CHANNEL_ENABLE - "RX_HIGH_PRI", -#else - "H2H_TEST_TX", - "H2H_TEST_RX" -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - }; -static wpt_packet *rx_reaped_buf[WLANDXE_MAX_REAPED_RX_FRAMES]; - -/*------------------------------------------------------------------------- - * External Function Proto Type - *-------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------- - * Local Function Proto Type - *-------------------------------------------------------------------------*/ -static wpt_status dxeRXFrameSingleBufferAlloc -( - WLANDXE_CtrlBlkType *dxeCtxt, - WLANDXE_ChannelCBType *channelEntry, - WLANDXE_DescCtrlBlkType *currentCtrlBlock -); - -static wpt_status dxeNotifySmsm -( - wpt_boolean kickDxe, - wpt_boolean ringEmpty -); - -static void dxeStartSSRTimer -( - WLANDXE_CtrlBlkType *dxeCtxt -); - -/*------------------------------------------------------------------------- - * Local Function - *-------------------------------------------------------------------------*/ -/*========================================================================== - @ Function Name - dxeChannelMonitor - - @ Description - - @ Parameters - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeChannelMonitor -( - char *monitorDescription, - WLANDXE_ChannelCBType *channelEntry, - wpt_log_data_stall_channel_type *channelLog -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - if((NULL == monitorDescription) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "INVALID Input ARG"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if(channelEntry->channelType > WDTS_CHANNEL_RX_HIGH_PRI) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "INVALID Channel type"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : HCBO %d, HCBDP 0x%x, HCBDC 0x%x,", - channelType[channelEntry->channelType], - channelEntry->headCtrlBlk->ctrlBlkOrder, - channelEntry->headCtrlBlk->linkedDescPhyAddr, - channelEntry->headCtrlBlk->linkedDesc->descCtrl.ctrl); - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : TCBO %d, TCBDP 0x%x, TCBDC 0x%x", - channelType[channelEntry->channelType], - channelEntry->tailCtrlBlk->ctrlBlkOrder, - channelEntry->tailCtrlBlk->linkedDescPhyAddr, - channelEntry->tailCtrlBlk->linkedDesc->descCtrl.ctrl); - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : FDC %d, RDC %d, TFC %d", - channelType[channelEntry->channelType], - channelEntry->numFreeDesc, - channelEntry->numRsvdDesc, - channelEntry->numTotalFrame); - - if(channelLog) - { - channelLog->numDesc = channelEntry->numDesc; - channelLog->numFreeDesc = channelEntry->numFreeDesc; - channelLog->numRsvdDesc = channelEntry->numRsvdDesc; - channelLog->headDescOrder = channelEntry->headCtrlBlk->ctrlBlkOrder; - channelLog->tailDescOrder = channelEntry->tailCtrlBlk->ctrlBlkOrder; - } - - return status; -} - -#ifdef WLANDXE_DEBUG_MEMORY_DUMP -/*========================================================================== - @ Function Name - dxeMemoryDump - - @ Description - - @ Parameters - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeMemoryDump -( - wpt_uint8 *dumpPointer, - wpt_uint32 dumpSize, - char *dumpTarget -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 numBytes = 0; - wpt_uint32 idx; - - if((NULL == dumpPointer) || - (NULL == dumpTarget)) - { - return status; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Location 0x%x, Size %d", dumpTarget, dumpPointer, dumpSize); - - numBytes = dumpSize % T_WLANDXE_MEMDUMP_BYTE_PER_LINE; - for(idx = 0; idx < dumpSize; idx++) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "0x%2x ", dumpPointer[idx]); - if(0 == ((idx + 1) % T_WLANDXE_MEMDUMP_BYTE_PER_LINE)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n"); - } - } - if(0 != numBytes) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, "\n"); - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - - return status; -} -#endif /* WLANDXE_DEBUG_MEMORY_DUMP */ - -/*========================================================================== - @ Function Name - dxeDescriptorDump - - @ Description - - @ Parameters - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -wpt_status dxeDescriptorDump -( - WLANDXE_ChannelCBType *channelEntry, - WLANDXE_DescType *targetDesc, - wpt_uint32 fragmentOrder -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "Descriptor Dump for channel %s, %d / %d fragment", - channelType[channelEntry->channelType], - fragmentOrder + 1, - channelEntry->numFragmentCurrentChain); - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "CTRL WORD 0x%x, TransferSize %d", - WLANDXE_U32_SWAP_ENDIAN(targetDesc->descCtrl.ctrl), - WLANDXE_U32_SWAP_ENDIAN(targetDesc->xfrSize)); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "SRC ADD 0x%x, DST ADD 0x%x, NEXT DESC 0x%x", - WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.srcMemAddrL), - WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.dstMemAddrL), - WLANDXE_U32_SWAP_ENDIAN(targetDesc->dxedesc.dxe_short_desc.phyNextL)); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - - return status; -} - -/*========================================================================== - @ Function Name - dxeChannelRegisterDump - - @ Description - - @ Parameters - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -wpt_status dxeChannelRegisterDump -( - WLANDXE_ChannelCBType *channelEntry, - char *dumpTarget, - wpt_log_data_stall_channel_type *channelLog -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg; - - /* Whatever RIVA power condition try to wakeup RIVA through SMSM - * This will not simply wakeup RIVA - * Just incase TX not wanted stuck, Trigger TX again */ - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - wpalSleep(10); - - if(channelEntry->channelType > WDTS_CHANNEL_RX_HIGH_PRI) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "INVALID Channel type"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr, &chDescReg); - wpalReadRegister(channelEntry->channelRegister.chDXELstDesclRegAddr, &chLDescReg); - wpalReadRegister(channelEntry->channelRegister.chDXECtrlRegAddr, &chControlReg); - wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr, &chStatusReg); - - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x", - channelType[channelEntry->channelType], - chControlReg, chStatusReg, chDescReg, chLDescReg); - - if(channelLog) - { - channelLog->ctrlRegVal = chControlReg; - channelLog->statRegVal = chStatusReg; - } - - return status; -} - -/*========================================================================== - @ Function Name - dxeChannelAllDescDump - - @ Description - Dump all DXE descriptors within assigned channe; - - @ Parameters - WLANDXE_ChannelCBType *channelEntry - - @ Return - NONE - -===========================================================================*/ -void dxeChannelAllDescDump -( - WLANDXE_ChannelCBType *channelEntry, - WDTS_ChannelType channel, - wpt_log_data_stall_channel_type *channelLog -) -{ - wpt_uint32 channelLoop; - WLANDXE_DescCtrlBlkType *targetCtrlBlk; - wpt_uint32 previousCtrlValue = 0; - wpt_uint32 previousCtrlValid = 0; - wpt_uint32 currentCtrlValid = 0; - wpt_uint32 valDescCount = 0; - wpt_uint32 invalDescCount = 0; - - targetCtrlBlk = channelEntry->headCtrlBlk; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : %d descriptor chains, head desc ctrl 0x%x", - channelType[channelEntry->channelType], - channelEntry->numDesc, - targetCtrlBlk->linkedDesc->descCtrl.ctrl); - previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl; - - if((WDTS_CHANNEL_RX_LOW_PRI == channel) || - (WDTS_CHANNEL_RX_HIGH_PRI == channel)) - { - for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++) - { - if(previousCtrlValue != targetCtrlBlk->linkedDesc->descCtrl.ctrl) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder, - targetCtrlBlk->linkedDesc->descCtrl.ctrl); - } - if(targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID) - { - valDescCount++; - } - else - { - invalDescCount++; - } - previousCtrlValue = targetCtrlBlk->linkedDesc->descCtrl.ctrl; - targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk; - } - } - else - { - /* Head Descriptor is valid or not */ - previousCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID; - targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk; - for(channelLoop = 0; channelLoop < channelEntry->numDesc; channelLoop++) - { - currentCtrlValid = targetCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID; - if(currentCtrlValid) - { - valDescCount++; - } - else - { - invalDescCount++; - } - if(currentCtrlValid != previousCtrlValid) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%5d : 0x%x", targetCtrlBlk->ctrlBlkOrder, - targetCtrlBlk->linkedDesc->descCtrl.ctrl); - } - previousCtrlValid = currentCtrlValid; - targetCtrlBlk = (WLANDXE_DescCtrlBlkType *)targetCtrlBlk->nextCtrlBlk; - } - } - - if(channelLog) - { - channelLog->numValDesc = valDescCount; - channelLog->numInvalDesc = invalDescCount; - } - - return; -} - -/*========================================================================== - @ Function Name - dxeErrChannelDebug - - @ Description - Dump channel information for which Error interrupt has occured - - @ Parameters - WLANDXE_ChannelCBType *channelCb - - @ Return - NONE - -===========================================================================*/ -void dxeErrChannelDebug -( - WLANDXE_ChannelCBType *channelCb -) -{ - wpt_log_data_stall_channel_type channelLog; - - dxeChannelMonitor("INT_ERR", channelCb, &channelLog); - dxeDescriptorDump(channelCb, channelCb->headCtrlBlk->linkedDesc, 0); - dxeChannelRegisterDump(channelCb, "INT_ERR", &channelLog); - dxeChannelAllDescDump(channelCb, channelCb->channelType, &channelLog); - wpalMemoryCopy(channelLog.channelName, - "INT_ERR", - WPT_TRPT_CHANNEL_NAME); - wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelCb->channelType); -#ifdef FEATURE_WLAN_DIAG_SUPPORT - wpalPacketStallDumpLog(); -#endif /* FEATURE_WLAN_DIAG_SUPPORT */ - - wpalFwDumpReq(17, 0, 0, 0, 0); -} -/*========================================================================== - @ Function Name - dxeTxThreadChannelDebugHandler - - @ Description - Dump TX channel information - - @ Parameters - Wwpt_msg *msgPtr - - @ Return - NONE - -===========================================================================*/ -void dxeTxThreadChannelDebugHandler -( - wpt_msg *msgPtr -) -{ - wpt_uint8 channelLoop; - wpt_log_data_stall_channel_type channelLog; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Whatever RIVA power condition try to wakeup RIVA through SMSM - * This will not simply wakeup RIVA - * Just incase TX not wanted stuck, Trigger TX again */ - for(channelLoop = 0; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++) - { - dxeChannelMonitor("******** Get Descriptor Snapshot ", - &tempDxeCtrlBlk->dxeChannel[channelLoop], - &channelLog); - dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop], - "Abnormal successive empty interrupt", - &channelLog); - dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop], - channelLoop, - &channelLog); - - wpalMemoryCopy(channelLog.channelName, - channelType[channelLoop], - WPT_TRPT_CHANNEL_NAME); - wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "================== DXE Dump End ======================"); - wpalMemoryFree(msgPtr); - -#ifdef FEATURE_WLAN_DIAG_SUPPORT - wpalPacketStallDumpLog(); -#endif /* FEATURE_WLAN_DIAG_SUPPORT */ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return; -} - -/*========================================================================== - @ Function Name - dxeRxThreadChannelDebugHandler - - @ Description - Dump RX channel information - - @ Parameters - Wwpt_msg *msgPtr - - @ Return - NONE - -===========================================================================*/ -void dxeRxThreadChannelDebugHandler -( - wpt_msg *msgPtr -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint8 channelLoop; - wpt_log_data_stall_channel_type channelLog; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Whatever RIVA power condition try to wakeup RIVA through SMSM - * This will not simply wakeup RIVA - * Just incase TX not wanted stuck, Trigger TX again */ - for(channelLoop = WDTS_CHANNEL_RX_LOW_PRI; channelLoop < WDTS_CHANNEL_MAX; channelLoop++) - { - dxeChannelMonitor("******** Get Descriptor Snapshot ", - &tempDxeCtrlBlk->dxeChannel[channelLoop], - &channelLog); - dxeChannelRegisterDump(&tempDxeCtrlBlk->dxeChannel[channelLoop], - "Abnormal successive empty interrupt", - &channelLog); - dxeChannelAllDescDump(&tempDxeCtrlBlk->dxeChannel[channelLoop], - channelLoop, &channelLog); - - wpalMemoryCopy(channelLog.channelName, - channelType[channelLoop], - WPT_TRPT_CHANNEL_NAME); - wpalPacketStallUpdateInfo(NULL, NULL, &channelLog, channelLoop); - - } - - /* Now serialise the message through Tx thread also to make sure - * no register access when RIVA is in powersave */ - /*Use the same message pointer just change the call back function */ - msgPtr->callback = dxeTxThreadChannelDebugHandler; - status = wpalPostTxMsg(WDI_GET_PAL_CTX(), - msgPtr); - if ( eWLAN_PAL_STATUS_SUCCESS != status ) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Tx thread state dump req serialize fail status=%d", - status); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return; -} - -/*========================================================================== - @ Function Name - dxeRXHealthMonitor - - @ Description - Monitoring RX channel healthy stataus - If detect any problem, try to recover - - @ Parameters - healthMonitorMsg MSG pointer. - will have low resource TX channel context - - @ Return - NONE - -===========================================================================*/ -void dxeRXHealthMonitor -( - wpt_msg *healthMonitorMsg -) -{ - WLANDXE_ChannelCBType *channelCtrlBlk; - WLANDXE_ChannelCBType *testCHCtrlBlk; - wpt_uint32 regValue; - wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg; - wpt_uint32 hwWakeLoop, chLoop; - - if(NULL == healthMonitorMsg) - { - return; - } - - /* Make wake up HW */ - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - - for(hwWakeLoop = 0; hwWakeLoop < T_WLANDXE_MAX_HW_ACCESS_WAIT; hwWakeLoop++) - { - wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, ®Value); - if(0 != regValue) - { - break; - } - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "Scheduled RX, num free BD/PDU %d, loop Count %d", - regValue, hwWakeLoop); - - for(chLoop = WDTS_CHANNEL_RX_LOW_PRI; chLoop < WDTS_CHANNEL_MAX; chLoop++) - { - testCHCtrlBlk = &tempDxeCtrlBlk->dxeChannel[chLoop]; - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXECtrlRegAddr, &chControlReg); - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEStatusRegAddr, &chStatusReg); - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, &chDescReg); - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, &chLDescReg); - - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x", - channelType[chLoop], - chControlReg, chStatusReg, chDescReg, chLDescReg, - testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl, - testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl); - - if((chControlReg & WLANDXE_DESC_CTRL_VALID) && - (chLDescReg != testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr)) - { - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, " - "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x", - channelType[chLoop], - chControlReg, chStatusReg, chDescReg, chLDescReg, - testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl, - testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : RX CH EN Descriptor Async, resync it", channelType[chLoop]); - wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, - testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr); - } - else if(!(chControlReg & WLANDXE_DESC_CTRL_VALID) && - (chDescReg != testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr)) - { - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, " - "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x", - channelType[chLoop], - chControlReg, chStatusReg, chDescReg, chLDescReg, - testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl, - testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : RX CH DIS Descriptor Async, resync it", channelType[chLoop]); - wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, - testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr); - } - } - - channelCtrlBlk = (WLANDXE_ChannelCBType *)healthMonitorMsg->pContext; - if(channelCtrlBlk->hitLowResource) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : Still Low Resource, kick DXE TX and restart timer", - channelType[channelCtrlBlk->channelType]); - /* Still Low Resource, Kick DXE again and start timer again */ - wpalTimerStart(&channelCtrlBlk->healthMonitorTimer, - T_WLANDXE_PERIODIC_HEALTH_M_TIME); - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : Out from Low resource condition, do nothing", - channelType[channelCtrlBlk->channelType]); - /* Recovered from low resource condition - * Not need to do anything */ - } - - return; -} - -/*========================================================================== - @ Function Name - dxeTXHealthMonitor - - @ Description - Monitoring TX channel healthy stataus - If detect any problem, try to recover - - @ Parameters - healthMonitorMsg MSG pointer. - will have low resource TX channel context - - @ Return - NONE - -===========================================================================*/ -void dxeTXHealthMonitor -( - wpt_msg *healthMonitorMsg -) -{ - WLANDXE_ChannelCBType *channelCtrlBlk; - WLANDXE_ChannelCBType *testCHCtrlBlk; - wpt_uint32 regValue; - wpt_uint32 chStatusReg, chControlReg, chDescReg, chLDescReg; - wpt_uint32 hwWakeLoop, chLoop; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - if(NULL == healthMonitorMsg) - { - return; - } - - /* First of all kick TX channel - * This will fix if there is any problem with SMSM state */ - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - - /* Wait till RIVA up */ - for(hwWakeLoop = 0; hwWakeLoop < T_WLANDXE_MAX_HW_ACCESS_WAIT; hwWakeLoop++) - { - wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, ®Value); - if(0 != regValue) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "num free BD/PDU %d, loop Count %d", - regValue, hwWakeLoop); - break; - } - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "Scheduled TX, num free BD/PDU %d, loop Count %d", - regValue, hwWakeLoop); - - for(chLoop = 0; chLoop < WDTS_CHANNEL_RX_LOW_PRI; chLoop++) - { - testCHCtrlBlk = &tempDxeCtrlBlk->dxeChannel[chLoop]; - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXECtrlRegAddr, &chControlReg); - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEStatusRegAddr, &chStatusReg); - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, &chDescReg); - wpalReadRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, &chLDescReg); - - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x", - channelType[chLoop], - chControlReg, chStatusReg, chDescReg, chLDescReg, - testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl, - testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl); - - if((chControlReg & WLANDXE_DESC_CTRL_VALID) && - (chLDescReg != testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr)) - { - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, " - "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x", - channelType[chLoop], - chControlReg, chStatusReg, chDescReg, chLDescReg, - testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl, - testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : TX CH EN Descriptor Async, resync it", channelType[chLoop]); - wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXELstDesclRegAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr); - } - else if(!(chControlReg & WLANDXE_DESC_CTRL_VALID) && - (chDescReg != testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr)) - { - wpalTrace(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : CCR 0x%x, CSR 0x%x, CDR 0x%x, CLDR 0x%x, " - "HCBO %d, HCBDP 0x%x, HCBDC 0x%x, TCBO %d,TCBDP 0x%x, TCBDC 0x%x", - channelType[chLoop], - chControlReg, chStatusReg, chDescReg, chLDescReg, - testCHCtrlBlk->headCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->headCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->headCtrlBlk->linkedDesc->descCtrl.ctrl, - testCHCtrlBlk->tailCtrlBlk->ctrlBlkOrder, testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDesc->descCtrl.ctrl); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : TX CH DIS Descriptor Async, resync it", channelType[chLoop]); - wpalWriteRegister(testCHCtrlBlk->channelRegister.chDXEDesclRegAddr, - testCHCtrlBlk->tailCtrlBlk->linkedDescPhyAddr); - } - } - - /* TX channel test done, test RX channels */ - channelCtrlBlk = (WLANDXE_ChannelCBType *)healthMonitorMsg->pContext; - channelCtrlBlk->healthMonitorMsg->callback = dxeRXHealthMonitor; - status = wpalPostRxMsg(WDI_GET_PAL_CTX(), - channelCtrlBlk->healthMonitorMsg); - if (eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "TX Low resource Kick DXE MSG Serialize fail status=%d", - status); - } - - return; -} - -/*========================================================================== - @ Function Name - dxeHealthMonitorTimeout - - @ Description - Health Monitor timer started when TX channel low resource condition - And if reciovered from low resource condition, timer would not fired - Timer fired means during certain time, TX CH could not be recovered - - @ Parameters - channelCtxt Low resource condition happen Channel context - - @ Return - NONE - -===========================================================================*/ -void dxeHealthMonitorTimeout -( - void *channelCtxt -) -{ - WLANDXE_ChannelCBType *channelCtrlBlk; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - if(NULL == channelCtxt) - { - return; - } - - /* Timeout Fired, DXE TX should kick on TX thread - * Serailize to TX Thread */ - channelCtrlBlk = (WLANDXE_ChannelCBType *)channelCtxt; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "%11s : Health Monitor timer expired", - channelType[channelCtrlBlk->channelType]); - - channelCtrlBlk->healthMonitorMsg->callback = dxeTXHealthMonitor; - status = wpalPostTxMsg(WDI_GET_PAL_CTX(), - channelCtrlBlk->healthMonitorMsg); - if (eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "TX Low resource Kick DXE MSG Serialize fail status=%d", - status); - } - - return; -} - -/*========================================================================== - @ Function Name - dxeCtrlBlkAlloc - - @ Description - Allocate DXE Control block - DXE control block will used by Host DXE driver only, internal structure - Will make ring linked list - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeCtrlBlkAlloc -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - unsigned int idx, fIdx; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescCtrlBlkType *freeCtrlBlk = NULL; - WLANDXE_DescCtrlBlkType *prevCtrlBlk = NULL; - WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity check */ - if((NULL == dxeCtrlBlk) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeCtrlBlkAlloc Channel Entry is not valid"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - /* Allocate pre asigned number of control blocks */ - for(idx = 0; idx < channelEntry->numDesc; idx++) - { - currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_DescCtrlBlkType)); - if(NULL == currentCtrlBlk) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeCtrlBlkOpen MemAlloc Fail for channel %d", - channelEntry->channelType); - freeCtrlBlk = channelEntry->headCtrlBlk; - for(fIdx = 0; fIdx < idx; fIdx++) - { - if(NULL == freeCtrlBlk) - { - break; - } - - nextCtrlBlk = freeCtrlBlk->nextCtrlBlk; - wpalMemoryFree((void *)freeCtrlBlk); - freeCtrlBlk = nextCtrlBlk; - } - return eWLAN_PAL_STATUS_E_FAULT; - } - - memset((wpt_uint8 *)currentCtrlBlk, 0, sizeof(WLANDXE_DescCtrlBlkType)); - /* Initialize common elements first */ - currentCtrlBlk->xfrFrame = NULL; - currentCtrlBlk->linkedDesc = NULL; - currentCtrlBlk->linkedDescPhyAddr = 0; - currentCtrlBlk->ctrlBlkOrder = idx; - - /* This is the first control block allocated - * Next Control block is not allocated yet - * head and tail must be first control block */ - if(0 == idx) - { - currentCtrlBlk->nextCtrlBlk = NULL; - channelEntry->headCtrlBlk = currentCtrlBlk; - channelEntry->tailCtrlBlk = currentCtrlBlk; - } - /* This is not first, not last control block - * previous control block may has next linked block */ - else if((0 < idx) && (idx < (channelEntry->numDesc - 1))) - { - prevCtrlBlk->nextCtrlBlk = currentCtrlBlk; - } - /* This is last control blocl - * next control block for the last control block is head, first control block - * then whole linked list made RING */ - else if((channelEntry->numDesc - 1) == idx) - { - prevCtrlBlk->nextCtrlBlk = currentCtrlBlk; - currentCtrlBlk->nextCtrlBlk = channelEntry->headCtrlBlk; - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeCtrlBlkOpen Invalid Ctrl Blk location %d", - channelEntry->channelType); - wpalMemoryFree(currentCtrlBlk); - return eWLAN_PAL_STATUS_E_FAULT; - } - - prevCtrlBlk = currentCtrlBlk; - channelEntry->numFreeDesc++; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,"%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeDescLinkAlloc - - @ Description - Allocate DXE descriptor - DXE descriptor will be shared by DXE host driver and RIVA DXE engine - Will make RING linked list - Will be linked with Descriptor control block one by one - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeDescAllocAndLink -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_DescType *currentDesc = NULL; - WLANDXE_DescType *prevDesc = NULL; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - unsigned int idx; - void *physAddressAlloc = NULL; - wpt_uint32 physAddress; -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - WLANDXE_ChannelCBType *testTXChannelCB = &dxeCtrlBlk->dxeChannel[WDTS_CHANNEL_H2H_TEST_TX]; - WLANDXE_DescCtrlBlkType *currDescCtrlBlk = testTXChannelCB->headCtrlBlk; -#endif /* WLANDXE_TEST_CHANNEL_ENABLE*/ - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity Check */ - if((NULL == dxeCtrlBlk) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeDescLinkAlloc Channel Entry is not valid"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - currentCtrlBlk = channelEntry->headCtrlBlk; - -#if !(defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE)) - /* allocate all DXE descriptors for this channel in one chunk */ - channelEntry->descriptorAllocation = (WLANDXE_DescType *) - wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType)*channelEntry->numDesc, - &physAddressAlloc); - physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc); - if(NULL == channelEntry->descriptorAllocation) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeDescLinkAlloc Descriptor Alloc Fail"); - return eWLAN_PAL_STATUS_E_RESOURCES; - } - currentDesc = channelEntry->descriptorAllocation; -#endif - - /* Allocate pre asigned number of descriptor */ - for(idx = 0; idx < channelEntry->numDesc; idx++) - { -#ifndef FEATURE_R33D -#ifndef WLANDXE_TEST_CHANNEL_ENABLE - // descriptors were allocated in a chunk -- use the current one - memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType)); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "Allocated Descriptor VA %p, PA %p", currentDesc, physAddressAlloc); -#else - if(WDTS_CHANNEL_H2H_TEST_RX != channelEntry->channelType) - { - // allocate a descriptor - currentDesc = (WLANDXE_DescType *)wpalDmaMemoryAllocate(sizeof(WLANDXE_DescType), - &physAddressAlloc); - memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType)); - physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc); - } - else - { - currentDesc = currDescCtrlBlk->linkedDesc; - physAddress = currDescCtrlBlk->linkedDescPhyAddr; - currDescCtrlBlk = (WLANDXE_DescCtrlBlkType *)currDescCtrlBlk->nextCtrlBlk; - } -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ -#else -#ifndef WLANDXE_TEST_CHANNEL_ENABLE - currentDesc = (WLANDXE_DescType *)wpalAcpuDdrDxeDescMemoryAllocate(&physAddressAlloc); - memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType)); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "Allocated Descriptor VA %p, PA %p", currentDesc, physAddressAlloc); - physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc); -#else - if(WDTS_CHANNEL_H2H_TEST_RX != channelEntry->channelType) - { - currentDesc = (WLANDXE_DescType *)wpalAcpuDdrDxeDescMemoryAllocate(&physAddressAlloc); - memset((wpt_uint8 *)currentDesc, 0, sizeof(WLANDXE_DescType)); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "Allocated Descriptor VA %p, PA %p", currentDesc, physAddressAlloc); - physAddress = (wpt_uint32) (uintptr_t)(physAddressAlloc); - } - else - { - currentDesc = currDescCtrlBlk->linkedDesc; - physAddress = currDescCtrlBlk->linkedDescPhyAddr; - currDescCtrlBlk = (WLANDXE_DescCtrlBlkType *)currDescCtrlBlk->nextCtrlBlk; - } -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ -#endif /* FEATURE_R33D */ - if(NULL == currentDesc) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeDescLinkAlloc MemAlloc Fail for channel %d", - channelEntry->channelType); - return eWLAN_PAL_STATUS_E_FAULT; - } - - currentCtrlBlk->linkedDesc = currentDesc; - currentCtrlBlk->linkedDescPhyAddr = physAddress; - /* First descriptor, next none - * descriptor bottom location is first descriptor address */ - if(0 == idx) - { - currentDesc->dxedesc.dxe_short_desc.phyNextL = 0; - channelEntry->DescBottomLoc = currentDesc; - channelEntry->descBottomLocPhyAddr = physAddress; - } - /* Not first, not last descriptor - * may make link for previous descriptor with current descriptor - * ENDIAN SWAP needed ????? */ - else if((0 < idx) && (idx < (channelEntry->numDesc - 1))) - { - prevDesc->dxedesc.dxe_short_desc.phyNextL = - WLANDXE_U32_SWAP_ENDIAN(physAddress); - } - /* Last descriptor - * make a ring by asign next pointer as first descriptor - * ENDIAN SWAP NEEDED ??? */ - else if((channelEntry->numDesc - 1) == idx) - { - prevDesc->dxedesc.dxe_short_desc.phyNextL = - WLANDXE_U32_SWAP_ENDIAN(physAddress); - currentDesc->dxedesc.dxe_short_desc.phyNextL = - WLANDXE_U32_SWAP_ENDIAN(channelEntry->headCtrlBlk->linkedDescPhyAddr); - } - - /* If Current Channel is RX channel PAL Packet and OS packet buffer should be - * Pre allocated and physical address must be assigned into - * Corresponding DXE Descriptor */ -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_H2H_TEST_RX == channelEntry->channelType)) -#else - if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - { - status = dxeRXFrameSingleBufferAlloc(dxeCtrlBlk, - channelEntry, - currentCtrlBlk); - if( !WLAN_PAL_IS_STATUS_SUCCESS(status) ) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeDescLinkAlloc RX Buffer Alloc Fail for channel %d", - channelEntry->channelType); - return status; - } - --channelEntry->numFreeDesc; - } - - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write; - currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = channelEntry->extraConfig.refWQ_swapped; - } - else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read; - currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = channelEntry->extraConfig.refWQ_swapped; - } - else - { - /* Just in case. H2H Test RX channel, do nothing - * By Definition this must not happen */ - } - - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - prevDesc = currentDesc; - -#ifndef FEATURE_R33D -#ifndef WLANDXE_TEST_CHANNEL_ENABLE - // advance to the next pre-allocated descriptor in the chunk - currentDesc++; - physAddress = (physAddress + sizeof(WLANDXE_DescType)); -#endif -#endif - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - - @ Description - - @ Parameters - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeSetInterruptPath -( - WLANDXE_CtrlBlkType *dxeCtrlBlk -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 interruptPath = 0; - wpt_uint32 idx; - WLANDXE_ChannelCBType *channelEntry = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++) - { - channelEntry = &dxeCtrlBlk->dxeChannel[idx]; -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_H2H_TEST_TX == channelEntry->channelType)) -#else - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - { - interruptPath |= (1 << channelEntry->assignedDMAChannel); - } - else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - interruptPath |= (1 << (channelEntry->assignedDMAChannel + 16)); - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "H2H TEST RX???? %d", channelEntry->channelType); - } - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "Interrupt Path Must be 0x%x", interruptPath); - dxeCtrlBlk->interruptPath = interruptPath; - wpalWriteRegister(WLANDXE_CCU_DXE_INT_SELECT, interruptPath); - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeEngineCoreStart - - @ Description - Trigger to start RIVA DXE Hardware - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeEngineCoreStart -( - WLANDXE_CtrlBlkType *dxeCtrlBlk -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 registerData = 0; - wpt_uint8 readRetry; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); -#ifdef WCN_PRONTO - /* Read default */ - wpalReadRegister(WLANDXE_CCU_SOFT_RESET, ®isterData); - registerData |= WLANDXE_DMA_CCU_DXE_RESET_MASK; - - /* Make reset */ - wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData); - - /* Clear reset */ - registerData &= ~WLANDXE_DMA_CCU_DXE_RESET_MASK; - wpalWriteRegister(WLANDXE_CCU_SOFT_RESET, registerData); -#else - /* START This core init is not needed for the integrated system */ - /* Reset First */ - registerData = WLANDXE_DMA_CSR_RESET_MASK; - wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS, - registerData); -#endif /* WCN_PRONTO */ - for(readRetry = 0; readRetry < WLANDXE_CSR_MAX_READ_COUNT; readRetry++) - { - wpalWriteRegister(WALNDEX_DMA_CSR_ADDRESS, - WLANDXE_CSR_DEFAULT_ENABLE); - wpalReadRegister(WALNDEX_DMA_CSR_ADDRESS, ®isterData); - if(!(registerData & WLANDXE_DMA_CSR_EN_MASK)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "%s CSR 0x%x, count %d", - __func__, registerData, readRetry); - /* CSR is not valid value, re-try to write */ - wpalBusyWait(WLANDXE_CSR_NEXT_READ_WAIT); - } - else - { - break; - } - } - if(WLANDXE_CSR_MAX_READ_COUNT == readRetry) - { - /* MAX wait, still cannot write correct value - * Panic device */ - wpalDevicePanic(); - } - /* Is This needed? - * Not sure, revisit with integrated system */ - /* END This core init is not needed for the integrated system */ - - dxeSetInterruptPath(dxeCtrlBlk); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeChannelInitProgram - - @ Description - Program RIVA DXE engine register with initial value - What must be programmed - - Source Address (SADRL, chDXESadrlRegAddr) - - Destination address (DADRL, chDXEDadrlRegAddr) - - Next Descriptor address (DESCL, chDXEDesclRegAddr) - - current descriptor address (LST_DESCL, chDXELstDesclRegAddr) - - Not need to program now - - Channel Control register (CH_CTRL, chDXECtrlRegAddr) - TX : Have to program to trigger send out frame - RX : programmed by DXE engine - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeChannelInitProgram -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 idx; - WLANDXE_DescType *currentDesc = NULL; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity Check */ - if((NULL == dxeCtrlBlk) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Channel Entry is not valid"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - /* Program Source address and destination adderss */ - if(!channelEntry->channelConfig.useShortDescFmt) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Long Descriptor not support yet"); - return eWLAN_PAL_STATUS_E_FAILURE; - } - - /* Common register area */ - /* Next linked list Descriptor pointer */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr, - channelEntry->headCtrlBlk->linkedDescPhyAddr); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Write DESC Address register fail"); - return status; - } - - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - /* Program default registers */ - /* TX DMA channel, DMA destination address is work Q */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr, - channelEntry->channelConfig.refWQ); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Write TX DAddress register fail"); - return status; - } - } - else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - /* Initialize Descriptor control Word First */ - currentCtrlBlk = channelEntry->headCtrlBlk; - for(idx = 0; idx < channelEntry->channelConfig.nDescs; idx++) - { - currentDesc = currentCtrlBlk->linkedDesc; - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - } - - /* RX DMA channel, DMA source address is work Q */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr, - channelEntry->channelConfig.refWQ); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Write RX SAddress WQ register fail"); - return status; - } - - /* RX DMA channel, Program pre allocated destination Address */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr, - WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Write RX DAddress register fail"); - return status; - } - - /* RX Channels, default Control registers MUST BE ENABLED */ - wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr, - channelEntry->extraConfig.chan_mask); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Write RX Control register fail"); - return status; - } - } - else - { - /* H2H test channel, not use work Q */ - /* Program pre allocated destination Address */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr, - WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelInitProgram Write RX DAddress register fail"); - return status; - } - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - - -/*========================================================================== - @ Function Name - dxeChannelStart - - @ Description - Start Specific Channel - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeChannelStart -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 regValue = 0; - wpt_uint32 intMaskVal = 0; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - channelEntry->extraConfig.chEnabled = eWLAN_PAL_TRUE; - channelEntry->extraConfig.chConfigured = eWLAN_PAL_TRUE; - - /* Enable individual channel - * not to break current channel setup, first read register */ - status = wpalReadRegister(WALNDEX_DMA_CH_EN_ADDRESS, - ®Value); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStart Read Channel Enable register fail"); - return status; - } - - /* Enable Channel specific Interrupt */ - status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, - &intMaskVal); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStart Read INT_MASK register fail"); - return status; - } - intMaskVal |= channelEntry->extraConfig.intMask; - status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, - intMaskVal); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStart Write INT_MASK register fail"); - return status; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeChannelStop - - @ Description - Stop Specific Channel - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeChannelStop -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 intMaskVal = 0; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if((NULL == dxeCtrlBlk) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStop Invalid arg input"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if ( (channelEntry->extraConfig.chEnabled != eWLAN_PAL_TRUE) || - (channelEntry->extraConfig.chConfigured != eWLAN_PAL_TRUE)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStop channels are not enabled "); - return status; - } - /* Maskout interrupt */ - status = wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, - &intMaskVal); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStop Read INT_MASK register fail"); - return status; - } - intMaskVal ^= channelEntry->extraConfig.intMask; - status = wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, - intMaskVal); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStop Write INT_MASK register fail"); - return status; - } - - channelEntry->extraConfig.chEnabled = eWLAN_PAL_FALSE; - - /* Stop Channel ??? */ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeChannelClose - - @ Description - Close Specific Channel - Free pre allocated RX frame buffer if RX channel - Free DXE descriptor for each channel - Free Descriptor control block for each channel - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeChannelClose -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 idx; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL; - WLANDXE_DescType *currentDescriptor = NULL; - WLANDXE_DescType *nextDescriptor = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if((NULL == dxeCtrlBlk) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelStop Invalid arg input"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - currentCtrlBlk = channelEntry->headCtrlBlk; - if(NULL != currentCtrlBlk) - { - currentDescriptor = currentCtrlBlk->linkedDesc; - for(idx = 0; idx < channelEntry->numDesc; idx++) - { - if (idx + 1 != channelEntry->numDesc) - { - nextCtrlBlk = currentCtrlBlk->nextCtrlBlk; - nextDescriptor = nextCtrlBlk->linkedDesc; - } - else - { - nextCtrlBlk = NULL; - nextDescriptor = NULL; - } - if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - if (NULL != currentCtrlBlk->xfrFrame) - { - wpalUnlockPacket(currentCtrlBlk->xfrFrame); - wpalPacketFree(currentCtrlBlk->xfrFrame); - } - } - /* - * It is the responsibility of DXE to walk through the - * descriptor chain and unlock any pending packets (if - * locked). - */ - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - if((NULL != currentCtrlBlk->xfrFrame) && - (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame))) - { - wpalUnlockPacket(currentCtrlBlk->xfrFrame); - wpalPacketFree(currentCtrlBlk->xfrFrame); - } - } -#if (defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE)) - // descriptors allocated individually so free them individually - wpalDmaMemoryFree(currentDescriptor); -#endif - wpalMemoryFree(currentCtrlBlk); - - currentCtrlBlk = nextCtrlBlk; - currentDescriptor = nextDescriptor; - if(NULL == currentCtrlBlk) - { - /* Already reach last of the control block - * Not need to process anymore, break */ - break; - } - } - } - -#if !(defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE)) - // descriptors were allocated as a single chunk so free the chunk - if(NULL != channelEntry->descriptorAllocation) - { - wpalDmaMemoryFree(channelEntry->descriptorAllocation); - } -#endif - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeChannelCleanInt - - @ Description - Clean up interrupt from RIVA HW - After Host finish to handle interrupt, interrupt signal must be cleaned up - Otherwise next interrupt will not be generated - - @ Parameters - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - wpt_uint32 *chStat - Channel Status register value - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeChannelCleanInt -( - WLANDXE_ChannelCBType *channelEntry, - wpt_uint32 *chStat -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Read Channel Status Register to know why INT Happen */ - status = wpalReadRegister(channelEntry->channelRegister.chDXEStatusRegAddr, - chStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelCleanInt Read CH STAT register fail"); - return eWLAN_PAL_STATUS_E_FAULT; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Channel INT Clean, Status 0x%x", - channelType[channelEntry->channelType], *chStat); - - /* Clean up all the INT within this channel */ - status = wpalWriteRegister(WLANDXE_INT_CLR_ADDRESS, - (1 << channelEntry->assignedDMAChannel)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelCleanInt Write CH Clean register fail"); - return eWLAN_PAL_STATUS_E_FAULT; - } - - /* Clean up Error INT Bit */ - if(WLANDXE_CH_STAT_INT_ERR_MASK & *chStat) - { - status = wpalWriteRegister(WLANDXE_INT_ERR_CLR_ADDRESS, - (1 << channelEntry->assignedDMAChannel)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelCleanInt Read CH STAT register fail"); - return eWLAN_PAL_STATUS_E_FAULT; - } - } - - /* Clean up DONE INT Bit */ - if(WLANDXE_CH_STAT_INT_DONE_MASK & *chStat) - { - status = wpalWriteRegister(WLANDXE_INT_DONE_CLR_ADDRESS, - (1 << channelEntry->assignedDMAChannel)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelCleanInt Read CH STAT register fail"); - return eWLAN_PAL_STATUS_E_FAULT; - } - } - - /* Clean up ED INT Bit */ - if(WLANDXE_CH_STAT_INT_ED_MASK & *chStat) - { - status = wpalWriteRegister(WLANDXE_INT_ED_CLR_ADDRESS, - (1 << channelEntry->assignedDMAChannel)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelCleanInt Read CH STAT register fail"); - return eWLAN_PAL_STATUS_E_FAULT; - } - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeRXResourceAvailableTimerExpHandler - - @ Description - During pre-set timeperiod, if free available RX buffer is not allocated - Trigger Driver re-loading to recover RX dead end - - @ Parameters - v_VOID_t *usrData - DXE context - - @ Return - NONE - -===========================================================================*/ -void dxeRXResourceAvailableTimerExpHandler -( - void *usrData -) -{ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "RX Low resource, Durign wait time period %d, RX resource not allocated", - T_WLANDXE_MAX_RX_PACKET_WAIT); - wpalWlanReload(); - - if (NULL != usrData) - dxeStartSSRTimer((WLANDXE_CtrlBlkType *)usrData); - - return; -} - -/*========================================================================== - @ Function Name - dxeStartSSRTimer - - @ Description - Start the dxeSSRTimer after issuing the FIQ to restart the WCN chip, - this makes sure that if the chip does not respond to the FIQ within - the timeout period the dxeSSRTimer expiration handler will take the - appropriate action. - - @ Parameters - NONE - - @ Return - NONE - -===========================================================================*/ -static void dxeStartSSRTimer -( - WLANDXE_CtrlBlkType *dxeCtxt -) -{ - if(VOS_TIMER_STATE_RUNNING != - wpalTimerGetCurStatus(&dxeCtxt->dxeSSRTimer)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%s: Starting SSR Timer",__func__); - wpalTimerStart(&dxeCtxt->dxeSSRTimer, - T_WLANDXE_SSR_TIMEOUT); - } -} - -/*========================================================================== - @ Function Name - dxeSSRTimerExpHandler - - @ Description - Issue an explicit subsystem restart of the wcnss subsystem if the - WCN chip does not respond to the FIQ within the timeout period - - @ Parameters - v_VOID_t *usrData - - @ Return - NONE - -===========================================================================*/ -void dxeSSRTimerExpHandler -( - void *usrData -) -{ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "DXE not shutdown %d ms after FIQ!! Issue SSR", - T_WLANDXE_SSR_TIMEOUT); - wpalRivaSubystemRestart(); - - return; -} - -/*========================================================================== - @ Function Name - dxeRXPacketAvailableCB - - @ Description - If RX frame handler encounts RX buffer pool empty condition, - DXE RX handle loop will be blocked till get available RX buffer pool. - When new RX buffer pool available, Packet available CB function will - be called. - - @ Parameters - wpt_packet *freePacket - Newly allocated RX buffer - v_VOID_t *usrData - DXE context - - @ Return - NONE - -===========================================================================*/ -void dxeRXPacketAvailableCB -( - wpt_packet *freePacket, - v_VOID_t *usrData -) -{ - WLANDXE_CtrlBlkType *dxeCtxt = NULL; - wpt_status status; - - /* Simple Sanity */ - if((NULL == freePacket) || (NULL == usrData)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "Get Free RX Buffer fail, Critical Error"); - HDXE_ASSERT(0); - return; - } - - dxeCtxt = (WLANDXE_CtrlBlkType *)usrData; - - if(WLANDXE_CTXT_COOKIE != dxeCtxt->dxeCookie) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "DXE Context data corrupted, Critical Error"); - HDXE_ASSERT(0); - return; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "DXE RX packet available, post MSG to RX Thread"); - - dxeCtxt->freeRXPacket = freePacket; - - /* Serialize RX Packet Available message upon RX thread */ - if (NULL == dxeCtxt->rxPktAvailMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "DXE NULL pkt"); - HDXE_ASSERT(0); - return; - } - status = wpalPostRxMsg(WDI_GET_PAL_CTX(), - dxeCtxt->rxPktAvailMsg); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "dxeRXPacketAvailableCB serialize fail"); - } - - return; -} - -/*========================================================================== - @ Function Name - dxeRXFrameSingleBufferAlloc - - @ Description - Allocate Platform packet buffer to prepare RX frame - RX frame memory space must be pre allocted and must be asigned to - descriptor - then whenever DMA engine want to tranfer frame from BMU, - buffer must be ready - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - WLANDXE_DescCtrlBlkType currentCtrlBlock - current control block which have to be asigned - frame buffer - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeRXFrameSingleBufferAlloc -( - WLANDXE_CtrlBlkType *dxeCtxt, - WLANDXE_ChannelCBType *channelEntry, - WLANDXE_DescCtrlBlkType *currentCtrlBlock -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_packet *currentPalPacketBuffer = NULL; - WLANDXE_DescType *currentDesc = NULL; -#ifdef FEATURE_R33D - wpt_uint32 virtualAddressPCIe; - wpt_uint32 physicalAddressPCIe; -#else - wpt_iterator iterator; - wpt_uint32 allocatedSize = 0; - void *physAddress = NULL; -#endif /* FEATURE_R33D */ - - - currentDesc = currentCtrlBlock->linkedDesc; - - if(currentDesc->descCtrl.valid) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "This Descriptor is valid, Do not refill"); - return eWLAN_PAL_STATUS_E_EXISTS; - } - - /* First check if a packet pointer has already been provided by a previously - invoked Rx packet available callback. If so use that packet. */ - if(dxeCtxt->rxPalPacketUnavailable && (NULL != dxeCtxt->freeRXPacket)) - { - currentPalPacketBuffer = dxeCtxt->freeRXPacket; - dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_FALSE; - dxeCtxt->freeRXPacket = NULL; - } - else if(!dxeCtxt->rxPalPacketUnavailable) - { - /* Allocate platform Packet buffer and OS Frame Buffer at here */ - currentPalPacketBuffer = wpalPacketAlloc(eWLAN_PAL_PKT_TYPE_RX_RAW, - WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE, - dxeRXPacketAvailableCB, - (void *)dxeCtxt); - - if(NULL == currentPalPacketBuffer) - { - dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_TRUE; - /* Out of RX free buffer, - * Start timer to recover from RX dead end */ - if(VOS_TIMER_STATE_RUNNING != - wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "RX Low resource, wait available resource"); - wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer, - T_WLANDXE_MAX_RX_PACKET_WAIT); - } - } - } - - if(NULL == currentPalPacketBuffer) - { - return eWLAN_PAL_STATUS_E_RESOURCES; - } - - currentCtrlBlock->xfrFrame = currentPalPacketBuffer; - currentPalPacketBuffer->pktType = eWLAN_PAL_PKT_TYPE_RX_RAW; - currentPalPacketBuffer->pBD = NULL; - currentPalPacketBuffer->pBDPhys = NULL; - currentPalPacketBuffer->BDLength = 0; -#ifdef FEATURE_R33D - status = wpalAllocateShadowRxFrame(currentPalPacketBuffer, - &physicalAddressPCIe, - &virtualAddressPCIe); - if((0 == physicalAddressPCIe) || (0 = virtualAddressPCIe)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, - "RX NULL Shadow Memory"); - HDXE_ASSERT(0); - return eWLAN_PAL_STATUS_E_FAULT; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, - "RX Shadow Memory Va 0x%x, Pa 0x%x", - virtualAddressPCIe, physicalAddressPCIe); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameBufferAlloc Shadow Mem Alloc fail"); - return status; - } - currentCtrlBlock->shadowBufferVa = virtualAddressPCIe; - currentPalPacketBuffer->pBDPhys = (void *)physicalAddressPCIe; - memset((wpt_uint8 *)currentCtrlBlock->shadowBufferVa, 0, WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE); -#else - status = wpalLockPacketForTransfer(currentPalPacketBuffer); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameBufferAlloc unable to lock packet"); - return status; - } - - /* Init iterator to get physical os buffer address */ - status = wpalIteratorInit(&iterator, currentPalPacketBuffer); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameBufferAlloc iterator init fail"); - return status; - } - status = wpalIteratorNext(&iterator, - currentPalPacketBuffer, - &physAddress, - &allocatedSize); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameBufferAlloc iterator Get Next pointer fail"); - return status; - } - currentPalPacketBuffer->pBDPhys = physAddress; -#endif /* FEATURE_R33D */ - - /* DXE descriptor must have SWAPPED addres in it's structure - * !!! SWAPPED !!! */ - currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = - WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)currentPalPacketBuffer->pBDPhys); - - return status; -} - -/*========================================================================== - @ Function Name - dxeRXFrameRefillRing - - @ Description - Allocate Platform packet buffers to try to fill up the DXE Rx ring - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeRXFrameRefillRing -( - WLANDXE_CtrlBlkType *dxeCtxt, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = channelEntry->tailCtrlBlk; - WLANDXE_DescType *currentDesc = NULL; - - while(channelEntry->numFreeDesc > 0) - { - /* Current Control block is free - * and associated frame buffer is not linked with control block anymore - * allocate new frame buffer for current control block */ - status = dxeRXFrameSingleBufferAlloc(dxeCtxt, - channelEntry, - currentCtrlBlk); - - if((eWLAN_PAL_STATUS_SUCCESS != status) && - (eWLAN_PAL_STATUS_E_EXISTS != status)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "dxeRXFrameRefillRing, out of RX buffer pool, break here"); - break; - } - - if(eWLAN_PAL_STATUS_E_EXISTS == status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameRefillRing, Descriptor Non-Empry"); - } - - currentDesc = currentCtrlBlk->linkedDesc; - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read; - - /* Issue a dummy read from the DXE descriptor DDR location to ensure - that any posted writes are reflected in memory before DXE looks at - the descriptor. */ - if(channelEntry->extraConfig.cw_ctrl_read != currentDesc->descCtrl.ctrl) - { - //HDXE_ASSERT(0); - } - - /* Kick off the DXE ring, if not in any power save mode */ - if(WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState) - { - wpalWriteRegister(WALNDEX_DMA_ENCH_ADDRESS, - 1 << channelEntry->assignedDMAChannel); - } - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - if(eWLAN_PAL_STATUS_E_EXISTS != status) - { - --channelEntry->numFreeDesc; - } - } - - channelEntry->tailCtrlBlk = currentCtrlBlk; - - return status; -} - -/*========================================================================== - @ Function Name - dxeRXFrameRouteUpperLayer - - @ Description - Test DXE descriptors and if any RX frame pending within RING, - Route to upper layer - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - @ Return - < 0 Any error happen - 0 No frame pulled from RX RING - int number of RX frames pulled from RX ring - -===========================================================================*/ -static wpt_int32 dxeRXFrameRouteUpperLayer -( - WLANDXE_CtrlBlkType *dxeCtxt, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescType *currentDesc = NULL; - wpt_uint32 descCtrl, frameCount = 0, i; - wpt_int32 ret_val = -1; - - currentCtrlBlk = channelEntry->headCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - - /* Descriptoe should be SWAPPED ???? */ - descCtrl = currentDesc->descCtrl.ctrl; - - /* Get frames while VALID bit is not set (DMA complete) and a data - * associated with it */ - while(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID) && - (eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)) && - (currentCtrlBlk->xfrFrame->pInternalData != NULL) && - (frameCount < WLANDXE_MAX_REAPED_RX_FRAMES) ) - { - channelEntry->numTotalFrame++; - channelEntry->numFreeDesc++; -#ifdef FEATURE_R33D - /* Transfer Size should be */ - currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE); - status = wpalPrepareRxFrame(¤tCtrlBlk->xfrFrame, - (wpt_uint32)currentCtrlBlk->xfrFrame->pBDPhys, - currentCtrlBlk->shadowBufferVa, - WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReady Prepare RX Frame fail"); - return ret_val; - } - status = wpalFreeRxFrame(currentCtrlBlk->shadowBufferVa); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReady Free Shadow RX Frame fail"); - return ret_val; - } - -#else /* FEATURE_R33D */ - status = wpalUnlockPacket(currentCtrlBlk->xfrFrame); - if (eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReady unable to unlock packet"); - return ret_val; - } -#endif /* FEATURE_R33D */ - /* This Descriptor is valid, so linked Control block is also valid - * Linked Control block has pre allocated packet buffer - * So, just let upper layer knows preallocated frame pointer will be OK */ - /* Reap Rx frames */ - rx_reaped_buf[frameCount] = currentCtrlBlk->xfrFrame; - frameCount++; - currentCtrlBlk->xfrFrame = NULL; - - /* Now try to refill the ring with empty Rx buffers to keep DXE busy */ - dxeRXFrameRefillRing(dxeCtxt, channelEntry); - - /* Test next contorl block - * if valid, this control block also has new RX frame must be handled */ - currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - descCtrl = currentDesc->descCtrl.ctrl; - } - - /* Update head control block - * current control block's valid bit was 0 - * next trial first control block must be current control block */ - channelEntry->headCtrlBlk = currentCtrlBlk; - - /* Deliver all the reaped RX frames to upper layers */ - i = 0; - while(i < frameCount) - { - dxeCtxt->rxReadyCB(dxeCtxt->clientCtxt, rx_reaped_buf[i], channelEntry->channelType); - i++; - } - - return frameCount; -} - -/*========================================================================== - @ Function Name - dxeRXFrameReady - - @ Description - Pop frame from descriptor and route frame to upper transport layer - Assign new platform packet buffer into used descriptor - Actual frame pop and resource realloc - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeRXFrameReady -( - WLANDXE_CtrlBlkType *dxeCtxt, - WLANDXE_ChannelCBType *channelEntry, - wpt_uint32 chStat -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescType *currentDesc = NULL; - wpt_uint32 descCtrl; - wpt_int32 frameCount = 0; - - wpt_uint32 descLoop; - wpt_uint32 invalidatedFound = 0; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity Check */ - if((NULL == dxeCtxt) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReady Channel Entry is not valid"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry); - - if(0 > frameCount) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReady RX frame route fail"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if((0 == frameCount) && - ((WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState) || - (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState))) - { - /* None of the frame handled and CH is not enabled - * RX CH wrap around happen and No RX free frame - * RX side should wait till new free frame available in the pool - * Do not try reload driver at here*/ - if(!(chStat & WLANDXE_CH_CTRL_EN_MASK)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "dxeRXFrameReady %s RING Wrapped, RX Free Low 0x%x", - channelType[channelEntry->channelType], chStat); - /* This is not empty interrupt case - * If handle this as empty interrupt, false SSR might be issued - * Frame count '1' is dummy frame count to avoid SSR */ - channelEntry->numFragmentCurrentChain = 1; - return eWLAN_PAL_STATUS_SUCCESS; - } - - currentCtrlBlk = channelEntry->headCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - descCtrl = currentDesc->descCtrl.ctrl; - - if(WLANDXE_POWER_STATE_BMPS != dxeCtxt->hostPowerState) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "RX ISR called but no frame handled PWS %d, channel %s", - (int)dxeCtxt->hostPowerState, - channelType[channelEntry->channelType]); - } - - /* Current interupt empty and previous interrupt also empty - * detected successive empty interrupt - * or first interrupt empty, this should not happen */ - if(0 == channelEntry->numFragmentCurrentChain) - { - dxeChannelMonitor("RX Ready", channelEntry, NULL); - dxeDescriptorDump(channelEntry, channelEntry->headCtrlBlk->linkedDesc, 0); - dxeChannelRegisterDump(channelEntry, "RX successive empty interrupt", NULL); - dxeChannelAllDescDump(channelEntry, channelEntry->channelType, NULL); - /* Abnormal interrupt detected, try to find not validated descriptor */ - for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++) - { - if(!(WLANDXE_U32_SWAP_ENDIAN(descCtrl) & WLANDXE_DESC_CTRL_VALID)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "Found Invalidated Descriptor %d", (int)descLoop); - if(eWLAN_PAL_STATUS_SUCCESS == wpalIsPacketLocked(currentCtrlBlk->xfrFrame)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "Packet locked, Resync Host and HW"); - channelEntry->headCtrlBlk = currentCtrlBlk; - invalidatedFound = 1; - break; - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "Packet Not Locked, cannot transfer frame"); - } - } - currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)currentCtrlBlk->nextCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - descCtrl = currentDesc->descCtrl.ctrl; - } - - /* Invalidated descriptor found, and that is not head descriptor - * This means HW/SW descriptor miss match happen, and we may recover with just resync - * Try re-sync here */ - if((invalidatedFound) && (0 != descLoop)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Found New Sync location with HW, handle frames from there"); - frameCount = dxeRXFrameRouteUpperLayer(dxeCtxt, channelEntry); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "re-sync routed %d frames to upper layer", (int)frameCount); - channelEntry->numFragmentCurrentChain = frameCount; - } - /* Successive Empty interrupt - * But this case, first descriptor also invalidated, then it means head descriptor - * is linked with already handled RX frame, then could not unlock RX frame - * This is just Out of RX buffer pool, not need to anything here */ - else if((invalidatedFound) && (0 == descLoop)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Out of RX Low resource, and INT came in, do nothing till get RX resource"); - } - /* Critical error, reload driver */ - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Could not found invalidated descriptor"); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "RX successive empty interrupt, Could not find invalidated DESC reload driver"); - dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE; - wpalWlanReload(); - dxeStartSSRTimer(dxeCtxt); - } - } - } - channelEntry->numFragmentCurrentChain = frameCount; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeNotifySmsm - - @ Description: Notify SMSM to start DXE engine and/or condition of Tx ring - buffer - - @ Parameters - - @ Return - wpt_status - -===========================================================================*/ -static wpt_status dxeNotifySmsm -( - wpt_boolean kickDxe, - wpt_boolean ringEmpty -) -{ - wpt_uint32 clrSt = 0; - wpt_uint32 setSt = 0; - - if(kickDxe) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "Kick off DXE"); - - if(tempDxeCtrlBlk->lastKickOffDxe == 0) - { - setSt |= WPAL_SMSM_WLAN_TX_ENABLE; - tempDxeCtrlBlk->lastKickOffDxe = 1; - } - else if(tempDxeCtrlBlk->lastKickOffDxe == 1) - { - clrSt |= WPAL_SMSM_WLAN_TX_ENABLE; - tempDxeCtrlBlk->lastKickOffDxe = 0; - } - else - { - HDXE_ASSERT(0); - } - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "no need to kick off DXE"); - } - - if(ringEmpty) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Empty"); - clrSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY; - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "SMSM Tx Ring Not Empty"); - setSt |= WPAL_SMSM_WLAN_TX_RINGS_EMPTY; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, "C%x S%x", clrSt, setSt); - - wpalNotifySmsm(clrSt, setSt); - - return eWLAN_PAL_STATUS_SUCCESS; -} - -/*========================================================================== - @ Function Name - dxePsComplete - - @ Description: Utility function to check the resv desc to deside if we can - get into Power Save mode now - - @ Parameters - - @ Return - None - -===========================================================================*/ -static void dxePsComplete(WLANDXE_CtrlBlkType *dxeCtxt, wpt_boolean intr_based) -{ - if( dxeCtxt->hostPowerState == WLANDXE_POWER_STATE_FULL ) - { - return; - } - - //if both HIGH & LOW Tx channels don't have anything on resv desc,all Tx pkts - //must have been consumed by RIVA, OK to get into BMPS - if((0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) && - (0 == dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc)) - { - tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_FALSE; - //if host is in BMPS & no pkt to Tx, RIVA can go to power save - if(WLANDXE_POWER_STATE_BMPS == dxeCtxt->hostPowerState) - { - dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN; - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - } - } - else //still more pkts to be served by RIVA - { - tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE; - - switch(dxeCtxt->rivaPowerState) - { - case WLANDXE_RIVA_POWER_STATE_ACTIVE: - //NOP - break; - case WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN: - if(intr_based) - { - dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE; - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - } - break; - default: - //assert - break; - } - } -} - -/*========================================================================== - @ Function Name - dxeRXEventHandler - - @ Description - Handle serailized RX frame ready event - First disable interrupt then pick up frame from pre allocated buffer - Since frame handle is doen, clear interrupt bit to ready next interrupt - Finally re enable interrupt - - @ Parameters - wpt_msg *rxReadyMsg - RX frame ready MSG pointer - include DXE control context - - @ Return - NONE - -===========================================================================*/ -void dxeRXEventHandler -( - wpt_msg *rxReadyMsg -) -{ - wpt_msg *msgContent = (wpt_msg *)rxReadyMsg; - WLANDXE_CtrlBlkType *dxeCtxt = NULL; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 intSrc = 0; - WLANDXE_ChannelCBType *channelCb = NULL; - wpt_uint32 chHighStat = 0; - wpt_uint32 chLowStat = 0; - wpt_uint32 regValue; - - dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext); - - if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "RX Ready WLAN Driver re-loading in progress"); - return; - } - - /* Now try to refill the ring with empty Rx buffers to keep DXE busy */ - dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]); - dxeRXFrameRefillRing(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]); - - dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext); - - if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chEnabled) || - (!dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chEnabled)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "DXE already stopped in RX event handler. Just return"); - return; - } - - if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) || - (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%s Riva is in %d, Just Pull frames without any register touch ", - __func__, dxeCtxt->hostPowerState); - - /* Not to touch any register, just pull frame directly from chain ring - * First high priority */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]; - status = dxeRXFrameReady(dxeCtxt, - channelCb, - chHighStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler Pull from RX high channel fail"); - } - /* In case FW could not power collapse in IMPS mode - * Next power restore might have empty interrupt - * If IMPS mode has empty interrupt since RX thread race, - * Invalid re-load driver might happen - * To prevent invalid re-load driver, - * IMPS event handler set dummpy frame count */ - channelCb->numFragmentCurrentChain = 1; - - /* Second low priority */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]; - status = dxeRXFrameReady(dxeCtxt, - channelCb, - chLowStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler Pull from RX low channel fail"); - } - /* LOW Priority CH same above */ - channelCb->numFragmentCurrentChain = 1; - - /* Interrupt will not enabled at here, it will be enabled at PS mode change */ - tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE; - - return; - } - - /* Disable device interrupt */ - /* Read whole interrupt mask register and exclusive only this channel int */ - status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS, - &intSrc); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler Read INT_SRC register fail"); - return; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, - "RX Event Handler INT Source 0x%x", intSrc); - -#ifndef WLANDXE_TEST_CHANNEL_ENABLE - /* Test High Priority Channel interrupt is enabled or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]; - if(intSrc & (1 << channelCb->assignedDMAChannel)) - { - status = dxeChannelCleanInt(channelCb, &chHighStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler INT Clean up fail"); - return; - } - if(WLANDXE_CH_STAT_INT_ERR_MASK & chHighStat) - { - /* Error Happen during transaction, Handle it */ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : 0x%x Error Reported, Reload Driver", - channelType[channelCb->channelType], chHighStat); - - dxeErrChannelDebug(channelCb); - - dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE; - wpalWlanReload(); - dxeStartSSRTimer(dxeCtxt); - } - else if((WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat) || - (WLANDXE_CH_STAT_INT_ED_MASK & chHighStat)) - { - /* Handle RX Ready for high priority channel */ - status = dxeRXFrameReady(dxeCtxt, - channelCb, - chHighStat); - } - else if(WLANDXE_CH_STAT_MASKED_MASK & chHighStat) - { - status = dxeRXFrameReady(dxeCtxt, - channelCb, - chHighStat); - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "RX HIGH CH EVNT STAT 0x%x, %d frames handled", chHighStat, channelCb->numFragmentCurrentChain); - /* Update the Rx DONE histogram */ - channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1); - if(WLANDXE_CH_STAT_INT_DONE_MASK & chHighStat) - { - channelCb->rxDoneHistogram |= 1; - } - else - { - channelCb->rxDoneHistogram &= ~1; - } - } -#else - /* Test H2H Test interrupt is enabled or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_H2H_TEST_RX]; - if(intSrc & (1 << channelCb->assignedDMAChannel)) - { - status = dxeChannelCleanInt(channelCb, &chStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler INT Clean up fail"); - return; - } - - if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat) - { - /* Error Happen during transaction, Handle it */ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : 0x%x Error Reported, Reload Driver", - channelType[channelCb->channelType], chStat); - - dxeErrChannelDebug(channelCb); - - dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE; - wpalWlanReload(); - dxeStartSSRTimer(dxeCtxt); - } - else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat) - { - /* Handle RX Ready for high priority channel */ - status = dxeRXFrameReady(dxeCtxt, - channelCb, - chStat); - } - /* Update the Rx DONE histogram */ - channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1); - if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat) - { - channelCb->rxDoneHistogram |= 1; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "DXE Channel Number %d, Rx DONE Histogram 0x%016llx", - channelCb->assignedDMAChannel, channelCb->rxDoneHistogram); - } - else - { - channelCb->rxDoneHistogram &= ~1; - } - } -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - - /* Test Low Priority Channel interrupt is enabled or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]; - if(intSrc & (1 << channelCb->assignedDMAChannel)) - { - status = dxeChannelCleanInt(channelCb, &chLowStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler INT Clean up fail"); - return; - } - - if(WLANDXE_CH_STAT_INT_ERR_MASK & chLowStat) - { - /* Error Happen during transaction, Handle it */ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : 0x%x Error Reported, Reload Driver", - channelType[channelCb->channelType], chLowStat); - - dxeErrChannelDebug(channelCb); - - dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE; - wpalWlanReload(); - dxeStartSSRTimer(dxeCtxt); - } - else if(WLANDXE_CH_STAT_INT_ED_MASK & chLowStat) - { - /* Handle RX Ready for low priority channel */ - status = dxeRXFrameReady(dxeCtxt, - channelCb, - chLowStat); - } - - /* Update the Rx DONE histogram */ - channelCb->rxDoneHistogram = (channelCb->rxDoneHistogram << 1); - if(WLANDXE_CH_STAT_INT_DONE_MASK & chLowStat) - { - channelCb->rxDoneHistogram |= 1; - } - else - { - channelCb->rxDoneHistogram &= ~1; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "RX LOW CH EVNT STAT 0x%x, %d frames handled", chLowStat, channelCb->numFragmentCurrentChain); - } - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler Handle Frame Ready Fail"); - return; - } - - /* Prepare Control Register EN Channel */ - if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK)) - { - HDXE_ASSERT(0); - } - wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].channelRegister.chDXECtrlRegAddr, - dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI].extraConfig.chan_mask); - - /* Prepare Control Register EN Channel */ - if(!(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask & WLANDXE_CH_CTRL_EN_MASK)) - { - HDXE_ASSERT(0); - } - - wpalWriteRegister(dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].channelRegister.chDXECtrlRegAddr, - dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI].extraConfig.chan_mask); - - /* Clear Interrupt handle processing bit - * RIVA may power down */ - wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, ®Value); - regValue &= WLANDXE_RX_INTERRUPT_PRO_UNMASK; - wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue); - - /* Enable system level ISR */ - /* Enable RX ready Interrupt at here */ - status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXEventHandler Enable RX Ready interrupt fail"); - return; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return; -} - -/*========================================================================== - @ Function Name - dxeRXPacketAvailableEventHandler - - @ Description - Handle serialized RX Packet Available event when the corresponding callback - is invoked by WPAL. - Try to fill up any completed DXE descriptors with available Rx packet buffer - pointers. - - @ Parameters - wpt_msg *rxPktAvailMsg - RX frame ready MSG pointer - include DXE control context - - @ Return - NONE - -===========================================================================*/ -void dxeRXPacketAvailableEventHandler -( - wpt_msg *rxPktAvailMsg -) -{ - WLANDXE_CtrlBlkType *dxeCtxt = NULL; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_ChannelCBType *channelCb = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity Check */ - if(NULL == rxPktAvailMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXPacketAvailableEventHandler Context is not valid"); - return; - } - - dxeCtxt = (WLANDXE_CtrlBlkType *)(rxPktAvailMsg->pContext); - /* Available resource allocated - * Stop timer not needed */ - if(VOS_TIMER_STATE_RUNNING == - wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer)) - { - wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer); - } - - do - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "dxeRXPacketAvailableEventHandler, start refilling ring"); - - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_HIGH_PRI]; - status = dxeRXFrameRefillRing(dxeCtxt,channelCb); - - // Wait for another callback to indicate when Rx resources are available - // again. - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - break; - } - - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_RX_LOW_PRI]; - status = dxeRXFrameRefillRing(dxeCtxt,channelCb); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - break; - } - } while(0); - - if((WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) || - (WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState)) - { - /* Interrupt will not enabled at here, it will be enabled at PS mode change */ - tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_TRUE; - } -} - -/*========================================================================== - @ Function Name - dxeRXISR - - @ Description - RX frame ready interrupt service routine - interrupt entry function, this function called based on ISR context - Must be serialized - - @ Parameters - void *hostCtxt - DXE host driver control context, - pre registerd during interrupt registration - - @ Return - NONE - -===========================================================================*/ -static void dxeRXISR -( - void *hostCtxt -) -{ - WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 regValue; - -#ifdef FEATURE_R33D - status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS, - ®Value); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompISR Read INT_SRC_RAW fail"); - return; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "INT_SRC_RAW 0x%x", regValue); - if(0 == regValue) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "This is not DXE Interrupt, Reject it 0x%x", regValue); - return; - } -#endif /* FEATURE_R33D */ - - /* Set Interrupt processing bit - * During this bit set, WLAN HW may not power collapse */ - wpalReadRegister(WLANDXE_INT_MASK_REG_ADDRESS, ®Value); - regValue |= WLANPAL_RX_INTERRUPT_PRO_MASK; - wpalWriteRegister(WLANDXE_INT_MASK_REG_ADDRESS, regValue); - - /* Disable interrupt at here - * Disable RX Ready system level Interrupt at here - * Otherwise infinite loop might happen */ - status = wpalDisableInterrupt(DXE_INTERRUPT_RX_READY); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReadyISR Disable RX ready interrupt fail"); - return; - } - - /* Serialize RX Ready interrupt upon RX thread */ - if(NULL == dxeCtxt->rxIsrMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReadyISR NULL message"); - HDXE_ASSERT(0); - return; - } - - status = wpalPostRxMsg(WDI_GET_PAL_CTX(), - dxeCtxt->rxIsrMsg); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "dxeRXFrameReadyISR interrupt serialize fail"); - } - - return; -} - -/*========================================================================== - @ Function Name - dxeTXPushFrame - - @ Description - Push TX frame into DXE descriptor and DXE register - Send notification to DXE register that TX frame is ready to transfer - - @ Parameters - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - wpt_packet *palPacket - Packet pointer ready to transfer - - @ Return - PAL_STATUS_T -===========================================================================*/ -static wpt_status dxeTXPushFrame -( - WLANDXE_ChannelCBType *channelEntry, - wpt_packet *palPacket -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescType *currentDesc = NULL; - WLANDXE_DescType *firstDesc = NULL; - WLANDXE_DescType *LastDesc = NULL; - void *sourcePhysicalAddress = NULL; - wpt_uint32 xferSize = 0; -#ifdef FEATURE_R33D - tx_frm_pcie_vector_t frameVector; - wpt_uint32 Va; - wpt_uint32 fragCount = 0; -#else - wpt_iterator iterator; -#endif /* FEATURE_R33D */ - wpt_uint32 isEmpty = 0; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE; - if((0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc) && - (0 == tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc)) - { - isEmpty = 1; - } - - channelEntry->numFragmentCurrentChain = 0; - currentCtrlBlk = channelEntry->headCtrlBlk; - - /* Initialize interator, TX is fragmented */ -#ifdef FEATURE_R33D - memset(&frameVector, 0, sizeof(tx_frm_pcie_vector_t)); - status = wpalPrepareTxFrame(palPacket, - &frameVector, - &Va); -#else - status = wpalLockPacketForTransfer(palPacket); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame unable to lock packet"); - return status; - } - - status = wpalIteratorInit(&iterator, palPacket); -#endif /* FEATURE_R33D */ - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame iterator init fail"); - return status; - } - - /* !!!! Revisit break condition !!!!!!! */ - while(1) - { - /* Get current descriptor pointer from current control block */ - currentDesc = currentCtrlBlk->linkedDesc; - if(NULL == firstDesc) - { - firstDesc = currentCtrlBlk->linkedDesc; - } - /* All control block will have same palPacket Pointer - * to make logic simpler */ - currentCtrlBlk->xfrFrame = palPacket; - - /* Get next fragment physical address and fragment size - * if this is the first trial, will get first physical address - * if no more fragment, Descriptor src address will be set as NULL, OK??? */ -#ifdef FEATURE_R33D - if(fragCount == frameVector.num_frg) - { - break; - } - currentCtrlBlk->shadowBufferVa = frameVector.frg[0].va; - sourcePhysicalAddress = (void *)frameVector.frg[fragCount].pa; - xferSize = frameVector.frg[fragCount].size; - fragCount++; - if(0 == xferSize) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame invalid transfer size"); - - HDXE_ASSERT(0); - return eWLAN_PAL_STATUS_E_FAILURE; - } - if(NULL == sourcePhysicalAddress) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame invalid sourcePhysicalAddress"); - HDXE_ASSERT(0); - return eWLAN_PAL_STATUS_E_FAILURE; - } -#else - status = wpalIteratorNext(&iterator, - palPacket, - &sourcePhysicalAddress, - &xferSize); - if((NULL == sourcePhysicalAddress) || - (0 == xferSize)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "dxeTXPushFrame end of current frame"); - break; - } - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Get next frame fail"); - return status; - } -#endif /* FEATURE_R33D */ - - /* This is the LAST descriptor valid for this transaction */ - LastDesc = currentCtrlBlk->linkedDesc; - - /* Program DXE descriptor */ - currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = - WLANDXE_U32_SWAP_ENDIAN((wpt_uint32)(uintptr_t)sourcePhysicalAddress); - - /* Just normal data transfer from aCPU Flat Memory to BMU Q */ - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = - WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ); - } - else - { - /* Test specific H2H transfer, destination address already set - * Do Nothing */ - } - currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(xferSize); - - /* Program channel control register */ - /* First frame not set VAL bit, why ??? */ - if(0 == channelEntry->numFragmentCurrentChain) - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write; - } - else - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid; - } - - /* Update statistics */ - channelEntry->numFragmentCurrentChain++; - channelEntry->numFreeDesc--; - channelEntry->numRsvdDesc++; - - /* Get next control block */ - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - } - channelEntry->numTotalFrame++; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "NUM TX FRAG %d, Total Frame %d", - channelEntry->numFragmentCurrentChain, channelEntry->numTotalFrame); - - /* Program Channel control register - * Set as end of packet - * Enable interrupt also for first code lock down - * performace optimization, this will be revisited */ - if(NULL == LastDesc) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame NULL Last Descriptor, broken chain"); - return eWLAN_PAL_STATUS_E_FAULT; - } - LastDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_eop_int; - /* Now First one also Valid ???? - * this procedure will prevent over handle descriptor from previous - * TX trigger */ - firstDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid; - - /* If in BMPS mode no need to notify the DXE Engine, notify SMSM instead */ - if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == tempDxeCtrlBlk->rivaPowerState) - { - /* Update channel head as next avaliable linked slot */ - channelEntry->headCtrlBlk = currentCtrlBlk; - if(isEmpty) - { - tempDxeCtrlBlk->ringNotEmpty = eWLAN_PAL_TRUE; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "SMSM_ret LO=%d HI=%d", - tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc, - tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc ); - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_TRUE; - } - return status; - } - - /* If DXE use external descriptor, registers are not needed to be programmed - * Just after finish to program descriptor, tirigger to send */ - if(channelEntry->extraConfig.chan_mask & WLANDXE_CH_CTRL_EDEN_MASK) - { - /* Issue a dummy read from the DXE descriptor DDR location to - ensure that any previously posted write to the descriptor - completes. */ - if(channelEntry->extraConfig.cw_ctrl_write_valid != firstDesc->descCtrl.ctrl) - { - //HDXE_ASSERT(0); - } - - /* Everything is ready - * Trigger to start DMA */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr, - channelEntry->extraConfig.chan_mask); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Write Channel Ctrl Register fail"); - return status; - } - - /* Update channel head as next avaliable linked slot */ - channelEntry->headCtrlBlk = currentCtrlBlk; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; - } - - /* If DXE not use external descriptor, program each registers */ - /* Circular buffer handle not need to program DESC register??? - * GEN5 code not programed RING buffer case - * REVISIT THIS !!!!!! */ - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - /* Destination address, assigned Work Q */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr, - channelEntry->channelConfig.refWQ); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Program dest address register fail"); - return status; - } - /* If descriptor format is SHORT */ - if(channelEntry->channelConfig.useShortDescFmt) - { - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr, - 0); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Program dest address register fail"); - return status; - } - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame LONG Descriptor Format!!!"); - } - } -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - else if(WDTS_CHANNEL_H2H_TEST_TX == channelEntry->channelType) - { - /* Destination address, Physical memory address */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrlRegAddr, - WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.dstMemAddrL)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Program dest address register fail"); - return status; - } - /* If descriptor format is SHORT */ - if(channelEntry->channelConfig.useShortDescFmt) - { - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDadrhRegAddr, - 0); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Program dest address register fail"); - return status; - } - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame LONG Descriptor Format!!!"); - } - } -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - - /* Program Source address register - * This address is already programmed into DXE Descriptor - * But register also upadte */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrlRegAddr, - WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.srcMemAddrL)); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Program src address register fail"); - return status; - } - /* If descriptor format is SHORT */ - if(channelEntry->channelConfig.useShortDescFmt) - { - status = wpalWriteRegister(channelEntry->channelRegister.chDXESadrhRegAddr, - 0); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Program dest address register fail"); - return status; - } - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame LONG Descriptor Format!!!"); - } - - /* Linked list Descriptor pointer */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr, - channelEntry->headCtrlBlk->linkedDescPhyAddr); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Write DESC Address register fail"); - return status; - } - /* If descriptor format is SHORT */ - if(channelEntry->channelConfig.useShortDescFmt) - { - status = wpalWriteRegister(channelEntry->channelRegister.chDXEDeschRegAddr, - 0); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Program dest address register fail"); - return status; - } - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame LONG Descriptor Format!!!"); - } - - /* Transfer Size */ - xferSize = WLANDXE_U32_SWAP_ENDIAN(firstDesc->xfrSize); - status = wpalWriteRegister(channelEntry->channelRegister.chDXESzRegAddr, - xferSize); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Write DESC Address register fail"); - return status; - } - - /* Everything is ready - * Trigger to start DMA */ - status = wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr, - channelEntry->extraConfig.chan_mask); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXPushFrame Write Channel Ctrl Register fail"); - return status; - } - - /* Update channel head as next avaliable linked slot */ - channelEntry->headCtrlBlk = currentCtrlBlk; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeTXCompFrame - - @ Description - TX Frame transfer complete event handler - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - PAL_STATUS_T -===========================================================================*/ -static wpt_status dxeTXCompFrame -( - WLANDXE_CtrlBlkType *hostCtxt, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescType *currentDesc = NULL; - wpt_uint32 descCtrlValue = 0; - unsigned int *lowThreshold = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if((NULL == hostCtxt) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompFrame Invalid ARG"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if(NULL == hostCtxt->txCompCB) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompFrame TXCompCB is not registered"); - return eWLAN_PAL_STATUS_SUCCESS; - } - - status = wpalMutexAcquire(&channelEntry->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompFrame Mutex Acquire fail"); - return status; - } - - currentCtrlBlk = channelEntry->tailCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - - if( currentCtrlBlk == channelEntry->headCtrlBlk ) - { - status = wpalMutexRelease(&channelEntry->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompFrame Mutex Release fail"); - return status; - } - return eWLAN_PAL_STATUS_SUCCESS; - } - - - while(1) - { -// HDXE_ASSERT(WLAN_PAL_IS_STATUS_SUCCESS(WLAN_RivaValidateDesc(currentDesc))); - descCtrlValue = currentDesc->descCtrl.ctrl; - if((descCtrlValue & WLANDXE_DESC_CTRL_VALID)) - { - /* caught up with head, bail out */ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, - "dxeTXCompFrame caught up with head - next DESC has VALID set"); - break; - } - - if(currentCtrlBlk->xfrFrame == NULL) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Invalid transfer frame"); - HDXE_ASSERT(0); - break; - } - channelEntry->numFreeDesc++; - channelEntry->numRsvdDesc--; - - /* Send Frame TX Complete notification with frame start fragment location */ - if(WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP) - { - hostCtxt->txCompletedFrames--; -#ifdef FEATURE_R33D - wpalFreeTxFrame(currentCtrlBlk->shadowBufferVa); -#else - status = wpalUnlockPacket(currentCtrlBlk->xfrFrame); - if (eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReady unable to unlock packet"); - status = wpalMutexRelease(&channelEntry->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompFrame Mutex Release fail"); - } - return status; - } -#endif /* FEATURE_R33D */ - hostCtxt->txCompCB(hostCtxt->clientCtxt, - currentCtrlBlk->xfrFrame, - eWLAN_PAL_STATUS_SUCCESS); - channelEntry->numFragmentCurrentChain = 0; - } - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - - /* Break condition - * Head control block is the control block must be programed for the next TX - * so, head control block is not programmed control block yet - * if loop encounte head control block, stop to complete - * in theory, COMP CB must be called already ??? */ - if(currentCtrlBlk == channelEntry->headCtrlBlk) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, - "dxeTXCompFrame caught up with head ptr"); - break; - } - /* VALID Bit check ???? */ - } - - /* Tail and Head Control block must be same */ - channelEntry->tailCtrlBlk = currentCtrlBlk; - - lowThreshold = channelEntry->channelType == WDTS_CHANNEL_TX_LOW_PRI? - &(hostCtxt->txCompInt.txLowResourceThreshold_LoPriCh): - &(hostCtxt->txCompInt.txLowResourceThreshold_HiPriCh); - - /* If specific channel hit low resource condition send notification to upper layer */ - if((eWLAN_PAL_TRUE == channelEntry->hitLowResource) && - (channelEntry->numFreeDesc > *lowThreshold)) - { - /* Change it back if we raised it for fetching a remaining packet from TL */ - if(WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold) - { - *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "DXE TX %d channel recovered from low resource", channelEntry->channelType); - hostCtxt->lowResourceCB(hostCtxt->clientCtxt, - channelEntry->channelType, - eWLAN_PAL_TRUE); - channelEntry->hitLowResource = eWLAN_PAL_FALSE; - wpalTimerStop(&channelEntry->healthMonitorTimer); - } - - status = wpalMutexRelease(&channelEntry->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompFrame Mutex Release fail"); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeTXEventHandler - - @ Description - If DXE HW sends TX related interrupt, this event handler will be called - Handle higher priority channel first - Figureout why interrupt happen and call appropriate final even handler - TX complete or error happen - - @ Parameters - void *msgPtr - Even MSG - - @ Return - PAL_STATUS_T -===========================================================================*/ -void dxeTXEventHandler -( - wpt_msg *msgPtr -) -{ - wpt_msg *msgContent = (wpt_msg *)msgPtr; - WLANDXE_CtrlBlkType *dxeCtxt = NULL; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 intSrc = 0; - wpt_uint32 chStat = 0; - WLANDXE_ChannelCBType *channelCb = NULL; - - wpt_uint8 bEnableISR = 0; - static wpt_uint8 successiveIntWithIMPS; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext); - dxeCtxt->ucTxMsgCnt = 0; - - if(eWLAN_PAL_TRUE == dxeCtxt->driverReloadInProcessing) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "wlan: TX COMP WLAN Driver re-loading in progress"); - return; - } - - /* Return from here if the RIVA is in IMPS, to avoid register access */ - if(WLANDXE_POWER_STATE_IMPS == dxeCtxt->hostPowerState) - { - successiveIntWithIMPS++; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler IMPS TX COMP INT successiveIntWithIMPS %d", successiveIntWithIMPS); - status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler IMPS HC COMP interrupt fail"); - } - - status = dxeTXCompFrame(dxeCtxt, &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler IMPS LC COMP interrupt fail"); - } - - if(((dxeCtxt->txCompletedFrames) && - (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable)) && - (successiveIntWithIMPS == 1)) - { - dxeCtxt->txIntEnable = eWLAN_PAL_TRUE; - wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "TX COMP INT Enabled, remain TX frame count on ring %d", - dxeCtxt->txCompletedFrames); - /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid - the posibility of a race*/ - dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE); - } - else - { - dxeCtxt->txIntEnable = eWLAN_PAL_FALSE; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "TX COMP INT NOT Enabled, RIVA still wake up? remain TX frame count on ring %d, successiveIntWithIMPS %d", - dxeCtxt->txCompletedFrames, successiveIntWithIMPS); - } - return; - } - - successiveIntWithIMPS = 0; - if((!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].extraConfig.chEnabled) || - (!dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].extraConfig.chEnabled)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "DXE already stopped in TX event handler. Just return"); - return; - } - - /* Disable device interrupt */ - /* Read whole interrupt mask register and exclusive only this channel int */ - status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS, - &intSrc); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompleteEventHandler Read INT_DONE_SRC register fail"); - return; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, - "TX Event Handler INT Source 0x%x", intSrc); - - /* Test High Priority Channel is the INT source or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]; - if(intSrc & (1 << channelCb->assignedDMAChannel)) - { - status = dxeChannelCleanInt(channelCb, &chStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler INT Clean up fail"); - return; - } - - if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : 0x%x Error Reported, Reload Driver", - channelType[channelCb->channelType], chStat); - - dxeErrChannelDebug(channelCb); - - dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE; - wpalWlanReload(); - dxeStartSSRTimer(dxeCtxt); - } - else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat) - { - /* Handle TX complete for high priority channel */ - status = dxeTXCompFrame(dxeCtxt, - channelCb); - bEnableISR = 1; - } - else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat) - { - /* Handle TX complete for high priority channel */ - status = dxeTXCompFrame(dxeCtxt, - channelCb); - bEnableISR = 1; - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler TX HI status=%x", chStat); - } - - if(WLANDXE_CH_STAT_MASKED_MASK & chStat) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, - "dxeTXEventHandler TX HIGH Channel Masked Unmask it!!!!"); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, - "TX HIGH STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc); - } - - /* Test Low Priority Channel interrupt is enabled or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]; - if(intSrc & (1 << channelCb->assignedDMAChannel)) - { - status = dxeChannelCleanInt(channelCb, &chStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler INT Clean up fail"); - return; - } - - if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : 0x%x Error Reported, Reload Driver", - channelType[channelCb->channelType], chStat); - - dxeErrChannelDebug(channelCb); - - dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE; - wpalWlanReload(); - dxeStartSSRTimer(dxeCtxt); - } - else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat) - { - /* Handle TX complete for low priority channel */ - status = dxeTXCompFrame(dxeCtxt, - channelCb); - bEnableISR = 1; - } - else if(WLANDXE_CH_STAT_INT_ED_MASK & chStat) - { - /* Handle TX complete for low priority channel */ - status = dxeTXCompFrame(dxeCtxt, - channelCb); - bEnableISR = 1; - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler TX LO status=%x", chStat); - } - - if(WLANDXE_CH_STAT_MASKED_MASK & chStat) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_HIGH, - "dxeTXEventHandler TX Low Channel Masked Unmask it!!!!"); - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "TX LOW STAT 0x%x RESRVD %d", chStat, channelCb->numRsvdDesc); - } - - -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - /* Test H2H TX Channel interrupt is enabled or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_H2H_TEST_TX]; - if(intSrc & (1 << channelCb->assignedDMAChannel)) - { - status = wpalReadRegister(channelCb->channelRegister.chDXEStatusRegAddr, - &chStat); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeChannelCleanInt Read CH STAT register fail"); - return; - } - - if(WLANDXE_CH_STAT_INT_ERR_MASK & chStat) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : 0x%x Error Reported, Reload Driver", - channelType[channelCb->channelType], chStat); - - dxeErrChannelDebug(channelCb); - - dxeCtxt->driverReloadInProcessing = eWLAN_PAL_TRUE; - wpalWlanReload(); - dxeStartSSRTimer(dxeCtxt); - } - else if(WLANDXE_CH_STAT_INT_DONE_MASK & chStat) - { - /* Handle TX complete for high priority channel */ - status = dxeTXCompFrame(dxeCtxt, - channelCb); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXEventHandler INT Clean up fail"); - return; - } - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "unexpected channel state %d", chStat); - } - } -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - - if((bEnableISR || (dxeCtxt->txCompletedFrames)) && - (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable)) - { - dxeCtxt->txIntEnable = eWLAN_PAL_TRUE; - wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE); - if(0 != dxeCtxt->txCompletedFrames) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "TX COMP INT Enabled, remain TX frame count on ring %d", - dxeCtxt->txCompletedFrames); - } - } - - /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid - the posibility of a race*/ - dxePsComplete(dxeCtxt, eWLAN_PAL_TRUE); - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return; -} - - -/*========================================================================== - @ Function Name - dxeTXCompleteProcessing - - @ Description - If DXE HW sends TX related interrupt, this event handler will be called - Handle higher priority channel first - Figureout why interrupt happen and call appropriate final even handler - TX complete or error happen - - @ Parameters - dxeCtxt DXE context - - @ Return - PAL_STATUS_T -===========================================================================*/ -void dxeTXCompleteProcessing -( - WLANDXE_CtrlBlkType *dxeCtxt -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_ChannelCBType *channelCb = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Test High Priority Channel is the INT source or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI]; - - /* Handle TX complete for high priority channel */ - status = dxeTXCompFrame(dxeCtxt, channelCb); - - /* Test Low Priority Channel interrupt is enabled or not */ - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]; - - /* Handle TX complete for low priority channel */ - status = dxeTXCompFrame(dxeCtxt, channelCb); - - if((eWLAN_PAL_FALSE == dxeCtxt->txIntEnable) && - ((dxeCtxt->txCompletedFrames > 0) || - (WLANDXE_POWER_STATE_FULL == dxeCtxt->hostPowerState))) - { - dxeCtxt->txIntEnable = eWLAN_PAL_TRUE; - wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%s %s : %d, %s : %d", __func__, - channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].channelType], - dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_HIGH_PRI].numRsvdDesc, - channelType[dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].channelType], - dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numRsvdDesc); - - if((WLANDXE_POWER_STATE_FULL != dxeCtxt->hostPowerState) && - (eWLAN_PAL_FALSE == tempDxeCtrlBlk->smsmToggled)) - { - /* After TX Comp processing, still remaining frame on the DXE TX ring - * And when push frame, RING was not empty marked - * Then when push frame, no SMSM toggle happen - * To avoid permanent TX stall, SMSM toggle is needed at here - * With this toggle, host should gaurantee SMSM state should be changed */ - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - } - } - - /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid - the posibility of a race*/ - dxePsComplete(dxeCtxt, eWLAN_PAL_FALSE); - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return; -} - -/*========================================================================== - @ Function Name - dxeTXReSyncDesc - - @ Description - When STA comeout from IMPS, check DXE TX next transfer candidate descriptor - And HW programmed descriptor. - If any async happen between HW/SW TX stall will happen - - @ Parameters - void *msgPtr - Message pointer to sync with TX thread - - @ Return - NONE -===========================================================================*/ -void dxeTXReSyncDesc -( - wpt_msg *msgPtr -) -{ - wpt_msg *msgContent = (wpt_msg *)msgPtr; - WLANDXE_CtrlBlkType *pDxeCtrlBlk; - wpt_uint32 nextDescReg; - WLANDXE_ChannelCBType *channelEntry; - WLANDXE_DescCtrlBlkType *validCtrlBlk; - wpt_uint32 descLoop; - wpt_uint32 channelLoop; - - if(NULL == msgContent) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXReSyncDesc Invalid Control Block"); - return; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "dxeTXReSyncDesc Try to re-sync TX channel if any problem"); - pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)(msgContent->pContext); - - for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++) - { - channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop]; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%11s : Try to detect TX descriptor async", channelType[channelEntry->channelType]); - wpalReadRegister(channelEntry->channelRegister.chDXEDesclRegAddr, - &nextDescReg); - /* Async detect without TX pending frame */ - if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk) - { - if(nextDescReg != channelEntry->tailCtrlBlk->linkedDescPhyAddr) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "TX Async no Pending frame"); - - dxeChannelMonitor("!!! TX Async no Pending frame !!!", channelEntry, NULL); - dxeChannelRegisterDump(channelEntry, "!!! TX Async no Pending frame !!!", NULL); - - wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr, - channelEntry->tailCtrlBlk->linkedDescPhyAddr); - } - } - /* Async detect with some TX pending frames - * next descriptor register should sync with first valid descriptor */ - else - { - validCtrlBlk = channelEntry->tailCtrlBlk; - for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++) - { - if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID) - { - if(nextDescReg != validCtrlBlk->linkedDescPhyAddr) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "TX Async"); - - dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL); - dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL); - - wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr, - validCtrlBlk->linkedDescPhyAddr); - } - break; - } - validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk; - if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk) - { - /* Finished to test till head control blcok, but could not find valid descriptor - * from head to tail all descriptors are invalidated - * host point of view head descriptor is next TX candidate - * So, next descriptor control have to be programmed with head descriptor - * check */ - if(nextDescReg != channelEntry->headCtrlBlk->linkedDescPhyAddr) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "TX Async with not completed transferred frames, next descriptor must be head"); - - dxeChannelMonitor("!!! TX Async !!!", channelEntry, NULL); - dxeChannelRegisterDump(channelEntry, "!!! TX Async !!!", NULL); - - wpalWriteRegister(channelEntry->channelRegister.chDXEDesclRegAddr, - validCtrlBlk->linkedDescPhyAddr); - } - break; - } - } - } - } - - /* HW/SW descriptor resync is done. - * Next if there are any valid descriptor in chain, Push to HW again */ - for(channelLoop = WDTS_CHANNEL_TX_LOW_PRI; channelLoop < WDTS_CHANNEL_RX_LOW_PRI; channelLoop++) - { - channelEntry = &pDxeCtrlBlk->dxeChannel[channelLoop]; - if(channelEntry->tailCtrlBlk == channelEntry->headCtrlBlk) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%11s : No TX Pending frame", - channelType[channelEntry->channelType]); - /* No Pending frame, Do nothing */ - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : TX Pending frame, process it", - channelType[channelEntry->channelType]); - validCtrlBlk = channelEntry->tailCtrlBlk; - for(descLoop = 0; descLoop < channelEntry->numDesc; descLoop++) - { - if(validCtrlBlk->linkedDesc->descCtrl.ctrl & WLANDXE_DESC_CTRL_VALID) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%11s : when exit IMPS found valid descriptor", - channelType[channelEntry->channelType]); - - /* Found valid descriptor, kick DXE */ - wpalWriteRegister(channelEntry->channelRegister.chDXECtrlRegAddr, - channelEntry->extraConfig.chan_mask); - break; - } - validCtrlBlk = (WLANDXE_DescCtrlBlkType *)validCtrlBlk->nextCtrlBlk; - if(validCtrlBlk == channelEntry->headCtrlBlk->nextCtrlBlk) - { - /* Finished to test till head control blcok, but could not find valid descriptor - * from head to tail all descriptors are invalidated */ - break; - } - } - } - } - - wpalMemoryFree(msgPtr); - return; -} - -/*========================================================================== - @ Function Name - dxeTXISR - - @ Description - TX interrupt ISR - Platform will call this function if INT is happen - This function must be registered into platform interrupt module - - @ Parameters - void *hostCtxt - DXE host driver control context, - pre registerd during interrupt registration - - @ Return - PAL_STATUS_T -===========================================================================*/ -static void dxeTXISR -( - void *hostCtxt -) -{ - WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)hostCtxt; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; -#ifdef FEATURE_R33D - wpt_uint32 regValue; -#endif /* FEATURE_R33D */ - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Return from here if the RIVA is in IMPS, to avoid register access */ - if(WLANDXE_POWER_STATE_DOWN == dxeCtxt->hostPowerState) - { - dxeCtxt->txIntEnable = eWLAN_PAL_FALSE; - /* Disable interrupt at here, - IMPS or IMPS Pending state should not access RIVA register */ - status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeRXFrameReadyISR Disable RX ready interrupt fail"); - return; - } - dxeCtxt->txIntDisabledByIMPS = eWLAN_PAL_TRUE; - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%s Riva is in %d, return from here ", __func__, dxeCtxt->hostPowerState); - return; - } - -#ifdef FEATURE_R33D - status = wpalReadRegister(WLANDXE_INT_SRC_RAW_ADDRESS, - ®Value); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompISR Read INT_SRC_RAW fail"); - return; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "INT_SRC_RAW 0x%x", regValue); - if(0 == regValue) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "This is not DXE Interrupt, Reject it"); - return; - } -#endif /* FEATURE_R33D */ - - /* Disable TX Complete Interrupt at here */ - status = wpalDisableInterrupt(DXE_INTERRUPT_TX_COMPLE); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompISR Disable TX complete interrupt fail"); - return; - } - dxeCtxt->txIntEnable = eWLAN_PAL_FALSE; - - - if( dxeCtxt->ucTxMsgCnt ) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO, - "Avoiding serializing TX Complete event"); - return; - } - - dxeCtxt->ucTxMsgCnt = 1; - - /* Serialize TX complete interrupt upon TX thread */ - if(NULL == dxeCtxt->txIsrMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "Invalid message"); - HDXE_ASSERT(0); - return; - } - status = wpalPostTxMsg(WDI_GET_PAL_CTX(), - dxeCtxt->txIsrMsg); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "dxeTXCompISR interrupt serialize fail status=%d", status); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return; -} - -/*------------------------------------------------------------------------- - * Global Function - *-------------------------------------------------------------------------*/ -/*========================================================================== - @ Function Name - WLANDXE_Open - - @ Description - Open host DXE driver, allocate DXE resources - Allocate, DXE local control block, DXE descriptor pool, DXE descriptor control block pool - - @ Parameters - pVoid pAdapter : Driver global control block pointer - - @ Return - pVoid DXE local module control block pointer -===========================================================================*/ -void *WLANDXE_Open -( - void -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - unsigned int idx; - WLANDXE_ChannelCBType *currentChannel = NULL; - int smsmInitState; -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - wpt_uint32 sIdx; - WLANDXE_ChannelCBType *channel = NULL; - WLANDXE_DescCtrlBlkType *crntDescCB = NULL; - WLANDXE_DescCtrlBlkType *nextDescCB = NULL; -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* This is temporary allocation */ - tempDxeCtrlBlk = (WLANDXE_CtrlBlkType *)wpalMemoryAllocate(sizeof(WLANDXE_CtrlBlkType)); - if(NULL == tempDxeCtrlBlk) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Open Control Block Alloc Fail"); - return NULL; - } - wpalMemoryZero(tempDxeCtrlBlk, sizeof(WLANDXE_CtrlBlkType)); - - status = dxeCommonDefaultConfig(tempDxeCtrlBlk); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Open Common Configuration Fail"); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - - for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Open Channel %s Open Start", channelType[idx]); - currentChannel = &tempDxeCtrlBlk->dxeChannel[idx]; - if(idx == WDTS_CHANNEL_TX_LOW_PRI) - { - currentChannel->channelType = WDTS_CHANNEL_TX_LOW_PRI; - } - else if(idx == WDTS_CHANNEL_TX_HIGH_PRI) - { - currentChannel->channelType = WDTS_CHANNEL_TX_HIGH_PRI; - } - else if(idx == WDTS_CHANNEL_RX_LOW_PRI) - { - currentChannel->channelType = WDTS_CHANNEL_RX_LOW_PRI; - } - else if(idx == WDTS_CHANNEL_RX_HIGH_PRI) - { - currentChannel->channelType = WDTS_CHANNEL_RX_HIGH_PRI; - } -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - else if(idx == WDTS_CHANNEL_H2H_TEST_TX) - { - currentChannel->channelType = WDTS_CHANNEL_H2H_TEST_TX; - } - else if(idx == WDTS_CHANNEL_H2H_TEST_RX) - { - currentChannel->channelType = WDTS_CHANNEL_H2H_TEST_RX; - } -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - - /* Config individual channels from channel default setup table */ - status = dxeChannelDefaultConfig(tempDxeCtrlBlk, - currentChannel); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Open Channel Basic Configuration Fail for channel %d", idx); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - - /* Allocate DXE Control Block will be used by host DXE driver */ - status = dxeCtrlBlkAlloc(tempDxeCtrlBlk, currentChannel); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Open Alloc DXE Control Block Fail for channel %d", idx); - - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - status = wpalMutexInit(¤tChannel->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Open Lock Init Fail for channel %d", idx); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - - status = wpalTimerInit(¤tChannel->healthMonitorTimer, - dxeHealthMonitorTimeout, - (void *)currentChannel); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Open Health Monitor timer init fail %d", idx); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - - currentChannel->healthMonitorMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg)); - if(NULL == currentChannel->healthMonitorMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Open Health Monitor MSG Alloc fail %d", idx); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - wpalMemoryZero(currentChannel->healthMonitorMsg, sizeof(wpt_msg)); - currentChannel->healthMonitorMsg->callback = dxeTXHealthMonitor; - currentChannel->healthMonitorMsg->pContext = (void *)currentChannel; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Open Channel %s Open Success", channelType[idx]); - } - - /* Allocate and Init RX READY ISR Serialize Buffer */ - tempDxeCtrlBlk->rxIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg)); - if(NULL == tempDxeCtrlBlk->rxIsrMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Open Alloc RX ISR Fail"); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - wpalMemoryZero(tempDxeCtrlBlk->rxIsrMsg, sizeof(wpt_msg)); - tempDxeCtrlBlk->rxIsrMsg->callback = dxeRXEventHandler; - tempDxeCtrlBlk->rxIsrMsg->pContext = (void *)tempDxeCtrlBlk; - - /* Allocate and Init TX COMP ISR Serialize Buffer */ - tempDxeCtrlBlk->txIsrMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg)); - if(NULL == tempDxeCtrlBlk->txIsrMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Open Alloc TX ISR Fail"); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - wpalMemoryZero(tempDxeCtrlBlk->txIsrMsg, sizeof(wpt_msg)); - tempDxeCtrlBlk->txIsrMsg->callback = dxeTXEventHandler; - tempDxeCtrlBlk->txIsrMsg->pContext = (void *)tempDxeCtrlBlk; - - /* Allocate and Init RX Packet Available Serialize Message Buffer */ - tempDxeCtrlBlk->rxPktAvailMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg)); - if(NULL == tempDxeCtrlBlk->rxPktAvailMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Open Alloc RX Packet Available Message Fail"); - WLANDXE_Close(tempDxeCtrlBlk); - return NULL; - } - wpalMemoryZero(tempDxeCtrlBlk->rxPktAvailMsg, sizeof(wpt_msg)); - tempDxeCtrlBlk->rxPktAvailMsg->callback = dxeRXPacketAvailableEventHandler; - tempDxeCtrlBlk->rxPktAvailMsg->pContext = (void *)tempDxeCtrlBlk; - - tempDxeCtrlBlk->freeRXPacket = NULL; - tempDxeCtrlBlk->dxeCookie = WLANDXE_CTXT_COOKIE; - tempDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE; - tempDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE; - tempDxeCtrlBlk->driverReloadInProcessing = eWLAN_PAL_FALSE; - tempDxeCtrlBlk->smsmToggled = eWLAN_PAL_FALSE; - - /* Initialize SMSM state - * Init State is - * Clear TX Enable - * RING EMPTY STATE */ - smsmInitState = wpalNotifySmsm(WPAL_SMSM_WLAN_TX_ENABLE, - WPAL_SMSM_WLAN_TX_RINGS_EMPTY); - if(0 != smsmInitState) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "SMSM Channel init fail %d", smsmInitState); - for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++) - { - dxeChannelClose(tempDxeCtrlBlk, &tempDxeCtrlBlk->dxeChannel[idx]); - } - wpalMemoryFree(tempDxeCtrlBlk->rxIsrMsg); - wpalMemoryFree(tempDxeCtrlBlk->txIsrMsg); - wpalMemoryFree(tempDxeCtrlBlk); - return NULL; - } - - wpalTimerInit(&tempDxeCtrlBlk->rxResourceAvailableTimer, - dxeRXResourceAvailableTimerExpHandler, - tempDxeCtrlBlk); - - wpalTimerInit(&tempDxeCtrlBlk->dxeSSRTimer, - dxeSSRTimerExpHandler, tempDxeCtrlBlk); - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Open Success"); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return (void *)tempDxeCtrlBlk; -} - -/*========================================================================== - @ Function Name - WLANDXE_ClientRegistration - - @ Description - Make callback functions registration into DXE driver from DXE driver client - - @ Parameters - pVoid pDXEContext : DXE module control block - WDTS_RxFrameReadyCbType rxFrameReadyCB : RX Frame ready CB function pointer - WDTS_TxCompleteCbType txCompleteCB : TX complete CB function pointer - WDTS_LowResourceCbType lowResourceCB : Low DXE resource notification CB function pointer - void *userContext : DXE Cliennt control block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_ClientRegistration -( - void *pDXEContext, - WLANDXE_RxFrameReadyCbType rxFrameReadyCB, - WLANDXE_TxCompleteCbType txCompleteCB, - WLANDXE_LowResourceCbType lowResourceCB, - void *userContext -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_CtrlBlkType *dxeCtxt; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if(NULL == pDXEContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_ClientRegistration Invalid DXE CB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if(NULL == rxFrameReadyCB) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_ClientRegistration Invalid RX READY CB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if(NULL == txCompleteCB) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_ClientRegistration Invalid txCompleteCB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if(NULL == lowResourceCB) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_ClientRegistration Invalid lowResourceCB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if(NULL == userContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_ClientRegistration Invalid userContext"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext; - - /* Assign */ - dxeCtxt->rxReadyCB = rxFrameReadyCB; - dxeCtxt->txCompCB = txCompleteCB; - dxeCtxt->lowResourceCB = lowResourceCB; - dxeCtxt->clientCtxt = userContext; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - WLANDXE_Start - - @ Description - Start Host DXE driver - Initialize DXE channels and start channel - - @ Parameters - pVoid pDXEContext : DXE module control block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_Start -( - void *pDXEContext -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 idx; - WLANDXE_CtrlBlkType *dxeCtxt = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if(NULL == pDXEContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start Invalid DXE CB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext; - - /* WLANDXE_Start called means DXE engine already initiates - * And DXE HW is reset and init finished - * But here to make sure HW is initialized, reset again */ - status = dxeEngineCoreStart(dxeCtxt); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start DXE HW init Fail"); - return status; - } - - /* Individual Channel Start */ - for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Start Channel %s Start", channelType[idx]); - - /* Allocate DXE descriptor will be shared by Host driver and DXE engine */ - /* Make connection between DXE descriptor and DXE control block */ - status = dxeDescAllocAndLink(tempDxeCtrlBlk, &dxeCtxt->dxeChannel[idx]); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start Alloc DXE Descriptor Fail for channel %d", idx); - return status; - } - - /* Program each channel register with configuration arguments */ - status = dxeChannelInitProgram(dxeCtxt, - &dxeCtxt->dxeChannel[idx]); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start %d Program DMA channel Fail", idx); - return status; - } - - /* ??? Trigger to start DMA channel - * This must be seperated from ??? */ - status = dxeChannelStart(dxeCtxt, - &dxeCtxt->dxeChannel[idx]); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start %d Channel Start Fail", idx); - return status; - } - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "WLANDXE_Start Channel %s Start Success", channelType[idx]); - } - - /* Register ISR to OS */ - /* Register TX complete interrupt into platform */ - status = wpalRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE, - dxeTXISR, - dxeCtxt); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start TX comp interrupt registration Fail"); - return status; - } - - /* Register RX ready interrupt into platform */ - status = wpalRegisterInterrupt(DXE_INTERRUPT_RX_READY, - dxeRXISR, - dxeCtxt); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start RX Ready interrupt registration Fail"); - return status; - } - - /* Enable system level ISR */ - /* Enable RX ready Interrupt at here */ - status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeTXCompleteEventHandler Enable TX complete interrupt fail"); - return status; - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - WLANDXE_TXFrame - - @ Description - Trigger frame transmit from host to RIVA - - @ Parameters - pVoid pDXEContext : DXE Control Block - wpt_packet pPacket : transmit packet structure - WDTS_ChannelType channel : TX channel - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_TxFrame -( - void *pDXEContext, - wpt_packet *pPacket, - WDTS_ChannelType channel -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_ChannelCBType *currentChannel = NULL; - WLANDXE_CtrlBlkType *dxeCtxt = NULL; - unsigned int *lowThreshold = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if(NULL == pDXEContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start Invalid DXE CB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if(NULL == pPacket) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start Invalid pPacket"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - if((WDTS_CHANNEL_MAX < channel) || (WDTS_CHANNEL_MAX == channel)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Start Invalid channel"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext; - - currentChannel = &dxeCtxt->dxeChannel[channel]; - - - status = wpalMutexAcquire(¤tChannel->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_TxFrame Mutex Acquire fail"); - return status; - } - - lowThreshold = currentChannel->channelType == WDTS_CHANNEL_TX_LOW_PRI? - &(dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh): - &(dxeCtxt->txCompInt.txLowResourceThreshold_HiPriCh); - - /* Decide have to activate TX complete event or not */ - switch(dxeCtxt->txCompInt.txIntEnable) - { - /* TX complete interrupt will be activated when low DXE resource */ - case WLANDXE_TX_COMP_INT_LR_THRESHOLD: - if((currentChannel->numFreeDesc <= *lowThreshold) && - (eWLAN_PAL_FALSE == dxeCtxt->txIntEnable)) - { - dxeCtxt->txIntEnable = eWLAN_PAL_TRUE; - dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt, - channel, - eWLAN_PAL_FALSE); - } - break; - - /* TX complete interrupt will be activated n number of frames transferred */ - case WLANDXE_TX_COMP_INT_PER_K_FRAMES: - if(channel == WDTS_CHANNEL_TX_LOW_PRI) - { - currentChannel->numFrameBeforeInt++; - } - break; - - /* TX complete interrupt will be activated periodically */ - case WLANDXE_TX_COMP_INT_TIMER: - break; - } - - dxeCtxt->txCompletedFrames++; - - /* Update DXE descriptor, this is frame based - * if a frame consist of N fragments, N Descriptor will be programed */ - status = dxeTXPushFrame(currentChannel, pPacket); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_TxFrame TX Push Frame fail"); - status = wpalMutexRelease(¤tChannel->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_TxFrame Mutex Release fail"); - } - return status; - } - - /* If specific channel hit low resource condition, send notification to upper layer */ - if(currentChannel->numFreeDesc <= *lowThreshold) - { - dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt, - channel, - eWLAN_PAL_FALSE); - currentChannel->hitLowResource = eWLAN_PAL_TRUE; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "%11s : Low Resource currentChannel->numRsvdDesc %d", - channelType[currentChannel->channelType], - currentChannel->numRsvdDesc); - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - wpalTimerStart(¤tChannel->healthMonitorTimer, - T_WLANDXE_PERIODIC_HEALTH_M_TIME); - } - status = wpalMutexRelease(¤tChannel->dxeChannelLock); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_TxFrame Mutex Release fail"); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - WLANDXE_CompleteTX - - @ Description - Informs DXE that the current series of Tx packets is complete - - @ Parameters - pContext pDXEContext : DXE Control Block - ucTxResReq TX resource number required by TL/WDI - - @ Return - wpt_status -===========================================================================*/ -wpt_status -WLANDXE_CompleteTX -( - void* pContext, - wpt_uint32 ucTxResReq -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_CtrlBlkType *dxeCtxt = (WLANDXE_CtrlBlkType *)(pContext); - WLANDXE_ChannelCBType *channelCb = NULL; - wpt_boolean inLowRes; - - /* Sanity Check */ - if( NULL == pContext ) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_CompleteTX invalid param"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - channelCb = &dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI]; - inLowRes = channelCb->hitLowResource; - - if(WLANDXE_TX_LOW_RES_THRESHOLD < ucTxResReq) - { - /* Raise threshold temporarily if necessary */ - dxeCtxt->txCompInt.txLowResourceThreshold_LoPriCh = ucTxResReq; - - if(eWLAN_PAL_FALSE == inLowRes) - { - /* Put the channel to low resource condition */ - dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt, - WDTS_CHANNEL_TX_LOW_PRI, - eWLAN_PAL_FALSE); - inLowRes = channelCb->hitLowResource = eWLAN_PAL_TRUE; - wpalTimerStart(&channelCb->healthMonitorTimer, - T_WLANDXE_PERIODIC_HEALTH_M_TIME); - } - } - - /*Try to reclaim resources*/ - dxeTXCompleteProcessing(dxeCtxt); - - /* In previous WLANTL_GetFrames call, TL didn't fetch a packet - because its fragment size is larger than DXE free resource. */ - if(0 < ucTxResReq) - { - /* DXE successfully claimed enough free DXE resouces for next fetch. */ - if(WLANDXE_GetFreeTxDataResNumber(dxeCtxt) >= ucTxResReq) - { - /* DXE has not been in low resource condition. DXE forces to kick off - TX tranmit */ - if((eWLAN_PAL_FALSE == inLowRes) && - (eWLAN_PAL_FALSE == channelCb->hitLowResource)) - { - dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt, - WDTS_CHANNEL_TX_LOW_PRI, - eWLAN_PAL_FALSE); - dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt, - WDTS_CHANNEL_TX_LOW_PRI, - eWLAN_PAL_TRUE); - channelCb->hitLowResource = eWLAN_PAL_FALSE; - } - } - else - { - /* DXE doesn't have enough free DXE resources. Put the channel - to low resource condition. */ - if(eWLAN_PAL_FALSE == channelCb->hitLowResource) - { - /* Put the channel to low resource condition */ - dxeCtxt->lowResourceCB(dxeCtxt->clientCtxt, - WDTS_CHANNEL_TX_LOW_PRI, - eWLAN_PAL_FALSE); - channelCb->hitLowResource = eWLAN_PAL_TRUE; - wpalTimerStart(&channelCb->healthMonitorTimer, - T_WLANDXE_PERIODIC_HEALTH_M_TIME); - } - } - } - - return status; -} - -/*========================================================================== - @ Function Name - WLANDXE_Stop - - @ Description - Stop DXE channels and DXE engine operations - Disable all channel interrupt - Stop all channel operation - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_Stop -( - void *pDXEContext -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 idx; - WLANDXE_CtrlBlkType *dxeCtxt = NULL; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if(NULL == pDXEContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Stop Invalid DXE CB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext; - for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++) - { - if(VOS_TIMER_STATE_RUNNING == wpalTimerGetCurStatus(&dxeCtxt->dxeChannel[idx].healthMonitorTimer)) - { - wpalTimerStop(&dxeCtxt->dxeChannel[idx].healthMonitorTimer); - } - - status = dxeChannelStop(dxeCtxt, &dxeCtxt->dxeChannel[idx]); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Stop Channel %d Stop Fail", idx); - } - } - - /* During Stop unregister interrupt */ - wpalUnRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE); - wpalUnRegisterInterrupt(DXE_INTERRUPT_RX_READY); - - if(VOS_TIMER_STATE_STOPPED != - wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer)) - { - wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - WLANDXE_Close - - @ Description - Close DXE channels - Free DXE related resources - DXE descriptor free - Descriptor control block free - Pre allocated RX buffer free - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_Close -( - void *pDXEContext -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 idx; - WLANDXE_CtrlBlkType *dxeCtxt = NULL; -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - wpt_uint32 sIdx; - WLANDXE_ChannelCBType *channel = NULL; - WLANDXE_DescCtrlBlkType *crntDescCB = NULL; - WLANDXE_DescCtrlBlkType *nextDescCB = NULL; -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Sanity */ - if(NULL == pDXEContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_Stop Invalid DXE CB"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext; - wpalTimerDelete(&dxeCtxt->rxResourceAvailableTimer); - wpalTimerDelete(&dxeCtxt->dxeSSRTimer); - for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++) - { - wpalMutexDelete(&dxeCtxt->dxeChannel[idx].dxeChannelLock); - wpalTimerDelete(&dxeCtxt->dxeChannel[idx].healthMonitorTimer); - if(NULL != dxeCtxt->dxeChannel[idx].healthMonitorMsg) - { - wpalMemoryFree(dxeCtxt->dxeChannel[idx].healthMonitorMsg); - } - dxeChannelClose(dxeCtxt, &dxeCtxt->dxeChannel[idx]); -#ifdef WLANDXE_TEST_CHANNEL_ENABLE - channel = &dxeCtxt->dxeChannel[idx]; - crntDescCB = channel->headCtrlBlk; - for(sIdx = 0; sIdx < channel->numDesc; sIdx++) - { - nextDescCB = (WLANDXE_DescCtrlBlkType *)crntDescCB->nextCtrlBlk; - wpalMemoryFree((void *)crntDescCB); - crntDescCB = nextDescCB; - if(NULL == crntDescCB) - { - break; - } - } -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - } - - if(NULL != dxeCtxt->rxIsrMsg) - { - wpalMemoryFree(dxeCtxt->rxIsrMsg); - } - if(NULL != dxeCtxt->txIsrMsg) - { - wpalMemoryFree(dxeCtxt->txIsrMsg); - } - if(NULL != dxeCtxt->rxPktAvailMsg) - { - wpalMemoryFree(dxeCtxt->rxPktAvailMsg); - } - - wpalMemoryFree(pDXEContext); - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - WLANDXE_TriggerTX - - @ Description - TBD - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_TriggerTX -( - void *pDXEContext -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* TBD */ - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return status; -} - -/*========================================================================== - @ Function Name - dxeTxThreadSetPowerStateEventHandler - - @ Description - If WDI sends set power state req, this event handler will be called in Tx - thread context - - @ Parameters - void *msgPtr - Event MSG - - @ Return - None -===========================================================================*/ -void dxeTxThreadSetPowerStateEventHandler -( - wpt_msg *msgPtr -) -{ - wpt_msg *msgContent = (wpt_msg *)msgPtr; - WLANDXE_CtrlBlkType *dxeCtxt; - wpt_status status = eWLAN_PAL_STATUS_E_FAILURE; - WLANDXE_PowerStateType reqPowerState; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - dxeCtxt = (WLANDXE_CtrlBlkType *)(msgContent->pContext); - reqPowerState = (WLANDXE_PowerStateType)msgContent->val; - dxeCtxt->setPowerStateCb = (WLANDXE_SetPowerStateCbType)msgContent->ptr; - - switch(reqPowerState) - { - case WLANDXE_POWER_STATE_BMPS: - if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState) - { - //don't block MC waiting for num_rsvd to become 0 since it may take a while - //based on amount of TX and RX activity - during this time any received - // management frames will remain un-processed consuming RX buffers - dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN; - dxeCtxt->hostPowerState = reqPowerState; - } - else - { - status = eWLAN_PAL_STATUS_E_INVAL; - } - break; - case WLANDXE_POWER_STATE_IMPS: - if(WLANDXE_RIVA_POWER_STATE_ACTIVE == dxeCtxt->rivaPowerState) - { - dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_IMPS_UNKNOWN; - } - else - { - status = eWLAN_PAL_STATUS_E_INVAL; - } - break; - case WLANDXE_POWER_STATE_FULL: - if(WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN == dxeCtxt->rivaPowerState) - { - dxeCtxt->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE; - } - dxeCtxt->hostPowerState = reqPowerState; - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - break; - case WLANDXE_POWER_STATE_DOWN: - WLANDXE_Stop((void *)dxeCtxt); - break; - default: - //assert - break; - } - - if(WLANDXE_POWER_STATE_BMPS_PENDING != dxeCtxt->hostPowerState) - { - dxeCtxt->setPowerStateCb(status, - dxeCtxt->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].descBottomLocPhyAddr); - } - else - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "%s State of DXE is WLANDXE_POWER_STATE_BMPS_PENDING, so cannot proceed", __func__); - } - /* Free MSG buffer */ - wpalMemoryFree(msgPtr); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - return; -} - - -/*========================================================================== - @ Function Name - dxeRxThreadSetPowerStateEventHandler - - @ Description - If WDI sends set power state req, this event handler will be called in Rx - thread context - - @ Parameters - void *msgPtr - Event MSG - - @ Return - None -===========================================================================*/ -void dxeRxThreadSetPowerStateEventHandler -( - wpt_msg *msgPtr -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - /* Now serialise the message through Tx thread also to make sure - * no register access when RIVA is in powersave */ - /*Use the same message pointer just change the call back function */ - msgPtr->callback = dxeTxThreadSetPowerStateEventHandler; - status = wpalPostTxMsg(WDI_GET_PAL_CTX(), - msgPtr); - if ( eWLAN_PAL_STATUS_SUCCESS != status ) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Tx thread Set power state req serialize fail status=%d", - status); - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); -} - -/*========================================================================== - @ Function Name - WLANDXE_SetPowerState - - @ Description - From Client let DXE knows what is the WLAN HW(RIVA) power state - - @ Parameters - pVoid pDXEContext : DXE Control Block - WLANDXE_PowerStateType powerState - - @ Return - wpt_status -===========================================================================*/ -wpt_status WLANDXE_SetPowerState -( - void *pDXEContext, - WDTS_PowerStateType powerState, - WDTS_SetPSCbType cBack -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - WLANDXE_CtrlBlkType *pDxeCtrlBlk; - WLANDXE_PowerStateType hostPowerState; - wpt_msg *rxCompMsg; - wpt_msg *txDescReSyncMsg; - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - if(NULL == pDXEContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "NULL pDXEContext passed by caller"); - return eWLAN_PAL_STATUS_E_FAILURE; - } - pDxeCtrlBlk = (WLANDXE_CtrlBlkType *)pDXEContext; - - switch(powerState) - { - case WDTS_POWER_STATE_FULL: - if(WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState) - { - txDescReSyncMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg)); - if(NULL == txDescReSyncMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_SetPowerState, TX Resync MSG MEM alloc Fail"); - } - else - { - txDescReSyncMsg->callback = dxeTXReSyncDesc; - txDescReSyncMsg->pContext = pDxeCtrlBlk; - status = wpalPostTxMsg(WDI_GET_PAL_CTX(), - txDescReSyncMsg); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_SetPowerState, Post TX re-sync MSG fail"); - } - } - } - hostPowerState = WLANDXE_POWER_STATE_FULL; - break; - case WDTS_POWER_STATE_BMPS: - pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_BMPS; - hostPowerState = WLANDXE_POWER_STATE_BMPS; - break; - case WDTS_POWER_STATE_IMPS: - pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_IMPS; - hostPowerState = WLANDXE_POWER_STATE_IMPS; - break; - case WDTS_POWER_STATE_DOWN: - pDxeCtrlBlk->hostPowerState = WLANDXE_POWER_STATE_DOWN; - hostPowerState = WLANDXE_POWER_STATE_DOWN; - break; - default: - hostPowerState = WLANDXE_POWER_STATE_MAX; - } - - // A callback i.e. ACK back is needed only when we want to enable BMPS - // and the data/management path is active because we want to ensure - // DXE registers are not accessed when RIVA may be power-collapsed. So - // we need a callback in enter_bmps_req (the request to RIVA is sent - // only after ACK back from TX thread). A callback is not needed in - // finish_scan_req during BMPS since data-path is resumed only in - // finish_scan_rsp and no management frames are sent in between. No - // callback is needed when going from BMPS enabled to BMPS suspended/ - // disabled when it is known that RIVA is awake and cannot enter power - // collapse autonomously so no callback is needed in exit_bmps_rsp or - // init_scan_rsp - if ( cBack ) - { - //serialize through Rx thread - rxCompMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg)); - if(NULL == rxCompMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_SetPowerState, MSG MEM alloc Fail"); - return eWLAN_PAL_STATUS_E_RESOURCES; - } - - /* Event type, where it must be defined???? */ - /* THIS MUST BE CLEARED ASAP - txCompMsg->type = TX_COMPLETE; */ - rxCompMsg->callback = dxeRxThreadSetPowerStateEventHandler; - rxCompMsg->pContext = pDxeCtrlBlk; - rxCompMsg->val = hostPowerState; - rxCompMsg->ptr = cBack; - status = wpalPostRxMsg(WDI_GET_PAL_CTX(), - rxCompMsg); - if ( eWLAN_PAL_STATUS_SUCCESS != status ) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Rx thread Set power state req serialize fail status=%d", - status); - } - } - else - { - if ( WLANDXE_POWER_STATE_FULL == hostPowerState ) - { - if( WLANDXE_POWER_STATE_BMPS == pDxeCtrlBlk->hostPowerState ) - { - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - } - else if( WLANDXE_POWER_STATE_IMPS == pDxeCtrlBlk->hostPowerState ) - { - /* Requested Full power from exit IMPS, reenable the interrupts*/ - if(eWLAN_PAL_TRUE == pDxeCtrlBlk->rxIntDisabledByIMPS) - { - pDxeCtrlBlk->rxIntDisabledByIMPS = eWLAN_PAL_FALSE; - /* Enable RX interrupt at here, if new PS is not IMPS */ - status = wpalEnableInterrupt(DXE_INTERRUPT_RX_READY); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "%s Enable RX ready interrupt fail", __func__); - return status; - } - } - if(eWLAN_PAL_TRUE == pDxeCtrlBlk->txIntDisabledByIMPS) - { - pDxeCtrlBlk->txIntDisabledByIMPS = eWLAN_PAL_FALSE; - pDxeCtrlBlk->txIntEnable = eWLAN_PAL_TRUE; - /* Enable RX interrupt at here, if new PS is not IMPS */ - status = wpalEnableInterrupt(DXE_INTERRUPT_TX_COMPLE); - if(eWLAN_PAL_STATUS_SUCCESS != status) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "%s Enable TX comp interrupt fail", __func__); - return status; - } - } - } - pDxeCtrlBlk->hostPowerState = hostPowerState; - pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_ACTIVE; - } - else if ( hostPowerState == WLANDXE_POWER_STATE_BMPS ) - { - pDxeCtrlBlk->hostPowerState = hostPowerState; - pDxeCtrlBlk->rivaPowerState = WLANDXE_RIVA_POWER_STATE_BMPS_UNKNOWN; - } - else - { - HDXE_ASSERT(0); - } - } - - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Exit", __func__); - - return status; -} - -/*========================================================================== - @ Function Name - WLANDXE_GetFreeTxDataResNumber - - @ Description - Returns free descriptor numbers for TX data channel (TX high priority) - - @ Parameters - pVoid pDXEContext : DXE Control Block - - @ Return - wpt_uint32 Free descriptor number of TX high pri ch -===========================================================================*/ -wpt_uint32 WLANDXE_GetFreeTxDataResNumber -( - void *pDXEContext -) -{ - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW, - "%s Enter", __func__); - - if(NULL == pDXEContext) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "NULL parameter passed by caller"); - return (0); - } - - return - ((WLANDXE_CtrlBlkType *)pDXEContext)->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].numFreeDesc; -} - -/*========================================================================== - @ Function Name - WLANDXE_ChannelDebug - - @ Description - Display DXE Channel debugging information - User may request to display DXE channel snapshot - Or if host driver detects any abnormal stcuk may display - - @ Parameters - displaySnapshot : Display DXE snapshot option - enableStallDetect : Enable stall detect feature - This feature will take effect to data performance - Not integrate till fully verification - - @ Return - NONE - -===========================================================================*/ -void WLANDXE_ChannelDebug -( - wpt_boolean displaySnapshot, - wpt_boolean enableStallDetect -) -{ - wpt_msg *channelDebugMsg; - wpt_uint32 regValue; - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - /* Debug Type 1, Display current snapshot */ - if(displaySnapshot) - { - /* Whatever RIVA power condition try to wakeup RIVA through SMSM - * This will not simply wakeup RIVA - * Just incase TX not wanted stuck, Trigger TX again */ - dxeNotifySmsm(eWLAN_PAL_FALSE, eWLAN_PAL_TRUE); - dxeNotifySmsm(eWLAN_PAL_TRUE, eWLAN_PAL_FALSE); - /* Get free BD count */ - wpalSleep(10); - wpalReadRegister(WLANDXE_BMU_AVAILABLE_BD_PDU, ®Value); - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, - "===== DXE Dump Start HPS %d, FWS %d, TX PFC %d, ABD %d =====", - tempDxeCtrlBlk->hostPowerState, tempDxeCtrlBlk->rivaPowerState, - tempDxeCtrlBlk->txCompletedFrames, regValue); - - wpalPacketStallUpdateInfo((wpt_uint32 *)&tempDxeCtrlBlk->rivaPowerState, - ®Value, - NULL, - 0); - - channelDebugMsg = (wpt_msg *)wpalMemoryAllocate(sizeof(wpt_msg)); - if(NULL == channelDebugMsg) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "WLANDXE_ChannelDebug, MSG MEM alloc Fail"); - return ; - } - - channelDebugMsg->callback = dxeRxThreadChannelDebugHandler; - status = wpalPostRxMsg(WDI_GET_PAL_CTX(), channelDebugMsg); - if ( eWLAN_PAL_STATUS_SUCCESS != status ) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "Tx thread Set power state req serialize fail status=%d", - status); - } - } - - /* Debug Type 2, toggling stall detect enable/disable */ - if(enableStallDetect) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN, - "DXE TX Stall detect"); - /* Start Stall detect timer and detect stall */ - wpalTimerStart(&tempDxeCtrlBlk->dxeChannel[WDTS_CHANNEL_TX_LOW_PRI].healthMonitorTimer, - T_WLANDXE_PERIODIC_HEALTH_M_TIME); - } - return; -} diff --git a/CORE/DXE/src/wlan_qct_dxe_cfg_i.c b/CORE/DXE/src/wlan_qct_dxe_cfg_i.c deleted file mode 100644 index e9c2200849da..000000000000 --- a/CORE/DXE/src/wlan_qct_dxe_cfg_i.c +++ /dev/null @@ -1,626 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/**========================================================================= - - @file wlan_qct_dxe_cfg_i.c - - @brief - - This file contains the external API exposed by the wlan data transfer abstraction layer module. -========================================================================*/ - -/*=========================================================================== - - EDIT HISTORY FOR FILE - - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - - $Header:$ $DateTime: $ $Author: $ - - -when who what, where, why --------- --- ---------------------------------------------------------- -08/03/10 schang Created module. - -===========================================================================*/ - -/*=========================================================================== - - INCLUDE FILES FOR MODULE - -===========================================================================*/ - -/*---------------------------------------------------------------------------- - * Include Files - * -------------------------------------------------------------------------*/ -#include "wlan_qct_dxe_i.h" - -/*---------------------------------------------------------------------------- - * Preprocessor Definitions and Constants - * -------------------------------------------------------------------------*/ -typedef struct -{ - WDTS_ChannelType wlanChannel; - WLANDXE_DMAChannelType DMAChannel; - WLANDXE_ChannelConfigType *channelConfig; -} WLANDXE_ChannelMappingType; - -wpt_uint32 channelBaseAddressList[WLANDXE_DMA_CHANNEL_MAX] = -{ - WLANDXE_DMA_CHAN0_BASE_ADDRESS, - WLANDXE_DMA_CHAN1_BASE_ADDRESS, - WLANDXE_DMA_CHAN2_BASE_ADDRESS, - WLANDXE_DMA_CHAN3_BASE_ADDRESS, - WLANDXE_DMA_CHAN4_BASE_ADDRESS, - WLANDXE_DMA_CHAN5_BASE_ADDRESS, - WLANDXE_DMA_CHAN6_BASE_ADDRESS -}; - -wpt_uint32 channelInterruptMask[WLANDXE_DMA_CHANNEL_MAX] = -{ - WLANDXE_INT_MASK_CHAN_0, - WLANDXE_INT_MASK_CHAN_1, - WLANDXE_INT_MASK_CHAN_2, - WLANDXE_INT_MASK_CHAN_3, - WLANDXE_INT_MASK_CHAN_4, - WLANDXE_INT_MASK_CHAN_5, - WLANDXE_INT_MASK_CHAN_6 -}; - -WLANDXE_ChannelConfigType chanTXLowPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - WLANDXE_LO_PRI_RES_NUM , - - /* MAX num RX Buffer */ - 0, - - /* Reference WQ, TX23 */ - 23, - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_H2B, - - /* Channel Priority 7(Highest) - 0(Lowest) NOT CLEAR YET !!! */ - 4, - - /* BD attached to frames for this pipe */ - eWLAN_PAL_TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 5, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!! */ - eWLAN_PAL_TRUE, - - /* Use short Descriptor */ - eWLAN_PAL_TRUE -}; - -WLANDXE_ChannelConfigType chanTXHighPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - WLANDXE_HI_PRI_RES_NUM , - - /* MAX num RX Buffer */ - 0, - - /* Reference WQ, TX23 */ - 23, - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_H2B, - - /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */ - 6, - - /* BD attached to frames for this pipe */ - eWLAN_PAL_TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 7, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/ - eWLAN_PAL_TRUE, - - /* Use short Descriptor */ - eWLAN_PAL_TRUE -}; - -WLANDXE_ChannelConfigType chanRXLowPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - 256, - - /* MAX num RX Buffer, NOT CLEAR YET !!! */ - 1, - - /* Reference WQ, NOT CLEAR YET !!! */ - /* Temporary BMU Work Q 4 */ - 11, - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_B2H, - - /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */ - 5, - - /* BD attached to frames for this pipe */ - eWLAN_PAL_TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 6, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/ - eWLAN_PAL_TRUE, - - /* Use short Descriptor */ - eWLAN_PAL_TRUE -}; - -WLANDXE_ChannelConfigType chanRXHighPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - 256, - - /* MAX num RX Buffer, NOT CLEAR YET !!! */ - 1, - - /* Reference WQ, RX11 */ - 4, - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_B2H, - - /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */ - 6, - - /* BD attached to frames for this pipe */ - eWLAN_PAL_TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 8, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/ - eWLAN_PAL_TRUE, - - /* Use short Descriptor */ - eWLAN_PAL_TRUE -}; - -#ifdef WLANDXE_TEST_CHANNEL_ENABLE -WLANDXE_ChannelConfigType chanH2HTestConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - 5, - - /* MAX num RX Buffer, NOT CLEAR YET !!! */ - 0, - - /* Reference WQ, NOT CLEAR YET !!! */ - /* Temporary BMU Work Q 5 */ - 5, - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_H2H, - - /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */ - 5, - - /* BD attached to frames for this pipe */ - eWLAN_PAL_FALSE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 0, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/ - eWLAN_PAL_TRUE, - - /* Use short Descriptor */ - eWLAN_PAL_TRUE -}; -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ - -WLANDXE_ChannelMappingType channelList[WDTS_CHANNEL_MAX] = -{ - {WDTS_CHANNEL_TX_LOW_PRI, WLANDXE_DMA_CHANNEL_0, &chanTXLowPriConfig}, - {WDTS_CHANNEL_TX_HIGH_PRI, WLANDXE_DMA_CHANNEL_4, &chanTXHighPriConfig}, - {WDTS_CHANNEL_RX_LOW_PRI, WLANDXE_DMA_CHANNEL_1, &chanRXLowPriConfig}, -#ifndef WLANDXE_TEST_CHANNEL_ENABLE - {WDTS_CHANNEL_RX_HIGH_PRI, WLANDXE_DMA_CHANNEL_3, &chanRXHighPriConfig}, -#else - {WDTS_CHANNEL_H2H_TEST_TX, WLANDXE_DMA_CHANNEL_2, &chanH2HTestConfig}, - {WDTS_CHANNEL_H2H_TEST_RX, WLANDXE_DMA_CHANNEL_2, &chanH2HTestConfig} -#endif /* WLANDXE_TEST_CHANNEL_ENABLE */ -}; - -WLANDXE_TxCompIntConfigType txCompInt = -{ - /* TX Complete Interrupt enable method */ - WLANDXE_TX_COMP_INT_PER_K_FRAMES, - - /* TX Low Resource remaining resource threshold for Low Pri Ch */ - WLANDXE_TX_LOW_RES_THRESHOLD, - - /* TX Low Resource remaining resource threshold for High Pri Ch */ - WLANDXE_TX_LOW_RES_THRESHOLD, - - /* RX Low Resource remaining resource threshold */ - 5, - - /* Per K frame enable Interrupt */ - /*WLANDXE_HI_PRI_RES_NUM*/ 5, - - /* Periodic timer msec */ - 10 -}; - -/*========================================================================== - @ Function Name - dxeCommonDefaultConfig - - @ Description - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - - @ Return - wpt_status - -===========================================================================*/ -wpt_status dxeCommonDefaultConfig -( - WLANDXE_CtrlBlkType *dxeCtrlBlk -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - - dxeCtrlBlk->rxReadyCB = NULL; - dxeCtrlBlk->txCompCB = NULL; - dxeCtrlBlk->lowResourceCB = NULL; - - wpalMemoryCopy(&dxeCtrlBlk->txCompInt, - &txCompInt, - sizeof(WLANDXE_TxCompIntConfigType)); - - return status; -} - -/*========================================================================== - @ Function Name - dxeChannelDefaultConfig - - @ Description - Get defualt configuration values from pre defined structure - All the channels must have it's own configurations - - @ Parameters - WLANDXE_CtrlBlkType: *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -wpt_status dxeChannelDefaultConfig -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -) -{ - wpt_status status = eWLAN_PAL_STATUS_SUCCESS; - wpt_uint32 baseAddress; - wpt_uint32 dxeControlRead = 0; - wpt_uint32 dxeControlWrite = 0; - wpt_uint32 dxeControlWriteValid = 0; - wpt_uint32 dxeControlWriteEop = 0; - wpt_uint32 dxeControlWriteEopInt = 0; - wpt_uint32 idx; - wpt_uint32 rxResourceCount = 0; - WLANDXE_ChannelMappingType *mappedChannel = NULL; - - /* Sanity Check */ - if((NULL == dxeCtrlBlk) || (NULL == channelEntry)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "dxeLinkDescAndCtrlBlk Channel Entry is not valid"); - return eWLAN_PAL_STATUS_E_INVAL; - } - - for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++) - { - if(channelEntry->channelType == channelList[idx].wlanChannel) - { - mappedChannel = &channelList[idx]; - break; - } - } - - if((NULL == mappedChannel) || (WDTS_CHANNEL_MAX == idx)) - { - HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, - "%s Failed to map channel", __func__); - return eWLAN_PAL_STATUS_E_INVAL; - } - - wpalMemoryCopy(&channelEntry->channelConfig, - mappedChannel->channelConfig, - sizeof(WLANDXE_ChannelConfigType)); - - baseAddress = channelBaseAddressList[mappedChannel->DMAChannel]; - channelEntry->channelRegister.chDXEBaseAddr = baseAddress; - channelEntry->channelRegister.chDXEStatusRegAddr = baseAddress + WLANDXE_DMA_CH_STATUS_REG; - channelEntry->channelRegister.chDXEDesclRegAddr = baseAddress + WLANDXE_DMA_CH_DESCL_REG; - channelEntry->channelRegister.chDXEDeschRegAddr = baseAddress + WLANDXE_DMA_CH_DESCH_REG; - channelEntry->channelRegister.chDXELstDesclRegAddr = baseAddress + WLANDXE_DMA_CH_LST_DESCL_REG; - channelEntry->channelRegister.chDXECtrlRegAddr = baseAddress + WLANDXE_DMA_CH_CTRL_REG; - channelEntry->channelRegister.chDXESzRegAddr = baseAddress + WLANDXE_DMA_CH_SZ_REG; - channelEntry->channelRegister.chDXEDadrlRegAddr = baseAddress + WLANDXE_DMA_CH_DADRL_REG; - channelEntry->channelRegister.chDXEDadrhRegAddr = baseAddress + WLANDXE_DMA_CH_DADRH_REG; - channelEntry->channelRegister.chDXESadrlRegAddr = baseAddress + WLANDXE_DMA_CH_SADRL_REG; - channelEntry->channelRegister.chDXESadrhRegAddr = baseAddress + WLANDXE_DMA_CH_SADRH_REG; - - /* Channel Mask? - * This value will control channel control register. - * This register will be set to trigger actual DMA transfer activate - * CH_N_CTRL */ - channelEntry->extraConfig.chan_mask = 0; - /* Check VAL bit before processing descriptor */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDVEN_MASK; - /* Use External Descriptor Linked List */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDEN_MASK; - /* Enable Channel Interrupt on error */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ERR_MASK; - /* Enable INT after XFER done */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_DONE_MASK; - /* Enable INT External Descriptor */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ED_MASK; - /* Set Channel This is not channel, event counter, somthing wrong */ - channelEntry->extraConfig.chan_mask |= - mappedChannel->DMAChannel << WLANDXE_CH_CTRL_CTR_SEL_OFFSET; - /* Transfer Type */ - channelEntry->extraConfig.chan_mask |= mappedChannel->channelConfig->xfrType; - /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */ - if(!channelEntry->channelConfig.useShortDescFmt) - { - channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_DFMT; - } - /* TX Channel, Set DIQ bit, Clear SIQ bit since source is not WQ */ - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_DIQ_MASK; - } - /* RX Channel, Set SIQ bit, Clear DIQ bit since source is not WQ */ - else if((WDTS_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SIQ_MASK; - } - else - { - /* This is test H2H channel, TX, RX not use work Q - * Do Nothing */ - } - /* Frame Contents Swap */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SWAP_MASK; - /* Host System Using Little Endian */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_ENDIAN_MASK; - /* BMU Threshold select */ - channelEntry->extraConfig.chan_mask |= - channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET; - /* EOP for control register ??? */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EOP_MASK; - /* Channel Priority */ - channelEntry->extraConfig.chan_mask |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET; - /* PDU REL */ - channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_PDU_REL; - /* Disable DMA transfer on this channel */ - channelEntry->extraConfig.chan_mask_read_disable = channelEntry->extraConfig.chan_mask; - /* Enable DMA transfer on this channel */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EN_MASK; - /* Channel Mask done */ - - /* Control Read - * Default Descriptor control Word value for RX ready DXE descriptor - * DXE engine will reference this value before DMA transfer */ - dxeControlRead = 0; - /* Source is a Queue ID, not flat memory address */ - dxeControlRead |= WLANDXE_DESC_CTRL_SIQ; - /* Transfer direction is BMU 2 Host */ - dxeControlRead |= WLANDXE_DESC_CTRL_XTYPE_B2H; - /* End of Packet, RX is single fragment */ - dxeControlRead |= WLANDXE_DESC_CTRL_EOP; - /* BD Present, default YES, B2H case it must be 0 to insert BD */ - if(!channelEntry->channelConfig.bdPresent) - { - dxeControlRead |= WLANDXE_DESC_CTRL_BDH; - } - /* Channel Priority */ - dxeControlRead |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET; - /* BMU Threshold select, only used H2B, not this case??? */ - dxeControlRead |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET; - /* PDU Release, Release BD/PDU when DMA done */ - dxeControlRead |= WLANDXE_DESC_CTRL_PDU_REL; - /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */ - if(!channelEntry->channelConfig.useShortDescFmt) - { - dxeControlRead |= WLANDXE_DESC_CTRL_DFMT; - } - /* Interrupt on Descriptor done */ - dxeControlRead |= WLANDXE_DESC_CTRL_INT; - /* For ready status, this Control WORD must be VALID */ - dxeControlRead |= WLANDXE_DESC_CTRL_VALID; - /* Frame Contents Swap */ - dxeControlRead |= WLANDXE_DESC_CTRL_BDT_SWAP; - /* Host Little Endian */ - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (WDTS_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - dxeControlRead |= WLANDXE_DESC_CTRL_ENDIANNESS; - } - - /* SWAP if needed */ - channelEntry->extraConfig.cw_ctrl_read = WLANDXE_U32_SWAP_ENDIAN(dxeControlRead); - /* Control Read Done */ - - /* Control Write - * Write into DXE descriptor control word to TX frame - * DXE engine will reference this word to contorl TX DMA channel */ - channelEntry->extraConfig.cw_ctrl_write = 0; - /* Transfer type, from Host 2 BMU */ - dxeControlWrite |= mappedChannel->channelConfig->xfrType; - /* BD Present, this looks some weird ??? */ - if(!channelEntry->channelConfig.bdPresent) - { - dxeControlWrite |= WLANDXE_DESC_CTRL_BDH; - } - /* Channel Priority */ - dxeControlWrite |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET; - /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */ - if(!channelEntry->channelConfig.useShortDescFmt) - { - dxeControlWrite |= WLANDXE_DESC_CTRL_DFMT; - } - /* BMU Threshold select, only used H2B, not this case??? */ - dxeControlWrite |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET; - /* Destination is WQ */ - dxeControlWrite |= WLANDXE_DESC_CTRL_DIQ; - /* Frame Contents Swap */ - dxeControlWrite |= WLANDXE_DESC_CTRL_BDT_SWAP; - /* Host Little Endian */ - dxeControlWrite |= WLANDXE_DESC_CTRL_ENDIANNESS; - /* Interrupt Enable */ - dxeControlWrite |= WLANDXE_DESC_CTRL_INT; - - dxeControlWriteValid = dxeControlWrite | WLANDXE_DESC_CTRL_VALID; - dxeControlWriteEop = dxeControlWriteValid | WLANDXE_DESC_CTRL_EOP; - dxeControlWriteEopInt = dxeControlWriteEop | WLANDXE_DESC_CTRL_INT; - - /* DXE Descriptor must has Endian swapped value */ - channelEntry->extraConfig.cw_ctrl_write = WLANDXE_U32_SWAP_ENDIAN(dxeControlWrite); - /* Control Write DONE */ - - /* Control Write include VAL bit - * This Control word used to set valid bit and - * trigger DMA transfer for specific descriptor */ - channelEntry->extraConfig.cw_ctrl_write_valid = - WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteValid); - - /* Control Write include EOP - * End of Packet */ - channelEntry->extraConfig.cw_ctrl_write_eop = - WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEop); - - /* Control Write include EOP and INT - * indicate End Of Packet and generate interrupt on descriptor Done */ - channelEntry->extraConfig.cw_ctrl_write_eop_int = - WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEopInt); - - - /* size mask???? */ - channelEntry->extraConfig.chk_size_mask = - mappedChannel->channelConfig->chk_size << 10; - - channelEntry->extraConfig.refWQ_swapped = - WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ); - - /* Set Channel specific Interrupt mask */ - channelEntry->extraConfig.intMask = channelInterruptMask[mappedChannel->DMAChannel]; - - - wpalGetNumRxRawPacket(&rxResourceCount); - if((WDTS_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (0 == rxResourceCount)) - { - channelEntry->numDesc = mappedChannel->channelConfig->nDescs; - } - else - { - channelEntry->numDesc = rxResourceCount / 4; - } - channelEntry->assignedDMAChannel = mappedChannel->DMAChannel; - channelEntry->numFreeDesc = 0; - channelEntry->numRsvdDesc = 0; - channelEntry->numFragmentCurrentChain = 0; - channelEntry->numTotalFrame = 0; - channelEntry->hitLowResource = eWLAN_PAL_FALSE; - - return status; -} diff --git a/CORE/DXE/src/wlan_qct_dxe_i.h b/CORE/DXE/src/wlan_qct_dxe_i.h deleted file mode 100644 index 1905e3855fac..000000000000 --- a/CORE/DXE/src/wlan_qct_dxe_i.h +++ /dev/null @@ -1,711 +0,0 @@ -/* - * Copyright (c) 2014 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -#ifndef WLAN_QCT_DXE_I_H -#define WLAN_QCT_DXE_I_H - -/**========================================================================= - - @file wlan_qct_dxe_i.h - - @brief - - This file contains the external API exposed by the wlan data transfer abstraction layer module. -========================================================================*/ - -/*=========================================================================== - - EDIT HISTORY FOR FILE - - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - - $Header:$ $DateTime: $ $Author: $ - - -when who what, where, why --------- --- ---------------------------------------------------------- -08/03/10 schang Created module. - -===========================================================================*/ - -/*=========================================================================== - - INCLUDE FILES FOR MODULE - -===========================================================================*/ - -/*---------------------------------------------------------------------------- - * Include Files - * -------------------------------------------------------------------------*/ -#include "wlan_qct_dxe.h" -#include "wlan_qct_pal_trace.h" -#include "wlan_qct_pal_timer.h" -#include "vos_trace.h" -/*---------------------------------------------------------------------------- - * Preprocessor Definitions and Constants - * -------------------------------------------------------------------------*/ -#define WLANDXE_CTXT_COOKIE 0xC00CC111 - - -/* From here WCNSS DXE register information - * This is temporary definition location to make compile and unit test - * If official msmreg.h integrated, this part will be eliminated */ -/* Start with base address */ - -#ifdef WCN_PRONTO -#define WLANDXE_CCU_DXE_INT_SELECT 0xfb2050dc -#define WLANDXE_CCU_DXE_INT_SELECT_STAT 0xfb2050e0 -#define WLANDXE_CCU_ASIC_INT_ENABLE 0xfb2050e4 -#define WLANDXE_CCU_SOFT_RESET 0xfb204010 -#else -#define WLANDXE_CCU_DXE_INT_SELECT 0x03200b10 -#define WLANDXE_CCU_DXE_INT_SELECT_STAT 0x03200b14 -#define WLANDXE_CCU_ASIC_INT_ENABLE 0x03200b18 -#endif - -#ifdef PAL_OS_TYPE_BMP -#define WLANDXE_WCNSS_BASE_ADDRESS 0xCDD00000 -#else -#ifdef WCN_PRONTO -#define WLANDXE_WCNSS_BASE_ADDRESS 0xfb000000 -#else -#define WLANDXE_WCNSS_BASE_ADDRESS 0x03000000 -#endif -#endif /* PAL_OS_TYPE_BMP */ - -#define WLANDXE_BMU_AVAILABLE_BD_PDU (WLANDXE_WCNSS_BASE_ADDRESS + 0x80084) - -#define WLANDXE_REGISTER_BASE_ADDRESS (WLANDXE_WCNSS_BASE_ADDRESS + 0x202000) - -/* Common over the channels register addresses */ -#define WALNDEX_DMA_CSR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x00) -#define WALNDEX_DMA_ENCH_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x04) -#define WALNDEX_DMA_CH_EN_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x08) -#define WALNDEX_DMA_CH_DONE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x0C) -#define WALNDEX_DMA_CH_ERR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x10) -#define WALNDEX_DMA_CH_STOP_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x14) - -/* Interrupt Control register address */ -#define WLANDXE_INT_MASK_REG_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x18) -#define WLANDXE_INT_SRC_MSKD_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x1C) -#define WLANDXE_INT_SRC_RAW_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x20) -#define WLANDXE_INT_ED_SRC_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x24) -#define WLANDXE_INT_DONE_SRC_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x28) -#define WLANDXE_INT_ERR_SRC_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x2C) -#define WLANDXE_INT_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x30) -#define WLANDXE_INT_ED_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x34) -#define WLANDXE_INT_DONE_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x38) -#define WLANDXE_INT_ERR_CLR_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x3C) - -#define WLANDXE_DMA_CH_PRES_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x40) -#define WLANDXE_ARB_CH_MSK_CLR_ADDRRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x74) - -/* Channel Counter register */ -#define WLANDXE_DMA_COUNTER_0 (WLANDXE_REGISTER_BASE_ADDRESS + 0x200) -#define WLANDXE_DMA_COUNTER_1 (WLANDXE_REGISTER_BASE_ADDRESS + 0x204) -#define WLANDXE_DMA_COUNTER_2 (WLANDXE_REGISTER_BASE_ADDRESS + 0x208) -#define WLANDXE_DMA_COUNTER_3 (WLANDXE_REGISTER_BASE_ADDRESS + 0x20C) -#define WLANDXE_DMA_COUNTER_4 (WLANDXE_REGISTER_BASE_ADDRESS + 0x210) -#define WLANDXE_DMA_COUNTER_5 (WLANDXE_REGISTER_BASE_ADDRESS + 0x214) -#define WLANDXE_DMA_COUNTER_6 (WLANDXE_REGISTER_BASE_ADDRESS + 0x218) - -#define WLANDXE_ENGINE_STAT_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x64) -#define WLANDXE_BMU_SB_QDAT_AV_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x5c) - -/* Channel Base address */ -#define WLANDXE_DMA_CHAN0_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x400) -#define WLANDXE_DMA_CHAN1_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x440) -#define WLANDXE_DMA_CHAN2_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x480) -#define WLANDXE_DMA_CHAN3_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x4C0) -#define WLANDXE_DMA_CHAN4_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x500) -#define WLANDXE_DMA_CHAN5_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x540) -#define WLANDXE_DMA_CHAN6_BASE_ADDRESS (WLANDXE_REGISTER_BASE_ADDRESS + 0x580) - -/* Channel specific register offset */ -#define WLANDXE_DMA_CH_CTRL_REG 0x0000 -#define WLANDXE_DMA_CH_STATUS_REG 0x0004 -#define WLANDXE_DMA_CH_SZ_REG 0x0008 -#define WLANDXE_DMA_CH_SADRL_REG 0x000C -#define WLANDXE_DMA_CH_SADRH_REG 0x0010 -#define WLANDXE_DMA_CH_DADRL_REG 0x0014 -#define WLANDXE_DMA_CH_DADRH_REG 0x0018 -#define WLANDXE_DMA_CH_DESCL_REG 0x001C -#define WLANDXE_DMA_CH_DESCH_REG 0x0020 -#define WLANDXE_DMA_CH_LST_DESCL_REG 0x0024 -#define WLANDXE_DMA_CH_LST_DESCH_REG 0x0028 -#define WLANDXE_DMA_CH_BD_REG 0x002C -#define WLANDXE_DMA_CH_HEAD_REG 0x0030 -#define WLANDXE_DMA_CH_TAIL_REG 0x0034 -#define WLANDXE_DMA_CH_PDU_REG 0x0038 -#define WLANDXE_DMA_CH_TSTMP_REG 0x003C - -/* Common CSR Register Contorol mask and offset */ -#ifdef WCN_PRONTO -#define WLANDXE_DMA_CSR_RESERVED_MASK 0xFFFF0000 -#define WLANDXE_DMA_CSR_RESERVED_OFFSET 0x10 -#define WLANDXE_DMA_CSR_RESERVED_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK 0x8000 -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_OFFSET 0x0F -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_PAUSED_MASK 0x4000 -#define WLANDXE_DMA_CSR_PAUSED_OFFSET 0x0E -#define WLANDXE_DMA_CSR_PAUSED_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_ECTR_EN_MASK 0x2000 -#define WLANDXE_DMA_CSR_ECTR_EN_OFFSET 0x0D -#define WLANDXE_DMA_CSR_ECTR_EN_DEFAULT 0x2000 - -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_MASK 0x1F00 -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_OFFSET 0x08 -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_DEFAULT 0x0F00 - -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_MASK 0xF8 -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_OFFSET 0x03 -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_DEFAULT 0x28 - -#define WLANDXE_DMA_CSR_TSTMP_EN_MASK 0x04 -#define WLANDXE_DMA_CSR_TSTMP_EN_OFFSET 0x02 -#define WLANDXE_DMA_CSR_TSTMP_EN_DEFAULT 0x0 - -#define WLANDXE_DMA_CCU_DXE_RESET_MASK 0x4 -#else -#define WLANDXE_DMA_CSR_RESERVED_MASK 0xFFFE0000 -#define WLANDXE_DMA_CSR_RESERVED_OFFSET 0x11 -#define WLANDXE_DMA_CSR_RESERVED_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK 0x10000 -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_OFFSET 0x10 -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_PAUSED_MASK 0x8000 -#define WLANDXE_DMA_CSR_PAUSED_OFFSET 0xF -#define WLANDXE_DMA_CSR_PAUSED_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_ECTR_EN_MASK 0x4000 -#define WLANDXE_DMA_CSR_ECTR_EN_OFFSET 0xE -#define WLANDXE_DMA_CSR_ECTR_EN_DEFAULT 0x4000 - -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_MASK 0x3E00 -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_OFFSET 0x9 -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_DEFAULT 0xE00 - -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_MASK 0x1F0 -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_OFFSET 0x4 -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_DEFAULT 0x50 - -#define WLANDXE_DMA_CSR_TSTMP_EN_MASK 0x8 -#define WLANDXE_DMA_CSR_TSTMP_EN_OFFSET 0x3 -#define WLANDXE_DMA_CSR_TSTMP_EN_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_RESET_MASK 0x4 -#define WLANDXE_DMA_CSR_RESET_OFFSET 0x2 -#define WLANDXE_DMA_CSR_RESET_DEFAULT 0x0 -#endif /* WCN_PRONTO */ -#define WLANDXE_DMA_CSR_PAUSE_MASK 0x2 -#define WLANDXE_DMA_CSR_PAUSE_OFFSET 0x1 -#define WLANDXE_DMA_CSR_PAUSE_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_EN_MASK 0x1 -#define WLANDXE_DMA_CSR_EN_OFFSET 0x0 -#define WLANDXE_DMA_CSR_EN_DEFAULT 0x0 - -/* DXE CSR Master enable register value */ -#define WLANDXE_CSR_DEFAULT_ENABLE (WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK | \ - WLANDXE_DMA_CSR_ECTR_EN_MASK | \ - WLANDXE_DMA_CSR_EN_MASK) -/* Channel CTRL Register Control mask and offset */ -#define WLANDXE_CH_CTRL_RSVD_MASK 0x80000000 -#define WLANDXE_CH_CTRL_RSVD_OFFSET 0x1F -#define WLANDXE_CH_CTRL_RSVD_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_SWAP_MASK 0x80000000 - -#define WLANDXE_CH_CTRL_BDT_IDX_MASK 0x60000000 -#define WLANDXE_CH_CTRL_BDT_IDX_OFFSET 0x1D -#define WLANDXE_CH_CTRL_BDT_IDX_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_DFMT_MASK 0x10000000 -#define WLANDXE_CH_CTRL_DFMT_OFFSET 0x1C -#define WLANDXE_CH_CTRL_DFMT_DEFAULT 0x10000000 -#define WLANDXE_CH_CTRL_DFMT_ESHORT 0x0 -#define WLANDXE_CH_CTRL_DFMT_ELONG 0x1 - -#define WLANDXE_CH_CTRL_ABORT_MASK 0x8000000 -#define WLANDXE_CH_CTRL_ABORT_OFFSET 0x1B -#define WLANDXE_CH_CTRL_ABORT_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_ENDIAN_MASK 0x4000000 - -#define WLANDXE_CH_CTRL_CTR_SEL_MASK 0x3C00000 -#define WLANDXE_CH_CTRL_CTR_SEL_OFFSET 0x16 -#define WLANDXE_CH_CTRL_CTR_SEL_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_EDVEN_MASK 0x200000 -#define WLANDXE_CH_CTRL_EDVEN_OFFSET 0x15 -#define WLANDXE_CH_CTRL_EDVEN_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_EDEN_MASK 0x100000 -#define WLANDXE_CH_CTRL_EDEN_OFFSET 0x14 -#define WLANDXE_CH_CTRL_EDEN_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_INE_DONE_MASK 0x80000 -#define WLANDXE_CH_CTRL_INE_DONE_OFFSET 0x13 -#define WLANDXE_CH_CTRL_INE_DONE_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_INE_ERR_MASK 0x40000 -#define WLANDXE_CH_CTRL_INE_ERR_OFFSET 0x12 -#define WLANDXE_CH_CTRL_INE_ERR_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_INE_ED_MASK 0x20000 -#define WLANDXE_CH_CTRL_INE_ED_OFFSET 0x11 -#define WLANDXE_CH_CTRL_INE_ED_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_STOP_MASK 0x10000 -#define WLANDXE_CH_CTRL_STOP_OFFSET 0x10 -#define WLANDXE_CH_CTRL_STOP_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_PRIO_MASK 0xE000 -#define WLANDXE_CH_CTRL_PRIO_OFFSET 0xD -#define WLANDXE_CH_CTRL_PRIO_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_BTHLD_SEL_MASK 0x1E00 -#define WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET 0x9 -#define WLANDXE_CH_CTRL_BTHLD_SEL_DEFAULT 0x600 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD0 0x0 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD1 0x1 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD2 0x2 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD3 0x3 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD4 0x4 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD5 0x5 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD6 0x6 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD7 0x7 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD8 0x8 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD9 0x9 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD10 0xA -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD11 0xB -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD12 0xC -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD13 0xD -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD14 0xE -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD15 0xF - -#define WLANDXE_CH_CTRL_PDU_REL_MASK 0x100 -#define WLANDXE_CH_CTRL_PDU_REL_OFFSET 0x8 -#define WLANDXE_CH_CTRL_PDU_REL_DEFAULT 0x100 -#define WLANDXE_CH_CTRL_PDU_REL_EKEEP 0x0 -#define WLANDXE_CH_CTRL_PDU_REL_ERELEASE 0x1 - -#define WLANDXE_CH_CTRL_PIQ_MASK 0x80 -#define WLANDXE_CH_CTRL_PIQ_OFFSET 0x7 -#define WLANDXE_CH_CTRL_PIQ_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_PIQ_EFLAT 0x0 -#define WLANDXE_CH_CTRL_PIQ_EQUEUE 0x1 - -#define WLANDXE_CH_CTRL_DIQ_MASK 0x40 -#define WLANDXE_CH_CTRL_DIQ_OFFSET 0x6 -#define WLANDXE_CH_CTRL_DIQ_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_DIQ_EFLAT 0x0 -#define WLANDXE_CH_CTRL_DIQ_EQUEUE 0x1 - -#define WLANDXE_CH_CTRL_SIQ_MASK 0x20 -#define WLANDXE_CH_CTRL_SIQ_OFFSET 0x5 -#define WLANDXE_CH_CTRL_SIQ_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_SIQ_EFLAT 0x0 -#define WLANDXE_CH_CTRL_SIQ_EQUEUE 0x1 - -#define WLANDXE_CH_CTRL_BDH_MASK 0x10 -#define WLANDXE_CH_CTRL_BDH_OFFSET 0x4 -#define WLANDXE_CH_CTRL_BDH_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_EOP_MASK 0x8 -#define WLANDXE_CH_CTRL_EOP_OFFSET 0x3 -#define WLANDXE_CH_CTRL_EOP_DEFAULT 0x8 - -#define WLANDXE_CH_CTRL_XTYPE_MASK 0x6 -#define WLANDXE_CH_CTRL_XTYPE_OFFSET 0x1 -#define WLANDXE_CH_CTRL_XTYPE_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_XTYPE_EH2H 0x0 -#define WLANDXE_CH_CTRL_XTYPE_EB2B 0x1 -#define WLANDXE_CH_CTRL_XTYPE_EH2B 0x2 -#define WLANDXE_CH_CTRL_XTYPE_EB2H 0x3 - -#define WLANDXE_CH_CTRL_DONE_MASK 0x4 - -#define WLANDXE_CH_CTRL_ERR_MASK 0x20 - -#define WLANDXE_CH_CTRL_MASKED_MASK 0x8 - -#define WLANDXE_CH_CTRL_EN_MASK 0x1 -#define WLANDXE_CH_CTRL_EN_OFFSET 0x0 -#define WLANDXE_CH_CTRL_EN_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_DEFAULT 0x10000708 - - -#define WLANDXE_DESC_CTRL_VALID 0x00000001 -#define WLANDXE_DESC_CTRL_XTYPE_MASK 0x00000006 -#define WLANDXE_DESC_CTRL_XTYPE_H2H 0x00000000 -#define WLANDXE_DESC_CTRL_XTYPE_B2B 0x00000002 -#define WLANDXE_DESC_CTRL_XTYPE_H2B 0x00000004 -#define WLANDXE_DESC_CTRL_XTYPE_B2H 0x00000006 -#define WLANDXE_DESC_CTRL_EOP 0x00000008 -#define WLANDXE_DESC_CTRL_BDH 0x00000010 -#define WLANDXE_DESC_CTRL_SIQ 0x00000020 -#define WLANDXE_DESC_CTRL_DIQ 0x00000040 -#define WLANDXE_DESC_CTRL_PIQ 0x00000080 -#define WLANDXE_DESC_CTRL_PDU_REL 0x00000100 -#define WLANDXE_DESC_CTRL_BTHLD_SEL 0x00001E00 -#define WLANDXE_DESC_CTRL_PRIO 0x0000E000 -#define WLANDXE_DESC_CTRL_STOP 0x00010000 -#define WLANDXE_DESC_CTRL_INT 0x00020000 -#define WLANDXE_DESC_CTRL_BDT_SWAP 0x00100000 -#define WLANDXE_DESC_CTRL_ENDIANNESS 0x00200000 -#define WLANDXE_DESC_CTRL_DFMT 0x10000000 -#define WLANDXE_DESC_CTRL_RSVD 0xfffc0000 -/* CSR Register Control mask and offset */ - -#define WLANDXE_CH_STAT_INT_DONE_MASK 0x00008000 -#define WLANDXE_CH_STAT_INT_ERR_MASK 0x00004000 -#define WLANDXE_CH_STAT_INT_ED_MASK 0x00002000 - -#define WLANDXE_CH_STAT_MASKED_MASK 0x00000008 -#define WLANDXE_CH_STAT_ENABLED_MASK 0x00000001 -/* Till here WCNSS DXE register information - * This is temporary definition location to make compile and unit test - * If official msmreg.h integrated, this part will be eliminated */ - -/* Interrupt control channel mask */ -#define WLANDXE_INT_MASK_CHAN_0 0x00000001 -#define WLANDXE_INT_MASK_CHAN_1 0x00000002 -#define WLANDXE_INT_MASK_CHAN_2 0x00000004 -#define WLANDXE_INT_MASK_CHAN_3 0x00000008 -#define WLANDXE_INT_MASK_CHAN_4 0x00000010 -#define WLANDXE_INT_MASK_CHAN_5 0x00000020 -#define WLANDXE_INT_MASK_CHAN_6 0x00000040 - -#define WLANDXE_TX_LOW_RES_THRESHOLD (5) - -/* DXE Descriptor Endian swap macro */ -#ifdef WLANDXE_ENDIAN_SWAP_ENABLE -#define WLANDXE_U32_SWAP_ENDIAN(a) (((a & 0x000000FF) << 24) | \ - ((a & 0x0000FF00) << 8) | \ - ((a & 0x00FF0000) >> 8) | \ - ((a & 0xFF000000) >> 24)) -#else -/* If DXE HW does not need endian swap, DO NOTHING */ -#define WLANDXE_U32_SWAP_ENDIAN(a) (a) -#endif /* WLANDXE_ENDIAN_SWAP_ENABLE */ - -/* Log Definition will be mappped with PAL MSG */ -#define HDXE_MSG WPAL_TRACE -#define HDXE_ASSERT(a) VOS_ASSERT(a) - -/*---------------------------------------------------------------------------- - * Type Declarations - * -------------------------------------------------------------------------*/ -/* DMA Channel Q handle Method type - * Linear handle or circular */ -typedef enum -{ - WLANDXE_CHANNEL_HANDLE_LINEAR, - WLANDXE_CHANNEL_HANDLE_CIRCULA -}WLANDXE_ChannelHandleType; - -typedef enum -{ - WLANDXE_TX_COMP_INT_LR_THRESHOLD, - WLANDXE_TX_COMP_INT_PER_K_FRAMES, - WLANDXE_TX_COMP_INT_TIMER -} WLANDXE_TXCompIntEnableType; - -typedef enum -{ - WLANDXE_SHORT_DESCRIPTOR, - WLANDXE_LONG_DESCRIPTOR -} WLANDXE_DescriptorType; - -typedef enum -{ - WLANDXE_DMA_CHANNEL_0, - WLANDXE_DMA_CHANNEL_1, - WLANDXE_DMA_CHANNEL_2, - WLANDXE_DMA_CHANNEL_3, - WLANDXE_DMA_CHANNEL_4, - WLANDXE_DMA_CHANNEL_5, - WLANDXE_DMA_CHANNEL_6, - WLANDXE_DMA_CHANNEL_MAX -} WLANDXE_DMAChannelType; - -/** DXE HW Long Descriptor format */ -typedef struct -{ - wpt_uint32 srcMemAddrL; - wpt_uint32 srcMemAddrH; - wpt_uint32 dstMemAddrL; - wpt_uint32 dstMemAddrH; - wpt_uint32 phyNextL; - wpt_uint32 phyNextH; -} WLANDXE_LongDesc; - - -/** DXE HW Short Descriptor format */ -typedef struct tDXEShortDesc -{ - wpt_uint32 srcMemAddrL; - wpt_uint32 dstMemAddrL; - wpt_uint32 phyNextL; -} WLANDXE_ShortDesc; - - -/* DXE Descriptor Data Type - * Pick up from GEN5 */ -typedef struct -{ - union - { - wpt_uint32 ctrl; - wpt_uint32 valid :1; //0 = DMA stop, 1 = DMA continue with this descriptor - wpt_uint32 transferType :2; //0 = Host to Host space - wpt_uint32 eop :1; //End of Packet - wpt_uint32 bdHandling :1; //if transferType = Host to BMU, then 0 means first 128 bytes contain BD, and 1 means create new empty BD - wpt_uint32 siq :1; // SIQ - wpt_uint32 diq :1; // DIQ - wpt_uint32 pduRel :1; //0 = don't release BD and PDUs when done, 1 = release them - wpt_uint32 bthldSel :4; //BMU Threshold Select - wpt_uint32 prio :3; //Specifies the priority level to use for the transfer - wpt_uint32 stopChannel :1; //1 = DMA stops processing further, channel requires re-enabling after this - wpt_uint32 intr :1; //Interrupt on Descriptor Done - wpt_uint32 rsvd :1; //reserved - wpt_uint32 transferSize :14; //14 bits used - ignored for BMU transfers, only used for host to host transfers? - } descCtrl; - wpt_uint32 xfrSize; - union - { - WLANDXE_LongDesc dxe_long_desc; - WLANDXE_ShortDesc dxe_short_desc; - }dxedesc; -} WLANDXE_DescType; - -typedef struct -{ - void *nextCtrlBlk; - wpt_packet *xfrFrame; - WLANDXE_DescType *linkedDesc; - wpt_uint32 linkedDescPhyAddr; - wpt_uint32 ctrlBlkOrder; -#ifdef FEATURE_R33D - wpt_uint32 shadowBufferVa; -#endif /* FEATURE_R33D */ -} WLANDXE_DescCtrlBlkType; - -typedef struct -{ - /* Q handle method, linear or ring */ - WLANDXE_ChannelHandleType queueMethod; - - /* Number of descriptors for DXE that can be queued for transfer at one time */ - wpt_uint32 nDescs; - - /* Maximum number of receive buffers of shared memory to use for this pipe */ - wpt_uint32 nRxBuffers; - - /* Reference WQ - for H2B and B2H only */ - wpt_uint32 refWQ; - - /* for usb only, endpoint info for CH_SADR or CH_DADR */ - wpt_uint32 refEP; - - /* H2B(Tx), B2H(Rx), H2H(SRAM<->HostMem R/W) */ - wpt_uint32 xfrType; - - /* Channel Priority 7(Highest) - 0(Lowest) */ - wpt_uint32 chPriority; - - /* 1 = BD attached to frames for this pipe */ - wpt_boolean bdPresent; - - wpt_uint32 chk_size; - - wpt_uint32 bmuThdSel; - - /* Added in Gen5 for Prefetch */ - wpt_boolean useLower4G; - - wpt_boolean useShortDescFmt; - /* Till here inharited from GEN5 code */ - /* From now on, added for PRIMA */ -} WLANDXE_ChannelConfigType; - -typedef struct -{ - wpt_uint32 chDXEBaseAddr; - wpt_uint32 chDXEStatusRegAddr; - wpt_uint32 chDXEDesclRegAddr; - wpt_uint32 chDXEDeschRegAddr; - wpt_uint32 chDXELstDesclRegAddr; - wpt_uint32 chDXECtrlRegAddr; - wpt_uint32 chDXESzRegAddr; - wpt_uint32 chDXEDadrlRegAddr; - wpt_uint32 chDXEDadrhRegAddr; - wpt_uint32 chDXESadrlRegAddr; - wpt_uint32 chDXESadrhRegAddr; -} WLANDXE_ChannelRegisterType; - -typedef struct -{ - wpt_uint32 refWQ_swapped; - wpt_boolean chEnabled; - wpt_boolean chConfigured; - wpt_uint32 channel; - wpt_uint32 chk_size_mask; - wpt_uint32 bmuThdSel_mask; - wpt_uint32 cw_ctrl_read; - wpt_uint32 cw_ctrl_write; - wpt_uint32 cw_ctrl_write_valid; - wpt_uint32 cw_ctrl_write_eop; - wpt_uint32 cw_ctrl_write_eop_int; - wpt_uint32 chan_mask; - wpt_uint32 chan_mask_read_disable; - wpt_uint32 intMask; -} WLANDXE_ChannelExConfigType; - -typedef struct -{ - WDTS_ChannelType channelType; - WLANDXE_DescCtrlBlkType *headCtrlBlk; - WLANDXE_DescCtrlBlkType *tailCtrlBlk; -#if !(defined(FEATURE_R33D) || defined(WLANDXE_TEST_CHANNEL_ENABLE)) - WLANDXE_DescType *descriptorAllocation; -#endif - WLANDXE_DescType *DescBottomLoc; - wpt_uint32 descBottomLocPhyAddr; - wpt_uint32 numDesc; - wpt_uint32 numFreeDesc; - wpt_uint32 numRsvdDesc; - wpt_uint32 maxFrameSize; - wpt_uint32 numFragmentCurrentChain; - wpt_uint32 numFrameBeforeInt; - wpt_uint32 numTotalFrame; - wpt_mutex dxeChannelLock; - wpt_boolean hitLowResource; - WLANDXE_ChannelConfigType channelConfig; - WLANDXE_ChannelRegisterType channelRegister; - WLANDXE_ChannelExConfigType extraConfig; - WLANDXE_DMAChannelType assignedDMAChannel; - wpt_uint64 rxDoneHistogram; - wpt_timer healthMonitorTimer; - wpt_msg *healthMonitorMsg; -} WLANDXE_ChannelCBType; - -typedef struct -{ - WLANDXE_TXCompIntEnableType txIntEnable; - unsigned int txLowResourceThreshold_LoPriCh; - unsigned int txLowResourceThreshold_HiPriCh; - unsigned int rxLowResourceThreshold; - unsigned int txInterruptEnableFrameCount; - unsigned int txInterruptEnablePeriod; -} WLANDXE_TxCompIntConfigType; - -typedef struct -{ - WLANDXE_ChannelCBType dxeChannel[WDTS_CHANNEL_MAX]; - WLANDXE_RxFrameReadyCbType rxReadyCB; - WLANDXE_TxCompleteCbType txCompCB; - WLANDXE_LowResourceCbType lowResourceCB; - WLANDXE_TxCompIntConfigType txCompInt; - void *clientCtxt; - wpt_uint32 interruptPath; - wpt_msg *rxIsrMsg; - wpt_msg *txIsrMsg; - wpt_msg *rxPktAvailMsg; - volatile WLANDXE_PowerStateType hostPowerState; - wpt_boolean rxIntDisabledByIMPS; - wpt_boolean txIntDisabledByIMPS; - WLANDXE_SetPowerStateCbType setPowerStateCb; - volatile WLANDXE_RivaPowerStateType rivaPowerState; - wpt_boolean ringNotEmpty; - wpt_boolean txIntEnable; - wpt_uint32 txCompletedFrames; - wpt_uint8 ucTxMsgCnt; - wpt_uint16 lastKickOffDxe; - wpt_uint32 dxeCookie; - wpt_packet *freeRXPacket; - wpt_boolean rxPalPacketUnavailable; - wpt_boolean driverReloadInProcessing; - wpt_boolean smsmToggled; - wpt_timer rxResourceAvailableTimer; - wpt_timer dxeSSRTimer; -} WLANDXE_CtrlBlkType; - -/*========================================================================== - @ Function Name - dxeCommonDefaultConfig - - @ Description - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - - @ Return - wpt_status - -===========================================================================*/ -extern wpt_status dxeCommonDefaultConfig -( - WLANDXE_CtrlBlkType *dxeCtrlBlk -); - -/*========================================================================== - @ Function Name - dxeChannelDefaultConfig - - @ Description - Get defualt configuration values from pre defined structure - All the channels must have it's own configurations - - @ Parameters - WLANDXE_CtrlBlkType *dxeCtrlBlk, - DXE host driver main control block - WLANDXE_ChannelCBType *channelEntry - Channel specific control block - - @ Return - wpt_status - -===========================================================================*/ -extern wpt_status dxeChannelDefaultConfig -( - WLANDXE_CtrlBlkType *dxeCtrlBlk, - WLANDXE_ChannelCBType *channelEntry -); - -#endif /* WLAN_QCT_DXE_I_H */ diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index 7e9c869c280d..1bb4c40b5174 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -1278,28 +1278,29 @@ static VOS_STATUS hdd_roamRegisterSTA( hdd_adapter_t *pAdapter, return( vosStatus ); } -static void hdd_SendReAssocEvent(struct net_device *dev, hdd_adapter_t *pAdapter, - tCsrRoamInfo *pCsrRoamInfo, v_U8_t *reqRsnIe, tANI_U32 reqRsnLength) +static void hdd_SendReAssocEvent(struct net_device *dev, + hdd_adapter_t *pAdapter, + tCsrRoamInfo *pCsrRoamInfo, v_U8_t *reqRsnIe, + tANI_U32 reqRsnLength) { unsigned int len = 0; u8 *pFTAssocRsp = NULL; - hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); v_U8_t *rspRsnIe = kmalloc(IW_GENERIC_IE_MAX, GFP_KERNEL); tANI_U32 rspRsnLength = 0; struct ieee80211_channel *chan; if (!rspRsnIe) { - hddLog(LOGE, "%s: Unable to allocate RSN IE", __func__); + hddLog(LOGE, FL("Unable to allocate RSN IE")); return; } if (pCsrRoamInfo == NULL) { - hddLog(LOGE, "%s: Invalid CSR roam info", __func__); + hddLog(LOGE, FL("Invalid CSR roam info")); goto done; } if (pCsrRoamInfo->nAssocRspLength == 0) { - hddLog(LOGE, "%s: Invalid assoc response length", __func__); + hddLog(LOGE, FL("Invalid assoc response length")); goto done; } @@ -1308,29 +1309,20 @@ static void hdd_SendReAssocEvent(struct net_device *dev, hdd_adapter_t *pAdapter if (pFTAssocRsp == NULL) goto done; - //pFTAssocRsp needs to point to the IEs + /* pFTAssocRsp needs to point to the IEs */ pFTAssocRsp += FT_ASSOC_RSP_IES_OFFSET; - hddLog(LOG1, "%s: AssocRsp is now at %02x%02x", __func__, - (unsigned int)pFTAssocRsp[0], - (unsigned int)pFTAssocRsp[1]); - - /* Active session count is decremented upon disconnection, but during - * roaming, there is no disconnect indication and hence active session - * count is not decremented. - * After roaming is completed, active session count is incremented - * as a part of connect indication but effectively after roaming the - * active session count should still be the same and hence upon - * successful reassoc decrement the active session count here */ - wlan_hdd_decr_active_session(pHddCtx, pAdapter->device_mode); + hddLog(LOG1, FL("AssocRsp is now at %02x%02x"), + (unsigned int)pFTAssocRsp[0], (unsigned int)pFTAssocRsp[1]); - // Send the Assoc Resp, the supplicant needs this for initial Auth. + /* Send the Assoc Resp, the supplicant needs this for initial Auth */ len = pCsrRoamInfo->nAssocRspLength - FT_ASSOC_RSP_IES_OFFSET; rspRsnLength = len; memcpy(rspRsnIe, pFTAssocRsp, len); memset(rspRsnIe + len, 0, IW_GENERIC_IE_MAX - len); - chan = ieee80211_get_channel(pAdapter->wdev.wiphy, (int) pCsrRoamInfo->pBssDesc->channelId); - cfg80211_roamed(dev,chan,pCsrRoamInfo->bssid, + chan = ieee80211_get_channel(pAdapter->wdev.wiphy, + (int)pCsrRoamInfo->pBssDesc->channelId); + cfg80211_roamed(dev, chan, pCsrRoamInfo->bssid, reqRsnIe, reqRsnLength, rspRsnIe, rspRsnLength,GFP_KERNEL); done: diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index b29608b4331a..1a1f0d9465ad 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 0 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 166 +#define QWLAN_VERSION_BUILD 167 -#define QWLAN_VERSIONSTR "1.0.0.166" +#define QWLAN_VERSIONSTR "1.0.0.167" #ifdef QCA_WIFI_2_0 diff --git a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c index dd7b7fbddfb5..2609c35ae18d 100644 --- a/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessDeauthFrame.c @@ -150,10 +150,12 @@ limProcessDeauthFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tpPESession p PELOGE(limLog(pMac, LOGE, FL("Received Deauth frame for Addr: "MAC_ADDRESS_STR" (mlm state = %s," - " sme state = %d systemrole = %d) with reason code %d from " + " sme state = %d systemrole = %d) with reason code %d [%s] from " MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pHdr->da), - limMlmStateStr(psessionEntry->limMlmState), psessionEntry->limSmeState, + limMlmStateStr(psessionEntry->limMlmState), + psessionEntry->limSmeState, psessionEntry->limSystemRole, reasonCode, + limDot11ReasonStr(reasonCode), MAC_ADDR_ARRAY(pHdr->sa));) if (limCheckDisassocDeauthAckPending(pMac, (tANI_U8*)pHdr->sa)) diff --git a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c index 7d963b666aa8..5a4312ef300a 100644 --- a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c @@ -127,8 +127,9 @@ limProcessDisassocFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tpPESession PELOG2(limLog(pMac, LOGE, FL("Received Disassoc frame for Addr: "MAC_ADDRESS_STR"(mlm state=%s, sme state=%d)," - "with reason code %d from "MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pHdr->da), - limMlmStateStr(psessionEntry->limMlmState), psessionEntry->limSmeState, reasonCode, + "with reason code %d [%s] from "MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pHdr->da), + limMlmStateStr(psessionEntry->limMlmState), psessionEntry->limSmeState, + reasonCode, limDot11ReasonStr(reasonCode), MAC_ADDR_ARRAY(pHdr->sa));) /** diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index 14468be14a3f..887119edbc7c 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -231,6 +231,64 @@ limGetBssidFromBD(tpAniSirGlobal pMac, tANI_U8 * pRxPacketInfo, tANI_U8 *bssId, } } + +char * +limDot11ReasonStr(tANI_U16 reasonCode) +{ + switch (reasonCode) + { + case 0: return " "; + CASE_RETURN_STRING(eSIR_MAC_UNSPEC_FAILURE_REASON); + CASE_RETURN_STRING(eSIR_MAC_PREV_AUTH_NOT_VALID_REASON); + CASE_RETURN_STRING(eSIR_MAC_DEAUTH_LEAVING_BSS_REASON); + CASE_RETURN_STRING(eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON); + CASE_RETURN_STRING(eSIR_MAC_DISASSOC_DUE_TO_DISABILITY_REASON); + CASE_RETURN_STRING(eSIR_MAC_CLASS2_FRAME_FROM_NON_AUTH_STA_REASON); + CASE_RETURN_STRING(eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON); + CASE_RETURN_STRING(eSIR_MAC_DISASSOC_LEAVING_BSS_REASON); + CASE_RETURN_STRING(eSIR_MAC_STA_NOT_PRE_AUTHENTICATED_REASON); + CASE_RETURN_STRING(eSIR_MAC_PWR_CAPABILITY_BAD_REASON); + CASE_RETURN_STRING(eSIR_MAC_SPRTD_CHANNELS_BAD_REASON); + + CASE_RETURN_STRING(eSIR_MAC_INVALID_IE_REASON); + CASE_RETURN_STRING(eSIR_MAC_MIC_FAILURE_REASON); + CASE_RETURN_STRING(eSIR_MAC_4WAY_HANDSHAKE_TIMEOUT_REASON); + CASE_RETURN_STRING(eSIR_MAC_GR_KEY_UPDATE_TIMEOUT_REASON); + CASE_RETURN_STRING(eSIR_MAC_RSN_IE_MISMATCH_REASON); + + CASE_RETURN_STRING(eSIR_MAC_INVALID_MC_CIPHER_REASON); + CASE_RETURN_STRING(eSIR_MAC_INVALID_UC_CIPHER_REASON); + CASE_RETURN_STRING(eSIR_MAC_INVALID_AKMP_REASON); + CASE_RETURN_STRING(eSIR_MAC_UNSUPPORTED_RSN_IE_VER_REASON); + CASE_RETURN_STRING(eSIR_MAC_INVALID_RSN_CAPABILITIES_REASON); + CASE_RETURN_STRING(eSIR_MAC_1X_AUTH_FAILURE_REASON); + CASE_RETURN_STRING(eSIR_MAC_CIPHER_SUITE_REJECTED_REASON); +#ifdef FEATURE_WLAN_TDLS + CASE_RETURN_STRING(eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE); + CASE_RETURN_STRING(eSIR_MAC_TDLS_TEARDOWN_UNSPEC_REASON); +#endif + /* Reserved 27 - 30*/ +#ifdef WLAN_FEATURE_11W + CASE_RETURN_STRING(eSIR_MAC_ROBUST_MGMT_FRAMES_POLICY_VIOLATION); +#endif + CASE_RETURN_STRING(eSIR_MAC_QOS_UNSPECIFIED_REASON); + CASE_RETURN_STRING(eSIR_MAC_QAP_NO_BANDWIDTH_REASON); + CASE_RETURN_STRING(eSIR_MAC_XS_UNACKED_FRAMES_REASON); + CASE_RETURN_STRING(eSIR_MAC_BAD_TXOP_USE_REASON); + CASE_RETURN_STRING(eSIR_MAC_PEER_STA_REQ_LEAVING_BSS_REASON); + CASE_RETURN_STRING(eSIR_MAC_PEER_REJECT_MECHANISIM_REASON); + CASE_RETURN_STRING(eSIR_MAC_MECHANISM_NOT_SETUP_REASON); + + CASE_RETURN_STRING(eSIR_MAC_PEER_TIMEDOUT_REASON); + CASE_RETURN_STRING(eSIR_MAC_CIPHER_NOT_SUPPORTED_REASON); + CASE_RETURN_STRING(eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON); + /* Reserved 47 - 65535 */ + default: + return "Unknown"; + } +} + + char * limMlmStateStr(tLimMlmStates state) { diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h index 9ec2556ff79c..660d495914bf 100644 --- a/CORE/MAC/src/pe/lim/limUtils.h +++ b/CORE/MAC/src/pe/lim/limUtils.h @@ -117,6 +117,7 @@ typedef struct op_class_map { }op_class_map_t; // LIM utility functions void limGetBssidFromPkt(tpAniSirGlobal, tANI_U8 *, tANI_U8 *, tANI_U32 *); +char * limDot11ReasonStr(tANI_U16 reasonCode); char * limMlmStateStr(tLimMlmStates state); char * limSmeStateStr(tLimSmeStates state); char * limMsgStr(tANI_U32 msgType); diff --git a/CORE/SERVICES/HIF/DXE/dmux_dxe.c b/CORE/SERVICES/HIF/DXE/dmux_dxe.c deleted file mode 100644 index 42b25c967213..000000000000 --- a/CORE/SERVICES/HIF/DXE/dmux_dxe.c +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** - * @file dmux_dxe.c - * @brief Provide functions to demux receive frames. - * @details - * This file contains functions for demuxing receive frames (from HIF_DXE) into 3 categories - * RX data frames - * RX management frames - * RX messages (HTT_ISOC_T2H_*, e.g. HTT_ISOC_T2H_MSG_TYPE_PEER_INFO) - * - * Clients can register callbacks for each type of receive frame. - */ - -#include "adf_os_mem.h" /* adf_os_mem_alloc */ -#include "isoc_hw_desc.h" /* RX BD */ - -#include "ieee80211_common.h" /* struct ieee80211_frame */ - -#include "dmux_dxe_api.h" -#include "dmux_dxe_internal.h" - -#define ATH_MODULE_NAME dmux_dxe -#include "a_debug.h" - -#define DMUX_DXE_DEBUG ATH_DEBUG_MAKE_MODULE_MASK(0) - -#if defined(DEBUG) -static ATH_DEBUG_MASK_DESCRIPTION g_DebugDescription[] = { - {DMUX_DXE_DEBUG, "dmux_dxe"}, -}; - -ATH_DEBUG_INSTANTIATE_MODULE_VAR(dmux_dxe, - "dmux_dxe", - "DMUX DXE", - ATH_DEBUG_MASK_DEFAULTS | ATH_DEBUG_INFO | DMUX_DXE_DEBUG, - ATH_DEBUG_DESCRIPTION_COUNT(g_DebugDescription), - g_DebugDescription); -#endif - -//PS TEST - need to put this in a common location -#define HIF_DXE_RX_BUFFER_SIZE 2612 - -enum dmux_dxe_frame_type { - DMUX_DXE_FRAME_TYPE_DATA = 0, - DMUX_DXE_FRAME_TYPE_MGMT = 1, - DMUX_DXE_FRAME_TYPE_CTRL = 2, - DMUX_DXE_FRAME_TYPE_MESSAGE = 3, - DMUX_DXE_FRAME_TYPE_UNKNOWN = 255 -}; - -/* Local globals */ -static struct dmux_dxe_pdev_t *g_pdev = NULL; - - -#ifdef BIG_ENDIAN_HOST -#define dmux_dxe_rx_bd_swap(rx_bd) -#else -static inline void dmux_dxe_rx_bd_swap(isoc_rx_bd_t *rx_bd) -{ - isoc_hw_bd_swap_bytes32((char *) rx_bd, sizeof(*rx_bd)); -} -#endif - -//static enum A_BOOL -static A_BOOL -dmux_dxe_validate_frame(adf_nbuf_t rx_frame) -{ - isoc_rx_bd_t *rx_bd; - struct ieee80211_frame *dot11frame; - a_uint8_t mpdu_header_offset, mpdu_header_length; - a_uint16_t mpdu_data_offset; - a_uint16_t mpdu_length; /* entire mpdu length (header + data) */ - A_BOOL amsdu_subframe; - A_BOOL amsdu_subframe_first; - a_uint8_t frame_type_subtype; - - rx_bd = (isoc_rx_bd_t *)adf_nbuf_data(rx_frame); - - /* Convert to host byte format */ - dmux_dxe_rx_bd_swap(rx_bd); - - if (rx_bd->htt_t2h_msg) { - //PS TEST - TODO - any special validation for HTT_T2H messages? - return TRUE; - } - - /* Validate BD */ - mpdu_header_offset = rx_bd->mpdu_header_offset; - mpdu_header_length = rx_bd->mpdu_header_length; - mpdu_data_offset = rx_bd->mpdu_data_offset; - mpdu_length = rx_bd->mpdu_length; - - if ((mpdu_data_offset <= mpdu_header_offset) || (mpdu_length < mpdu_header_length)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: BE header corrupt - dropping frame.\n", __FUNCTION__)); - return FALSE; - } - - amsdu_subframe = rx_bd->amsdu; - amsdu_subframe_first = rx_bd->amsdu_first; - - if ((mpdu_header_offset < sizeof(*rx_bd)) && (!(amsdu_subframe && !amsdu_subframe_first))) { - /* AMSDU case, ucMPDUHOffset = 0 it should be handled separately. Drop packet */ - return FALSE; - } - - /* A-MSDU frame, but not first sub-frame - * No MPDU header, MPDU header offset is 0 - * Total frame size is actual frame size + MPDU data offset - */ - if ((mpdu_header_offset < sizeof(*rx_bd)) && (amsdu_subframe && !amsdu_subframe_first)) { - mpdu_header_offset = mpdu_data_offset; - } - - if (HIF_DXE_RX_BUFFER_SIZE < (mpdu_length + mpdu_header_offset)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Invalid frame size, possible memory corruption - dropping frame.\n", __FUNCTION__)); - return FALSE; - } - - /* Update RX BD */ - //PS TEST - NOTE - this is uncached memory. We might consider keeping a cached RX SW DESC - rx_bd->mpdu_header_offset = mpdu_header_offset; - - /* - * Fix HW reported frame type as typeSubtype in BD is not reliable. - * Determine frame type (data/mgmt) from 802.11 MAC header. - */ - frame_type_subtype = IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS; - if (0 == rx_bd->frame_translate) - { - if(!amsdu_subframe) - { - dot11frame = (struct ieee80211_frame *)(((a_uint8_t *)rx_bd) + mpdu_header_offset); - frame_type_subtype = dot11frame->i_fc[0]; - } - else if(amsdu_subframe_first) - { - //Only the first subframe in AMSDU Contains the 80211 Header . For Following Subframes the frame_type_subtype is already initialized above - dot11frame = (struct ieee80211_frame *)(((a_uint8_t *)rx_bd) + sizeof(*rx_bd)); - frame_type_subtype = dot11frame->i_fc[0]; - } - } - - rx_bd->frame_type_subtype = frame_type_subtype; - - return TRUE; -} - -static inline enum dmux_dxe_frame_type -dmux_dxe_determine_frame_type(adf_nbuf_t rx_frame, E_HIFDXE_CHANNELTYPE channel_type) -{ - isoc_rx_bd_t *rx_bd; - - /* DXE channel allocation - * HIFDXE_CHANNEL_RX_LOW_PRI - data, ctrl (BAR), HTT_T2H messages - * HIFDXE_CHANNEL_RX_HIGH_PRI - data, ctrl (BAR), HTT_T2H messages, mgmt - */ - - rx_bd = (isoc_rx_bd_t *)adf_nbuf_data(rx_frame); - - if (rx_bd->htt_t2h_msg) { - return DMUX_DXE_FRAME_TYPE_MESSAGE; - } - - switch ((rx_bd->frame_type_subtype & IEEE80211_FC0_TYPE_MASK)) { - case IEEE80211_FC0_TYPE_DATA: - return DMUX_DXE_FRAME_TYPE_DATA; - case IEEE80211_FC0_TYPE_MGT: - return DMUX_DXE_FRAME_TYPE_MGMT; - case IEEE80211_FC0_TYPE_CTL: - return DMUX_DXE_FRAME_TYPE_CTRL; - default: - return DMUX_DXE_FRAME_TYPE_UNKNOWN; - } -} - -static void -dmux_dxe_indicate_frame_list(dmux_dxe_handle pdev, adf_nbuf_t rx_frame_list, - enum dmux_dxe_frame_type frame_type, - E_HIFDXE_CHANNELTYPE chan_type) -{ - adf_nbuf_t rx_frame; - - switch (frame_type) - { - case DMUX_DXE_FRAME_TYPE_DATA: - if (pdev->rx_data_cb) { - pdev->rx_data_cb(pdev->rx_data_context, rx_frame_list, chan_type); - return; - } - break; - case DMUX_DXE_FRAME_TYPE_MGMT: - if (pdev->rx_mgmt_cb) { - pdev->rx_mgmt_cb(pdev->rx_mgmt_context, rx_frame_list); - return; - } - break; - case DMUX_DXE_FRAME_TYPE_CTRL: - if (pdev->rx_ctrl_cb) { - pdev->rx_ctrl_cb(pdev->rx_ctrl_context, rx_frame_list); - return; - } - break; - case DMUX_DXE_FRAME_TYPE_MESSAGE: - if (pdev->msg_cb) { - pdev->msg_cb( pdev->msg_context, rx_frame_list); - return; - } - break; - default: - adf_os_assert(0); - break; - } - - /* No callback registered or unknown frame type - free frame list */ - rx_frame = rx_frame_list; - while (rx_frame) { - adf_nbuf_t rx_frame_next = adf_nbuf_next(rx_frame); - adf_nbuf_set_next(rx_frame, NULL); - adf_nbuf_free(rx_frame); - rx_frame = rx_frame_next; - } -} - -/* RX Callback from HIF_DXE */ -static A_STATUS -dmux_dxe_rx(void *pContext, adf_nbuf_t rx_list, E_HIFDXE_CHANNELTYPE channel_type) -{ - dmux_dxe_handle pdev = pContext; - adf_nbuf_t rx_frame, rx_frame_prev, indication_list; - enum dmux_dxe_frame_type frame_type, frame_type_prev = DMUX_DXE_FRAME_TYPE_UNKNOWN; - - if (!pdev || !rx_list) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Invalid handle.\n", __FUNCTION__)); - return A_EINVAL; - } - - rx_frame = indication_list = rx_list; - rx_frame_prev = NULL; - - while (rx_frame) { - - /* Validate frame */ - if (!dmux_dxe_validate_frame(rx_frame)) { - - /* Invalid frame - drop */ - adf_nbuf_t next = adf_nbuf_next(rx_frame); - - if (rx_frame_prev) { - /* remove invalid frame from indication list */ - adf_nbuf_set_next(rx_frame_prev, next); - } else { - /* start of indication list -> update indication list head */ - indication_list = next; - } - - adf_nbuf_free(rx_frame); - - /* next */ - rx_frame = next; - continue; - } - - /* Determine frame type (rx data, rx mgmt, HTT message) */ - frame_type = dmux_dxe_determine_frame_type(rx_frame, channel_type); - - /* If a different frame type is encountered, indicate the prior frames as a single list */ - if (rx_frame_prev && (frame_type != frame_type_prev)) { - /* terminate list */ - adf_nbuf_set_next(rx_frame_prev, NULL); - - /* Indicate frames */ - dmux_dxe_indicate_frame_list( - pdev, indication_list, frame_type_prev, channel_type); - - /* new indication list */ - indication_list = rx_frame; - } - - /* next */ - frame_type_prev = frame_type; - rx_frame_prev = rx_frame; - rx_frame = adf_nbuf_next(rx_frame); - } - - if (rx_frame_prev) { - /* terminate list */ - adf_nbuf_set_next(rx_frame_prev, NULL); - - /* Indicate frames */ - dmux_dxe_indicate_frame_list(pdev, indication_list, frame_type_prev, channel_type); - } - - return A_OK; -} - - -dmux_dxe_handle -dmux_dxe_attach(adf_os_device_t osdev) -{ - S_HIFDXE_CALLBACK hif_dxe_callbacks = {0}; - A_STATUS status; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - if (g_pdev) { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("%s : dmux_dxe object already allocated. Return existing object.\n", __FUNCTION__)); - adf_os_atomic_inc(&g_pdev->ref_count); - return g_pdev; - } - - g_pdev = adf_os_mem_alloc(osdev, sizeof(struct dmux_dxe_pdev_t)); - if (NULL == g_pdev) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s : dmux_dxe object allocation failure.\n", __FUNCTION__)); - return NULL; - } - adf_os_mem_zero(g_pdev, sizeof(*g_pdev)); - - adf_os_atomic_init(&g_pdev->ref_count); - adf_os_atomic_inc(&g_pdev->ref_count); - - /* Attach to HIF_DXE */ - g_pdev->h_hif_dxe = hif_dxe_attach(osdev); - if (!g_pdev->h_hif_dxe) { - goto fail; - } - - /* Register RX callback with HIF_DXE */ - hif_dxe_callbacks.HifRxReadyCb = dmux_dxe_rx; - hif_dxe_callbacks.HifRxReadyCtx = g_pdev; - status = hif_dxe_client_registration(g_pdev->h_hif_dxe, &hif_dxe_callbacks); - if (A_OK != status) { - goto fail; - } - - return g_pdev; - -fail: - dmux_dxe_detach(g_pdev); - return NULL; -} - -void dmux_dxe_detach(dmux_dxe_handle pdev) -{ - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - if ((NULL == pdev) || (pdev != g_pdev)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("dmux_dxe_detach: Invalid handle.\n")); - return; - } - - if (!adf_os_atomic_dec_and_test(&pdev->ref_count)) { - /* there are other clients still using dmux_dxe */ - return; - } - - if (pdev->h_hif_dxe) { - hif_dxe_detach(pdev->h_hif_dxe); - } - - /* - * Zero out the pdev object before freeing it. - * This will make it more obvious if anyone tries to use it - * after it has been freed. - */ - adf_os_mem_zero(pdev, sizeof(*pdev)); - adf_os_mem_free(pdev); - pdev = g_pdev = NULL; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); -} - -A_STATUS -dmux_dxe_register_callback_rx_mgmt( - dmux_dxe_handle pdev, dmux_dxe_mgmt_cb rx_mgmt_cb, void *rx_mgmt_context) -{ - if ((NULL == pdev) || (pdev != g_pdev)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Invalid handle.\n", __FUNCTION__)); - return A_EINVAL; - } - - pdev->rx_mgmt_cb = rx_mgmt_cb; - pdev->rx_mgmt_context = rx_mgmt_context; - - return A_OK; -} - -A_STATUS -dmux_dxe_register_callback_rx_ctrl( - dmux_dxe_handle pdev, dmux_dxe_ctrl_cb rx_ctrl_cb, void *rx_ctrl_context) -{ - if ((NULL == pdev) || (pdev != g_pdev)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Invalid handle.\n", __FUNCTION__)); - return A_EINVAL; - } - - pdev->rx_ctrl_cb = rx_ctrl_cb; - pdev->rx_ctrl_context = rx_ctrl_context; - - return A_OK; -} - -A_STATUS -dmux_dxe_register_callback_rx_data( - dmux_dxe_handle pdev, dmux_dxe_data_cb rx_data_cb, void *rx_data_context) -{ - if ((NULL == pdev) || (pdev != g_pdev)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Invalid handle.\n", __FUNCTION__)); - return A_EINVAL; - } - - pdev->rx_data_cb = rx_data_cb; - pdev->rx_data_context = rx_data_context; - - return A_OK; -} - -A_STATUS -dmux_dxe_register_callback_msg( - dmux_dxe_handle pdev, dmux_dxe_msg_cb msg_cb, void *msg_context) -{ - if ((NULL == pdev) || (pdev != g_pdev)) { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Invalid handle.\n", __FUNCTION__)); - return A_EINVAL; - } - - pdev->msg_cb = msg_cb; - pdev->msg_context = msg_context; - - return A_OK; -} diff --git a/CORE/SERVICES/HIF/DXE/dmux_dxe_api.h b/CORE/SERVICES/HIF/DXE/dmux_dxe_api.h deleted file mode 100644 index b32d838c901a..000000000000 --- a/CORE/SERVICES/HIF/DXE/dmux_dxe_api.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** - * @file dmux_dxe_api.h - * @brief Define the API to the dmux_dxe module - */ -#ifndef _DMUX_DXE_API__H_ -#define _DMUX_DXE_API__H_ - -#include <adf_os_types.h> /* adf_os_device_t */ -#include <adf_nbuf.h> /* adf_nbuf_t */ - -#include <athdefs.h> /* A_STATUS */ - -#include "hif_dxe.h" /* E_HIFDXE_CHANNELTYPE */ - -/* define an opaque handle to a dmux_dxe object */ -struct dmux_dxe_pdev_t; -typedef struct dmux_dxe_pdev_t *dmux_dxe_handle; - - -dmux_dxe_handle -dmux_dxe_attach(adf_os_device_t osdev); - -void dmux_dxe_detach(dmux_dxe_handle pdev); - - -typedef void (*dmux_dxe_ctrl_cb)(void *context, adf_nbuf_t info); - -/** - * @brief - * allow clients to register for rx control frame callbacks - */ -A_STATUS -dmux_dxe_register_callback_rx_ctrl( - dmux_dxe_handle pdev, dmux_dxe_ctrl_cb rx_ctrl_cb, void *rx_ctrl_context); - - -typedef void (*dmux_dxe_mgmt_cb)(void *context, adf_nbuf_t info); - -/** - * @brief - * allow clients to register for rx management frame callbacks - */ -A_STATUS -dmux_dxe_register_callback_rx_mgmt( - dmux_dxe_handle pdev, dmux_dxe_mgmt_cb rx_mgmt_cb, void *rx_mgmt_context); - - -typedef void -(*dmux_dxe_data_cb)(void *context, adf_nbuf_t info, E_HIFDXE_CHANNELTYPE chan); - -/** - * @brief - * allow clients to register for rx data frame callbacks - */ -A_STATUS -dmux_dxe_register_callback_rx_data( - dmux_dxe_handle pdev, dmux_dxe_data_cb rx_data_cb, void *rx_data_context); - - -typedef void (*dmux_dxe_msg_cb)(void *context, adf_nbuf_t info); - -/** - * @brief - * allow clients to register for HTT T2H message callbacks - */ -A_STATUS -dmux_dxe_register_callback_msg( - dmux_dxe_handle pdev, dmux_dxe_msg_cb msg_cb, void *msg_context); - - -#endif /* _DMUX_DXE_API__H_ */ diff --git a/CORE/SERVICES/HIF/DXE/dmux_dxe_internal.h b/CORE/SERVICES/HIF/DXE/dmux_dxe_internal.h deleted file mode 100644 index 59366f33a68f..000000000000 --- a/CORE/SERVICES/HIF/DXE/dmux_dxe_internal.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -#ifndef _DMUX_DXE_INTERNAL__H_ -#define _DMUX_DXE_INTERNAL__H_ - -#include <athdefs.h> /* A_STATUS */ -#include <adf_nbuf.h> /* adf_nbuf_t */ -#include <adf_os_types.h> /* adf_os_device_t, adf_os_print */ -#include <adf_os_atomic.h> - -#include <hif_dxe.h> /* E_HIFDXE_CHANNELTYPE */ - -struct dmux_dxe_pdev_t { - adf_os_atomic_t ref_count; /* module reference count */ - hif_dxe_handle h_hif_dxe; - dmux_dxe_data_cb rx_data_cb; - dmux_dxe_mgmt_cb rx_mgmt_cb; - dmux_dxe_ctrl_cb rx_ctrl_cb; - dmux_dxe_msg_cb msg_cb; /* callback for HTT T2H message */ - void *rx_data_context; - void *rx_mgmt_context; - void *rx_ctrl_context; - void *msg_context; -}; - -#endif /* _DMUX_DXE_INTERNAL__H_ */ diff --git a/CORE/SERVICES/HIF/DXE/hif_dxe.c b/CORE/SERVICES/HIF/DXE/hif_dxe.c deleted file mode 100644 index 18f9292504a5..000000000000 --- a/CORE/SERVICES/HIF/DXE/hif_dxe.c +++ /dev/null @@ -1,2083 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** -* @file hif_dxe.c -* @brief Provide functions for DXE HIF module for RIVA FW. -* @details -* This file Implements the HIF DXE Module For RIVA Integrated WLAN Platform . -* DXE software module communicates with the RIVA DXE HW block for data path which -* is a DMA engine to transfer Data from Host DDR to Target DDR. -* Provides API to : -* - Initialize the DMA block registers, Allocate DMA Memory for Descriptors/Rx Network Packets. -* - Send Recieve Network Packets over the DXE. -* - Register Tx Complete, Rx and Low Resource Callbacks. -* - Send Tx Data packets and report Rx Packets -* - Report Available Free Slots in Tx Ring -* - Flush Tx Packets -* - Set DXE Power State when Host transitions in and out of Power Save -* - Stop and Deallocate resources on Driver Unloads -*/ -#include "adf_os_types.h" -#include "adf_os_lock.h" -#include "adf_os_time.h" -#include "hif_dxe.h" -#include "hif_dxe_hw_pvt.h" -#include "hif_dxe_pvt.h" -#include "hif_dxe_os.h" -#define ATH_MODULE_NAME hif_dxe -#include <a_debug.h> - -S_HIFDXE_CONTEXT * g_hif_dxe_ctx = NULL; - -#define HIF_DXE_DEBUG ATH_DEBUG_MAKE_MODULE_MASK(0) - -#if defined(DEBUG) -static ATH_DEBUG_MASK_DESCRIPTION g_HIFDebugDescription[] = { - {HIF_DXE_DEBUG,"hif_dxe"}, -}; - - -ATH_DEBUG_INSTANTIATE_MODULE_VAR(hif_dxe, - "hif_dxe", - "DXE HIF Host Interface", - ATH_DEBUG_MASK_DEFAULTS | ATH_DEBUG_INFO | ATH_DEBUG_ERR | HIF_DXE_DEBUG, - ATH_DEBUG_DESCRIPTION_COUNT(g_HIFDebugDescription), - g_HIFDebugDescription); -#endif - -//externs -extern A_STATUS dxe_cmn_def_config(S_HIFDXE_CONTEXT * dxe_ctx); -extern A_STATUS dxe_chan_def_config(S_HIFDXE_CONTEXT * pdxectx,WLANDXE_ChannelCBType *channelEntry); - -//Local Variables -static char *channelType[HIFDXE_CHANNEL_MAX] = -{ - "TX_LOW_PRI", - "TX_HIGH_PRI", - "RX_LOW_PRI", - "RX_HIGH_PRI", -}; - -//Local Functions - -A_STATUS hif_dxe_notify_smsm(S_HIFDXE_CONTEXT *dxe_ctx,u_int8_t kickDxe,u_int8_t ringEmpty) -{ - u_int32_t clrSt = 0; - u_int32_t setSt = 0; - - if(kickDxe) - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s Set Kick off DXE\n",__FUNCTION__)); - setSt |= HIFDXE_SMSM_WLAN_TX_ENABLE; - } - else - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s Clear Kick off DXE\n",__FUNCTION__)); - clrSt |= HIFDXE_SMSM_WLAN_TX_ENABLE; - } - - if(ringEmpty) - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s SMSM Tx Ring Empty\n",__FUNCTION__)); - clrSt |= HIFDXE_SMSM_WLAN_TX_RINGS_NOT_EMPTY; - } - else - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s SMSM Tx Ring Not Empty\n",__FUNCTION__)); - setSt |= HIFDXE_SMSM_WLAN_TX_RINGS_NOT_EMPTY; - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s SMSM C : %x S : %x\n",__FUNCTION__,clrSt,setSt)); - - hif_dxe_os_notifysmsm(dxe_ctx->hif_os_handle,clrSt, setSt); - - return A_OK; -} - - -void dxe_ps_complete(S_HIFDXE_CONTEXT *dxe_ctx, u_int8_t intr_based) -{ - -} - -void dxe_channel_clean_int(S_HIFDXE_CONTEXT *dxe_ctx,WLANDXE_ChannelCBType *channelEntry,u_int32_t *chstatus) -{ - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Read Channel Status Register to know why INT Happen */ - *chstatus = hif_dxe_os_readreg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEStatusRegAddr); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,(" dxe_channel_clean_int : Channel : %d Channel Status 0x%x \n",channelEntry->channelType, *chstatus)); - - /* Clean up all the INT within this channel */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,WLANDXE_INT_CLR_ADDRESS,(1 << channelEntry->assignedDMAChannel)); - - - /* Clean up Error INT Bit */ - if (WLANDXE_CH_STAT_INT_ERR_MASK & *chstatus) - { - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,WLANDXE_INT_ERR_CLR_ADDRESS,(1 << channelEntry->assignedDMAChannel)); - - } - - /* Clean up DONE INT Bit */ - if (WLANDXE_CH_STAT_INT_DONE_MASK & *chstatus) - { - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,WLANDXE_INT_DONE_CLR_ADDRESS,(1 << channelEntry->assignedDMAChannel)); - } - - /* Clean up ED INT Bit */ - if (WLANDXE_CH_STAT_INT_ED_MASK & *chstatus) - { - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,WLANDXE_INT_ED_CLR_ADDRESS,(1 << channelEntry->assignedDMAChannel)); - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); -} - -A_STATUS dxe_tx_pull_frames(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry, u_int8_t flush) -{ - A_STATUS status = A_OK; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - volatile WLANDXE_DescType *currentDesc = NULL; - u_int32_t descCtrlValue = 0; - u_int32_t *lowThreshold = NULL; - adf_nbuf_t txframe_head = NULL; - adf_nbuf_t txframe_cur = NULL; - - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - - /* Sanity Check */ - if ((NULL == dxe_ctx) || (NULL == channelEntry)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_channel_start : dxe ctx/ Channel Entry is not valid")); - return A_EINVAL; - } - - channelEntry->txCompIntTracing |= 0x080000; - - if (NULL == dxe_ctx->hif_client_cb.HifTxCompleteCb) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_frames HifTxCompleteCb is not registered")); - channelEntry->txIntTracing |= 0x080000; - adf_os_assert(0); - return A_ERROR; - } - //FIXME_RT The Spin Lock must be held only for DMA Channel operation and client cb must not be invoked under this spin lock - adf_os_spin_lock(&channelEntry->dxeChannelLock); - - currentCtrlBlk = channelEntry->tailCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - if ( flush ) - { - currentDesc->descCtrl.valid = 0; - } - - channelEntry->txCompIntTracing |= 0x100000; - channelEntry->txIntTracing |= 0x4000; - if ( currentCtrlBlk == channelEntry->headCtrlBlk ) - { - adf_os_spin_unlock(&channelEntry->dxeChannelLock); - return A_OK; - } - - - while (1) - { - // HDXE_ASSERT(WLAN_PAL_IS_STATUS_SUCCESS(WLAN_RivaValidateDesc(currentDesc))); - descCtrlValue = currentDesc->descCtrl.ctrl; - if ((descCtrlValue & WLANDXE_DESC_CTRL_VALID)) - { - /* caught up with head, bail out */ - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_frames caught up with head - next DESC has VALID set \n")); - channelEntry->txIntTracing |= 0x010000; - channelEntry->txCompIntTracing |= 0x200000; - break; - } - channelEntry->txIntTracing |= 0x8000; - channelEntry->txCompIntTracing |= 0x400000; - - adf_os_assert(currentCtrlBlk->xfrFrame != NULL); - adf_os_atomic_inc(&channelEntry->numFreeDesc); - adf_os_atomic_dec(&channelEntry->numRsvdDesc); - - /* Send Frame TX Complete notification with frame start fragment location */ - if (WLANDXE_U32_SWAP_ENDIAN(descCtrlValue) & WLANDXE_DESC_CTRL_EOP) - { - adf_os_atomic_dec(&dxe_ctx->tx_pkts_pending); - adf_os_atomic_dec(&channelEntry->tx_pkts_pending); - adf_os_atomic_inc(&dxe_ctx->tx_pk_count); - channelEntry->txIntTracing |= 0x200000; - channelEntry->txCompIntTracing |= 0x01000000; - //Link Completed Tx packet into Network Packet List to return to Client Tx Complete handler - if (NULL == txframe_head) - { - txframe_head = currentCtrlBlk->xfrFrame; - } - else - { - //Link this frame to txframe_head - adf_nbuf_set_next(txframe_cur,currentCtrlBlk->xfrFrame); - } - txframe_cur = currentCtrlBlk->xfrFrame; - - adf_os_atomic_set(&channelEntry->numFragmentCurrentChain, 0); - - } - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - currentDesc = currentCtrlBlk->linkedDesc; - - /* Break condition - * Head control block is the control block must be programed for the next TX - * so, head control block is not programmed control block yet - * if loop encounte head control block, stop to complete - * in theory, COMP CB must be called already ??? */ - if (currentCtrlBlk == channelEntry->headCtrlBlk) - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_frames: caught up with head ptr \n")); - channelEntry->txIntTracing |= 0x040000; - channelEntry->txCompIntTracing |= 0x02000000; - break; - } - /* VALID Bit check ???? */ - } - - /* Tail and Head Control block must be same */ - channelEntry->tailCtrlBlk = currentCtrlBlk; - adf_os_spin_unlock(&channelEntry->dxeChannelLock); - - //Invoke Client Tx Complete Handler with completed Tx packets - if (txframe_head) - { - adf_nbuf_set_next(txframe_cur,NULL); - dxe_ctx->hif_client_cb.HifTxCompleteCb(dxe_ctx->hif_client_cb.HifTxCompleteCtx,txframe_head,channelEntry->channelType,A_OK); - } - - lowThreshold = channelEntry->channelType == HIFDXE_CHANNEL_TX_LOW_PRI? - &(dxe_ctx->txCompInt.txLowResourceThreshold_LoPriCh): - &(dxe_ctx->txCompInt.txLowResourceThreshold_HiPriCh); - - /* If specific channel hit low resource condition send notification to upper layer */ - if ((TRUE == channelEntry->hitLowResource) && - (adf_os_atomic_read(&channelEntry->numFreeDesc) > *lowThreshold)) - { - /* Change it back if we raised it for fetching a remaining packet from TL */ - if (WLANDXE_TX_LOW_RES_THRESHOLD > *lowThreshold) - { - *lowThreshold = WLANDXE_TX_LOW_RES_THRESHOLD; - } - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_frames: recovered from TX low res with free desc %d \n",adf_os_atomic_read(&channelEntry->numFreeDesc))); - - if (dxe_ctx->hif_client_cb.HifLowResourceCb) - { - dxe_ctx->hif_client_cb.HifLowResourceCb(dxe_ctx->hif_client_cb.HifLowResourceCtx, - channelEntry->channelType, - FALSE); - } - channelEntry->hitLowResource = FALSE; - } - - channelEntry->txIntTracing |= 0x100000; - channelEntry->txCompIntTracing |= 0x04000000; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -A_STATUS dxe_tx_complete_handler(void *pvcontext) -{ - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) pvcontext; - A_STATUS status = A_OK; - u_int32_t intSrc = 0; - u_int32_t chStat = 0; - WLANDXE_ChannelCBType *channelCb = NULL; - - u_int8_t bEnableISR = FALSE; - static u_int32_t successiveIntWithIMPS; - u_int8_t idx = 0; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Return from here if the RIVA is in IMPS, to avoid register access */ - if (HIF_DXE_POWER_STATE_DOWN == pdxectx->hostPowerState) - { - /* Disable interrupt at here, - IMPS or IMPS Pending state should not access RIVA register */ - pdxectx->txIntDisabledByIMPS = TRUE; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_handler : Host Power State is %d , Return From Here \n",pdxectx->hostPowerState)); - return status; - } - - /* Return from here if the RIVA is in IMPS, to avoid register access */ - if (HIF_DXE_POWER_STATE_IMPS == pdxectx->hostPowerState) - { - successiveIntWithIMPS++; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_handler IMPS TX COMP INT successiveIntWithIMPS %d \n", successiveIntWithIMPS)); - status = dxe_tx_pull_frames(pdxectx, &pdxectx->dxeChannel[HIFDXE_CHANNEL_TX_HIGH_PRI], FALSE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_handler Tx Completion Handling Failed on Channel : %d \n",HIFDXE_CHANNEL_TX_HIGH_PRI)); - } - - status = dxe_tx_pull_frames(pdxectx, &pdxectx->dxeChannel[HIFDXE_CHANNEL_TX_LOW_PRI], FALSE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_handler Tx Completion Handling Failed on Channel : %d \n",HIFDXE_CHANNEL_TX_HIGH_PRI)); - } - - if (adf_os_atomic_read(&pdxectx->tx_pkts_pending) && (successiveIntWithIMPS == 1)) - { - status = hif_dxe_os_program_int(pdxectx->hif_os_handle,E_HIFDXE_TX_INTERRUPT,E_HIFDXE_INT_ENABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_handler : Enable TX complete interrupt FAIL! ")); - return status; - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_handler TX COMP INT Enabled, remain TX frame count on ring %d\n", adf_os_atomic_read(&pdxectx->tx_pkts_pending))); - /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid - the posibility of a race*/ - dxe_ps_complete(pdxectx, TRUE); - } - else - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_handler TX COMP INT NOT Enabled, RIVA still wake up? remain TX frame count on ring %d, successiveIntWithIMPS %d", - adf_os_atomic_read(&pdxectx->tx_pkts_pending), successiveIntWithIMPS)); - - } - return status; - } - - successiveIntWithIMPS = 0; - - /* Disable device interrupt */ - /* Read whole interrupt mask register and exclusive only this channel int */ - intSrc = hif_dxe_os_readreg(pdxectx->hif_os_handle,WLANDXE_INT_SRC_RAW_ADDRESS); - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_handler Int Src 0x%x\n", intSrc)); - - /* Test High Priority Channel is the INT source or not */ - for (idx = HIFDXE_CHANNEL_TX_LOW_PRI; idx <= HIFDXE_CHANNEL_TX_HIGH_PRI ;idx++) - { - channelCb = &pdxectx->dxeChannel[idx]; - if (intSrc & (1 << channelCb->assignedDMAChannel)) - { - dxe_channel_clean_int(pdxectx,channelCb,&chStat); - - if (WLANDXE_CH_STAT_INT_ERR_MASK & chStat) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_handler : Fatal Error DXE Channel : %d ChanState Invalid : %d",idx,chStat)); - adf_os_assert(0); - } - else if ((WLANDXE_CH_STAT_INT_DONE_MASK & chStat) || (WLANDXE_CH_STAT_INT_ED_MASK & chStat)) - { - /* Handle TX complete for high priority channel */ - status = dxe_tx_pull_frames(pdxectx,channelCb, FALSE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_handler Tx Completion Handling Failed on Channel : %d \n",channelCb->channelType)); - } - bEnableISR = TRUE; - } - else - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_handler DXE Channel : %d ChanState = %x\n",idx,chStat)); - } - - if (WLANDXE_CH_STAT_MASKED_MASK & chStat) - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_handler DXE Channel : %d Masked Unmask it ChanState : %x!!\n",idx,chStat)); - } - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,( "dxe_tx_complete_handler DXE Channel : %d ChanState = %x RESRVD %d\n",idx,chStat,adf_os_atomic_read(&channelCb->numRsvdDesc))); - } - } - - if (bEnableISR || adf_os_atomic_read(&pdxectx->tx_pkts_pending)) - { - status = hif_dxe_os_program_int(pdxectx->hif_os_handle,E_HIFDXE_TX_INTERRUPT,E_HIFDXE_INT_ENABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_complete_handler : Enable TX complete interrupt FAIL! ")); - return status; - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_complete_handler TX COMP INT Enabled, remaining TX frame count on ring %d\n", adf_os_atomic_read(&pdxectx->tx_pkts_pending))); - } - - /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid - the posibility of a race*/ - dxe_ps_complete(pdxectx, TRUE); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -/* Fill RX ring with adf_nbufs. -* DOES NOT KICK THE HARDWARE. This is the caller's responsibility. -* -* Return TRUE if at least one buffer added to ring. -*/ -static u_int8_t dxe_rx_ring_fill_n(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channel, int32_t num) -{ - A_STATUS status = A_OK; - WLANDXE_DescCtrlBlkType *ctrlblk; - volatile WLANDXE_DescType *desc = NULL; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s: num = %d\n",__FUNCTION__, num)); - - adf_os_assert(adf_os_atomic_read(&channel->numFreeDesc) >= num); - - adf_os_spin_lock(&channel->dxeChannelLock); - - ctrlblk = channel->tailCtrlBlk; - - while (num > 0) { - adf_nbuf_t rx_netbuf; - u_int32_t paddr; - - /* Allocate adf_nbuf and add to rx ring */ - rx_netbuf = adf_nbuf_alloc(dxe_ctx->osdev, HIF_DXE_RX_BUFFER_SIZE, 0, 4, FALSE); - if (!rx_netbuf) { - /* - * Failed to fill it to the desired level - - * we'll start a timer and try again next time. - * As long as enough buffers are left in the ring for - * another A-MPDU rx, no special recovery is needed. - */ - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("dxe_rx_ring_fill_n: Failed to Retrieve Free Rx Buffers . Starting Rx Refill Timer Num Rx Desc : %d \n",adf_os_atomic_read(&channel->numFreeDesc))); - adf_os_timer_start(&channel->rx_refill_retry_timer, - HIF_DXE_RX_RING_REFILL_RETRY_TIME_MS); - break; - } - - status = adf_nbuf_map(dxe_ctx->osdev, rx_netbuf, ADF_OS_DMA_FROM_DEVICE); - if (status != A_OK) { - adf_nbuf_free(rx_netbuf); - break; - } - paddr = adf_nbuf_get_frag_paddr_lo(rx_netbuf, 0); - - /* Update SW Control Block */ - ctrlblk->xfrFrame = rx_netbuf; - - /* Fill in hardware DXE descriptor */ - desc = ctrlblk->linkedDesc; - desc->dxedesc.dxe_short_desc.dstMemAddrL = WLANDXE_U32_SWAP_ENDIAN(paddr); - desc->descCtrl.ctrl = channel->extraConfig.cw_ctrl_read; - - /* Next */ - adf_os_atomic_dec(&channel->numFreeDesc); - num--; - ctrlblk = ctrlblk->nextCtrlBlk; - } - - /* Update tail */ - channel->tailCtrlBlk = ctrlblk; - - adf_os_spin_unlock(&channel->dxeChannelLock); - - if (desc) - { - /* Issue a dummy read from the DXE descriptor DDR location to ensure - * that any posted writes are reflected in memory before DXE looks at - * the descriptor. - */ - if (channel->extraConfig.cw_ctrl_read != desc->descCtrl.ctrl) - { - //HDXE_ASSERT(0); - } - } - - /* MEMORY BARRIER - forces writes to memory before hw is kicked. */ - hif_dxe_os_mem_barrier(); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - - return desc ? TRUE : FALSE; -} - -static A_BOOL dxe_rx_ring_replenish(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channel) -{ - A_BOOL new_frame = FALSE; - - if (adf_os_atomic_dec_and_test(&channel->rx_refill_ref_cnt)) { - int32_t num_to_fill; - - num_to_fill = adf_os_atomic_read(&channel->numFreeDesc); - new_frame = dxe_rx_ring_fill_n(dxe_ctx, channel, num_to_fill /* okay if <= 0 */); - } - adf_os_atomic_inc(&channel->rx_refill_ref_cnt); - - return new_frame; -} - -/* RX timer function (per channel) - refill RX DXE ring */ -static void dxe_rx_ring_refill_retry(void *arg) -{ - WLANDXE_ChannelCBType *channel = (WLANDXE_ChannelCBType *)arg; - S_HIFDXE_CONTEXT *dxe_ctx = channel->dxe_ctx; - u_int8_t new_frame; - - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("dxe_rx_ring_refill_retry Before Replenish NumDesc : %d",adf_os_atomic_read(&channel->numFreeDesc))); - - new_frame = dxe_rx_ring_replenish(channel->dxe_ctx, channel); - - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("dxe_rx_ring_refill_retry After Replenish NumDesc : %d",adf_os_atomic_read(&channel->numFreeDesc))); - - if (!new_frame) - { - return; - } - - /* New frames on RX ring => kick the hardware */ - switch (dxe_ctx->hostPowerState) - { - case HIF_DXE_POWER_STATE_IMPS: - case HIF_DXE_POWER_STATE_DOWN: - //PS TEST - will this also kick the DXE RX ring(s)? - //PS TEST - FIGURE OUT WHAT TO DO HERE. - dxe_ctx->rxIntDisabledByIMPS = TRUE; - break; - case HIF_DXE_POWER_STATE_BMPS: - //PS TEST - TODO - kick ring. This is a timer function. - //The power state if the chip is unknown. Need to do SMSM kick. - break; - case HIF_DXE_POWER_STATE_FULL: - /* Enable RX ring i.e. kick/start the DXE channel */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle, channel->channelRegister.chDXECtrlRegAddr, - channel->extraConfig.chan_mask); - break; - default: - adf_os_assert(0); - } -} - -static inline adf_nbuf_t dxe_rx_ring_unlink_frame(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry, - WLANDXE_DescCtrlBlkType *ctrlblk) -{ - adf_nbuf_t rx_netbuf = ctrlblk->xfrFrame; - - if (rx_netbuf == NULL) - return NULL; - - adf_nbuf_unmap_single(dxe_ctx->osdev, rx_netbuf, ADF_OS_DMA_FROM_DEVICE); - - ctrlblk->xfrFrame = NULL; - adf_os_atomic_inc(&channelEntry->numFreeDesc); - - return rx_netbuf; -} - -static void dxe_rx_ring_cleanup(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry) -{ - u_int32_t idx; - WLANDXE_DescCtrlBlkType *currentCtrlBlk; - adf_nbuf_t rx_netbuf; - - adf_os_assert((HIFDXE_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)); - - currentCtrlBlk = channelEntry->headCtrlBlk; - - for (idx = 0; idx < channelEntry->numDesc; idx++) - { - rx_netbuf = dxe_rx_ring_unlink_frame(dxe_ctx, channelEntry, currentCtrlBlk); - if (rx_netbuf) - { - adf_nbuf_free(rx_netbuf); - } - - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - } -} - -static adf_nbuf_t dxe_rx_ring_reap(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry) -{ - WLANDXE_DescCtrlBlkType *ctrlblk; // sw desc - volatile WLANDXE_DescType *desc; // hw desc - u_int32_t descCtrl; - adf_nbuf_t rx_buf_list_head = NULL; - adf_nbuf_t rx_buf_prior = NULL; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - adf_os_spin_lock(&channelEntry->dxeChannelLock); - - ctrlblk = channelEntry->headCtrlBlk; - desc = ctrlblk->linkedDesc; - descCtrl = WLANDXE_U32_SWAP_ENDIAN(desc->descCtrl.ctrl); - - /* Process hardware RX ring */ - while (!(descCtrl & WLANDXE_DESC_CTRL_VALID)) - { - adf_nbuf_t rx_buf; - - /* Remove RX frame from RX ring */ - rx_buf = dxe_rx_ring_unlink_frame(dxe_ctx, channelEntry, ctrlblk); - if (rx_buf == NULL) - { - break; - } - - /* Append to list of reaped RX frames */ - if (rx_buf_prior) - { - adf_nbuf_set_next(rx_buf_prior, rx_buf); - } - else - { - rx_buf_list_head = rx_buf; - } - - rx_buf_prior = rx_buf; - channelEntry->numTotalFrame++; - - /* Next */ - ctrlblk = ctrlblk->nextCtrlBlk; - desc = ctrlblk->linkedDesc; - descCtrl = WLANDXE_U32_SWAP_ENDIAN(desc->descCtrl.ctrl); - } - - /* terminate rx buf list */ - if (rx_buf_prior) - { - adf_nbuf_set_next(rx_buf_prior, NULL); - } - - /* update SW RX ring head */ - channelEntry->headCtrlBlk = ctrlblk; - - adf_os_spin_unlock(&channelEntry->dxeChannelLock); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - - return rx_buf_list_head; -} - -/* -* Attempt to resync SW RX ring head ptr with HW RX ring head. -* -* This is called as part of a software workaround for a hardware bug. -* Sometimes when Riva is powered up, the hardware RX ring head is -* not programmed correctly. -*/ -static A_BOOL dxe_rx_ring_resync(S_HIFDXE_CONTEXT *dxe_ctx, - WLANDXE_ChannelCBType *channel) -{ - WLANDXE_DescCtrlBlkType *ctrlblk; - volatile WLANDXE_DescType *desc; - u_int32_t desc_ctrl; - u_int32_t desc_loop; - u_int8_t invalidated_found = FALSE; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - adf_os_spin_lock(&channel->dxeChannelLock); - - ctrlblk = channel->headCtrlBlk; - desc = ctrlblk->linkedDesc; - desc_ctrl = desc->descCtrl.ctrl; - - AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("dxe_rx_ring_resync: RX ISR called but no frame handled PWS %d, channel %s\n", - (int)dxe_ctx->hostPowerState, channelType[channel->channelType])); - -#if 0 //PS TEST - TODO - debug - dxeChannelMonitor("RX Ready", channelEntry); - dxeDescriptorDump(channelEntry, channelEntry->headCtrlBlk->linkedDesc, 0); - dxeChannelRegisterDump(channelEntry, "RX successive empty interrupt"); - dxeChannelAllDescDump(channelEntry, channelEntry->channelType); -#endif - - /* Abnormal interrupt detected, try to find invalidated descriptor - * (i.e. hardware completed rx frame) - * This would be the hardware head ptr. - */ - for (desc_loop = 0; desc_loop < channel->numDesc; desc_loop++) - { - if (!(WLANDXE_U32_SWAP_ENDIAN(desc_ctrl) & WLANDXE_DESC_CTRL_VALID)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_rx_ring_resync: Found invalidated desc, resync SW and HW\n")); - - channel->headCtrlBlk = ctrlblk; - invalidated_found = TRUE; - break; - } - - ctrlblk = ctrlblk->nextCtrlBlk; - desc = ctrlblk->linkedDesc; - desc_ctrl = desc->descCtrl.ctrl; - } - - adf_os_spin_unlock(&channel->dxeChannelLock); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - - return invalidated_found; -} - -/* Return TRUE if RX ring has completed frames to be processed */ -static u_int8_t dxe_rx_channel_read_and_clear_intr(S_HIFDXE_CONTEXT *dxe_ctx, - WLANDXE_ChannelCBType *channel, - u_int32_t *chstatus) -{ - u_int8_t channel_process = FALSE; - - /* Clear RX interrupt and get channel status */ - dxe_channel_clean_int(dxe_ctx, channel, chstatus); - - if (WLANDXE_CH_STAT_INT_ERR_MASK & *chstatus) - { - channel->errorIntCount++; -#if 0 //PS TEST - TODO - debug stuff - dxeChannelMonitor("RX High Event", channelCb); - dxeDescriptorDump(channelCb, channelCb->headCtrlBlk->linkedDesc, 0); - dxeChannelRegisterDump(channelCb, "RX HC error interrupt"); - dxeChannelAllDescDump(channelCb); -#endif - } - else if ((WLANDXE_CH_STAT_INT_DONE_MASK | WLANDXE_CH_STAT_INT_ED_MASK | WLANDXE_CH_STAT_MASKED_MASK) & *chstatus) - { - channel_process = TRUE; - } - - return channel_process; -} - -A_STATUS dxe_rx_handler(void *pvcontext) -{ - S_HIFDXE_CONTEXT * dxe_ctx =(S_HIFDXE_CONTEXT *) pvcontext; - WLANDXE_ChannelCBType *channel_array[HIF_DXE_NUM_RX_CHANNEL]; - adf_nbuf_t rx_buf_list_head_array[HIF_DXE_NUM_RX_CHANNEL] = {NULL, NULL}; - u_int32_t intr_source; - u_int32_t regValue; - A_STATUS status = A_OK; - u_int32_t i; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - channel_array[0] = &dxe_ctx->dxeChannel[HIFDXE_CHANNEL_RX_HIGH_PRI]; - channel_array[1] = &dxe_ctx->dxeChannel[HIFDXE_CHANNEL_RX_LOW_PRI]; - - if ((HIF_DXE_POWER_STATE_IMPS == dxe_ctx->hostPowerState) || - (HIF_DXE_POWER_STATE_DOWN == dxe_ctx->hostPowerState)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_WARN,("dxe_rx_handler: Riva is in %d, Just Pull frames without any register touch\n", dxe_ctx->hostPowerState)); - - /* Riva powered down - DO NOT TOUCH REGISTERS */ - - /* Process RX ring(s) */ - for (i = 0; i < HIF_DXE_NUM_RX_CHANNEL; i++) - { - WLANDXE_ChannelCBType *channel = channel_array[i]; - - if (!channel->extraConfig.chEnabled) - { - continue; - } - - /* unlink RX bufs from RX ring */ - rx_buf_list_head_array[i] = dxe_rx_ring_reap(dxe_ctx, channel); - - if (rx_buf_list_head_array[i]) - { - /* Refill RX ring */ - dxe_rx_ring_replenish(dxe_ctx, channel); - - /* Indicate RX bufs */ - dxe_ctx->hif_client_cb.HifRxReadyCb(dxe_ctx->hif_client_cb.HifRxReadyCtx, - rx_buf_list_head_array[i], - channel_array[i]->channelType); - } - } - - /* Interrupt will not enabled at here, it will be enabled at PS mode change */ - //PS TEST - will this also kick the DXE RX ring(s)? look at patch 1330 code - dxe_ctx->rxIntDisabledByIMPS = TRUE; - - return status; - } - - /* Read DXE interrupt source */ - intr_source = hif_dxe_os_readreg(dxe_ctx->hif_os_handle, WLANDXE_INT_SRC_RAW_ADDRESS); - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_rx_handler: Intr Src 0x%x\n", intr_source)); - - /* Process RX ring(s) */ - for (i = 0; i < HIF_DXE_NUM_RX_CHANNEL; i++) - { - WLANDXE_ChannelCBType *channel = channel_array[i]; - u_int8_t rx_process_channel = channel->extraConfig.chEnabled; - u_int32_t channelStat; - - rx_process_channel = rx_process_channel && (intr_source & (1 << channel->assignedDMAChannel)); - - if (!rx_process_channel) - { - continue; - } - - /* Read and Clear RX Channel interrupts */ - //PS TEST - can this be placed after filling the RX ring???? might be a race between filling ring and hw setting interrupt - // might need to clear interrupt before kicking DXE channel - if (!dxe_rx_channel_read_and_clear_intr(dxe_ctx, channel, &channelStat)) - { - break; - } - - /* Reap - unlink RX bufs from RX ring */ - rx_buf_list_head_array[i] = dxe_rx_ring_reap(dxe_ctx, channel); - - /* START - SW WAR - * Workaround for hw and sw's head ptr out of sync after Riva power up. - * If two successive RX interrupts with no completed frames in RX ring, - * try to manually resync SW ring head ptr to HW ring head ptr. - */ - if (rx_buf_list_head_array[i] == NULL && !channel->rx_prev_intr_completed_frames) - { - u_int8_t resync_success = dxe_rx_ring_resync(dxe_ctx, channel); - if (resync_success) - { - rx_buf_list_head_array[i] = dxe_rx_ring_reap(dxe_ctx, channel); - } - else - { - adf_os_assert(resync_success); - //PS TEST - TODO - what to do here. - // rel1.2 code restarts the wlan driver. reset instead? - } - } - channel->rx_prev_intr_completed_frames = (rx_buf_list_head_array[i] != NULL); - /* END - SW WAR */ - - if (rx_buf_list_head_array[i]) - { - /* Refill RX ring */ - dxe_rx_ring_replenish(dxe_ctx, channel); - - /* Enable RX ring i.e. kick/start the DXE channel */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle, channel->channelRegister.chDXECtrlRegAddr, - channel->extraConfig.chan_mask); - } - } - - /* Indicate RX bufs */ - for (i = 0; i < HIF_DXE_NUM_RX_CHANNEL; i++) - { - if (rx_buf_list_head_array[i]) - { - dxe_ctx->hif_client_cb.HifRxReadyCb(dxe_ctx->hif_client_cb.HifRxReadyCtx, - rx_buf_list_head_array[i], - channel_array[i]->channelType); - } - } - - /* Re-enable rx interrupts */ - status = hif_dxe_os_program_int(dxe_ctx->hif_os_handle, E_HIFDXE_RX_INTERRUPT, E_HIFDXE_INT_ENABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_rx_handler: Enable RX Ready interrupt fail\n")); - return status; - } - - /* Let Riva go back to sleep */ - //PS TEST - TODO - this needs to be synchronized with ISR - regValue = hif_dxe_os_readreg(dxe_ctx->hif_os_handle, WLANDXE_INT_MASK_REG_ADDRESS); - regValue &= HIFDXE_RX_INTERRUPT_PRO_UNMASK; - hif_dxe_os_writereg(dxe_ctx->hif_os_handle, WLANDXE_INT_MASK_REG_ADDRESS, regValue); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -A_STATUS dxe_dma_core_start(S_HIFDXE_CONTEXT *dxe_ctx) -{ - A_STATUS status = A_OK; - u_int32_t registerData = 0; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - -// AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("dxe_ctx->hif_os_handle : %x \n",dxe_ctx->hif_os_handle)); - - hif_dxe_os_dbgdump(dxe_ctx->hif_os_handle); - - /* START This core init is not needed for the integrated system */ - /* Reset First */ - registerData = WLANDXE_DMA_CSR_RESET_MASK; - registerData = hif_dxe_os_readreg(dxe_ctx->hif_os_handle,WALNDEX_DMA_CSR_ADDRESS); - registerData = WLANDXE_DMA_CSR_EN_MASK; - registerData |= WLANDXE_DMA_CSR_ECTR_EN_MASK; - registerData |= WLANDXE_DMA_CSR_TSTMP_EN_MASK; - registerData |= WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK; - //FIXME_RT Not Sure why this is hardcoded . Check with Danlin - registerData = 0x00005c89; - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,WALNDEX_DMA_CSR_ADDRESS,registerData); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -A_STATUS dxe_channel_start(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry) -{ - A_STATUS status = A_OK; - u_int32_t regValue = 0; - u_int32_t intMaskVal = 0; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity Check */ - if ((NULL == dxe_ctx) || (NULL == channelEntry)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_channel_start : dxe ctx/ Channel Entry is not valid")); - return A_EINVAL; - } - - /* Program Source address and destination adderss */ - if (!channelEntry->channelConfig.useShortDescFmt) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_channel_start Long Descriptor not support yet")); - adf_os_assert(0); - return A_ERROR; - } - - /* Common register area */ - /* Next linked list Descriptor pointer */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEDesclRegAddr,channelEntry->headCtrlBlk->linkedDescPhyAddr); - - if ((HIFDXE_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - /* Program default registers */ - /* TX DMA channel, DMA destination address is work Q */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEDadrlRegAddr,channelEntry->channelConfig.refWQ); - } - else if ((HIFDXE_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - /* RX DMA channel, DMA source address is work Q */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXESadrlRegAddr,channelEntry->channelConfig.refWQ); - - /* RX DMA channel, Program pre allocated destination Address */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEDadrlRegAddr, - WLANDXE_U32_SWAP_ENDIAN(channelEntry->DescBottomLoc->dxedesc.dxe_short_desc.phyNextL)); - - /* RX Channels, default Control registers MUST BE ENABLED */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXECtrlRegAddr, - channelEntry->extraConfig.chan_mask); - } - - - channelEntry->extraConfig.chEnabled = TRUE; - channelEntry->extraConfig.chConfigured = TRUE; - - /* Enable individual channel - * not to break current channel setup, first read register */ - regValue = hif_dxe_os_readreg(dxe_ctx->hif_os_handle, WALNDEX_DMA_CH_EN_ADDRESS); - /* Enable Channel specific Interrupt */ - intMaskVal = hif_dxe_os_readreg(dxe_ctx->hif_os_handle, WLANDXE_INT_MASK_REG_ADDRESS); - intMaskVal |= channelEntry->extraConfig.intMask; - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,WLANDXE_INT_MASK_REG_ADDRESS,intMaskVal); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; - -} - -A_STATUS dxe_channel_stop(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry) -{ - A_STATUS status = A_OK; - u_int32_t intMaskVal = 0; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity Check */ - if ((NULL == dxe_ctx) || (NULL == channelEntry)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_channel_start : dxe ctx/ Channel Entry is not valid")); - return A_EINVAL; - } - - /* Maskout interrupt */ - intMaskVal = hif_dxe_os_readreg(dxe_ctx->hif_os_handle,WLANDXE_INT_MASK_REG_ADDRESS); - intMaskVal ^= channelEntry->extraConfig.intMask; - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,WLANDXE_INT_MASK_REG_ADDRESS,intMaskVal); - - channelEntry->extraConfig.chEnabled = FALSE; - - /* Stop Channel ??? */ - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - - - -A_STATUS dxe_tx_push_frame(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry, adf_nbuf_t nbuf) -{ - A_STATUS status = A_OK; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescCtrlBlkType *startCtrlBlk = NULL; - volatile WLANDXE_DescType *currentDesc = NULL; - volatile WLANDXE_DescType *firstDesc = NULL; - volatile WLANDXE_DescType *LastDesc = NULL; - adf_os_dma_addr_t frag_paddr = 0; - u_int32_t frag_bytes = 0; - u_int32_t num_frags; - u_int32_t frag_idx=0; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - if (HIF_DXE_POWER_STATE_BMPS == dxe_ctx->hostPowerState) - { - dxe_ctx->fwPowerState = HIF_DXE_FW_POWER_STATE_BMPS_UNKNOWN; - hif_dxe_notify_smsm(dxe_ctx, FALSE, TRUE); - } - - adf_os_spin_lock(&channelEntry->dxeChannelLock); - adf_os_atomic_set(&channelEntry->numFragmentCurrentChain, 0); - num_frags = adf_nbuf_get_num_frags(nbuf); - - currentCtrlBlk = channelEntry->headCtrlBlk; - startCtrlBlk = channelEntry->headCtrlBlk; - - // Walk through NetBuf Physical Fragments and program DMA Descriptors - for (frag_idx=0;frag_idx<num_frags;frag_idx++) - { - /* Get current descriptor pointer from current control block */ - currentDesc = currentCtrlBlk->linkedDesc; - if (NULL == firstDesc) - { - firstDesc = currentCtrlBlk->linkedDesc; - } - /* All control block will have same palPacket Pointer - * to make logic simpler */ - currentCtrlBlk->xfrFrame = nbuf; - - /* Get next fragment physical address and fragment size - * if this is the first trial, will get first physical address - * if no more fragment, Descriptor src address will be set as NULL, OK??? */ - frag_paddr = adf_nbuf_get_frag_paddr_lo(nbuf,frag_idx); - frag_bytes = adf_nbuf_get_frag_len(nbuf,frag_idx); - if ((0 == frag_paddr) || - (0 == frag_bytes)) - { - continue; - } - - /* This is the LAST descriptor valid for this transaction */ - LastDesc = currentCtrlBlk->linkedDesc; - - /* Program DXE descriptor */ - currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = WLANDXE_U32_SWAP_ENDIAN(frag_paddr); - - /* Just normal data transfer from aCPU Flat Memory to BMU Q */ - if ((HIFDXE_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = - WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ); - } - else - { - /* Test specific H2H transfer, destination address already set - * Do Nothing */ - } - currentDesc->xfrSize = WLANDXE_U32_SWAP_ENDIAN(frag_bytes); - - /* Program channel control register */ - /* First frame not set VAL bit, why ??? */ - if (0 == adf_os_atomic_read(&channelEntry->numFragmentCurrentChain)) - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write; - } - else - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid; - } - - /* Update statistics */ - adf_os_atomic_inc(&channelEntry->numFragmentCurrentChain); - adf_os_atomic_dec(&channelEntry->numFreeDesc); - adf_os_atomic_inc(&channelEntry->numRsvdDesc); - - /* Get next control block */ - currentCtrlBlk = currentCtrlBlk->nextCtrlBlk; - } - - channelEntry->numTotalFrame++; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("dxe_tx_push_frame NUM TX FRAG %d, Total Frame %d\n",adf_os_atomic_read(&channelEntry->numFragmentCurrentChain), channelEntry->numTotalFrame)); - - /* Program Channel control register - * Set as end of packet - * Enable interrupt also for first code lock down - * performace optimization, this will be revisited */ - if (NULL == LastDesc) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_tx_push_frame NULL Last Descriptor, broken chain")); - adf_os_spin_unlock(&channelEntry->dxeChannelLock); - adf_os_assert(0); - return A_EFAULT; - } - /* Now First one also Valid ???? - * this procedure will prevent over handle descriptor from previous - * TX trigger */ - firstDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_valid; - LastDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write_eop_int; - - - /* Update channel head as next avaliable linked slot */ - channelEntry->headCtrlBlk = currentCtrlBlk; - - adf_os_spin_unlock(&channelEntry->dxeChannelLock); - - //Ensure Above DMA Channel programming is complete before Notify DXE through SMSM - hif_dxe_os_mem_barrier(); - - /* If in BMPS mode no need to notify the DXE Engine, notify SMSM instead */ - if (HIF_DXE_FW_POWER_STATE_BMPS_UNKNOWN == dxe_ctx->fwPowerState) - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,( "dxe_tx_push_frame SMSM_ret LO=%d HI=%d\n", adf_os_atomic_read(&dxe_ctx->dxeChannel[HIFDXE_CHANNEL_TX_LOW_PRI].numRsvdDesc), - adf_os_atomic_read(&dxe_ctx->dxeChannel[HIFDXE_CHANNEL_TX_HIGH_PRI].numRsvdDesc ))); - - hif_dxe_notify_smsm(dxe_ctx, TRUE, FALSE); - return status; - } - - /* If DXE use external descriptor, registers are not needed to be programmed - * Just after finish to program descriptor, tirigger to send */ - if (channelEntry->extraConfig.chan_mask & WLANDXE_CH_CTRL_EDEN_MASK) - { - /* Issue a dummy read from the DXE descriptor DDR location to - ensure that any previously posted write to the descriptor - completes. */ - if (channelEntry->extraConfig.cw_ctrl_write_valid != firstDesc->descCtrl.ctrl) - { - //HDXE_ASSERT(0); - } - - /* Everything is ready - * Trigger to start DMA */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXECtrlRegAddr, - channelEntry->extraConfig.chan_mask); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; - } - - /* If DXE not use external descriptor, program each registers */ - /* Circular buffer handle not need to program DESC register??? - * GEN5 code not programed RING buffer case - * REVISIT THIS !!!!!! */ - if ((HIFDXE_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - /* Destination address, assigned Work Q */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEDadrlRegAddr, - channelEntry->channelConfig.refWQ); - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEDadrhRegAddr,0); - - } - - /* Program Source address register - * This address is already programmed into DXE Descriptor - * But register also upadte */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXESadrlRegAddr, - WLANDXE_U32_SWAP_ENDIAN(firstDesc->dxedesc.dxe_short_desc.srcMemAddrL)); - - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXESadrhRegAddr,0); - - /* Linked list Descriptor pointer */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEDesclRegAddr, - startCtrlBlk->linkedDescPhyAddr); - - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXEDeschRegAddr,0); - - /* Transfer Size */ - frag_bytes = WLANDXE_U32_SWAP_ENDIAN(firstDesc->xfrSize); - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXESzRegAddr, - frag_bytes); - - - /* Everything is ready - * Trigger to start DMA */ - hif_dxe_os_writereg(dxe_ctx->hif_os_handle,channelEntry->channelRegister.chDXECtrlRegAddr, - channelEntry->extraConfig.chan_mask); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; - -} - -A_STATUS dxe_alloc_dma_ring(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry) -{ - A_STATUS status = A_OK; - u_int32_t idx; - WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - WLANDXE_DescCtrlBlkType *prevCtrlBlk = NULL; -// WLANDXE_DescCtrlBlkType *nextCtrlBlk = NULL; - volatile WLANDXE_DescType *currentDesc = NULL; - volatile WLANDXE_DescType *prevDesc = NULL; - adf_os_dma_addr_t physAddress; -// adf_os_dma_addr_t desc_pool_paddr; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity check */ - if ((NULL == dxe_ctx) || (NULL == channelEntry)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_alloc_dmaring : Channel Entry / DXE Ctx is not valid \n")); - return A_EINVAL; - } - - //Allocate the Control Block Mem Pool - channelEntry->ctrlblk_mem_pool = adf_os_mem_alloc(dxe_ctx->osdev,sizeof(WLANDXE_DescCtrlBlkType) * channelEntry->numDesc); - if (NULL == channelEntry->ctrlblk_mem_pool) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_alloc_dmaring : ctrlblk_mem_pool Allocation Failed for channel %d",channelEntry->channelType)); - return A_NO_MEMORY; - } - adf_os_mem_set(channelEntry->ctrlblk_mem_pool, 0, sizeof(WLANDXE_DescCtrlBlkType)* channelEntry->numDesc); - currentCtrlBlk = (WLANDXE_DescCtrlBlkType *)channelEntry->ctrlblk_mem_pool; - - //Allocate the Descriptor Block Mem Pool - channelEntry->descblk_mem_pool.vaddr = adf_os_mem_alloc_consistent(dxe_ctx->osdev,sizeof(WLANDXE_DescType)*channelEntry->numDesc, - &channelEntry->descblk_mem_pool.paddr, - adf_os_get_dma_mem_context((&channelEntry->descblk_mem_pool), memctx)); - if (NULL == channelEntry->descblk_mem_pool.vaddr) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_alloc_dmaring : descblk_mem_pool Allocation Failed for channel %d",channelEntry->channelType)); - return A_NO_MEMORY; - } - adf_os_mem_set(channelEntry->descblk_mem_pool.vaddr, 0, sizeof(WLANDXE_DescType)* channelEntry->numDesc); - currentDesc = (WLANDXE_DescType *)channelEntry->descblk_mem_pool.vaddr; - physAddress = channelEntry->descblk_mem_pool.paddr; - - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("dxe_alloc_dmaring : Allocating %d Descriptors For Channel %d\n",channelEntry->numDesc,channelEntry->channelType)); - /* Allocate pre asigned number of control blocks */ - for (idx = 0; idx < channelEntry->numDesc; idx++) - { - /* Initialize Control Block elements first */ - currentCtrlBlk->xfrFrame = NULL; - currentCtrlBlk->linkedDesc = NULL; - currentCtrlBlk->linkedDescPhyAddr = 0; - currentCtrlBlk->ctrlBlkOrder = idx; - - //Initialize Desc - //AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("dxe_alloc_dmaring : Allocated Descriptor %d VA 0x%x, PA 0x%x\n", idx,currentDesc, physAddress)); - if ((HIFDXE_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_write; - currentDesc->dxedesc.dxe_short_desc.dstMemAddrL = channelEntry->extraConfig.refWQ_swapped; - } - else if ((HIFDXE_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - currentDesc->descCtrl.ctrl = channelEntry->extraConfig.cw_ctrl_read; - currentDesc->dxedesc.dxe_short_desc.srcMemAddrL = channelEntry->extraConfig.refWQ_swapped; - } - - currentCtrlBlk->linkedDesc = currentDesc; - currentCtrlBlk->linkedDescPhyAddr = physAddress; - - - /* This is the first control block allocated - * Next Control block is not allocated yet - * head and tail must be first control block */ - if (0 == idx) - { - currentCtrlBlk->nextCtrlBlk = NULL; - channelEntry->headCtrlBlk = currentCtrlBlk; - channelEntry->tailCtrlBlk = currentCtrlBlk; - currentDesc->dxedesc.dxe_short_desc.phyNextL = 0; - channelEntry->DescBottomLoc = currentDesc; - channelEntry->descBottomLocPhyAddr = physAddress; - } - /* This is not first, not last control block - * previous control block may has next linked block */ - else if ((0 < idx) && (idx < (channelEntry->numDesc - 1))) - { - prevCtrlBlk->nextCtrlBlk = currentCtrlBlk; - prevDesc->dxedesc.dxe_short_desc.phyNextL = WLANDXE_U32_SWAP_ENDIAN(physAddress); - } - /* This is last control block - * next control block for the last control block is head, first control block - * then whole linked list made RING */ - else - { - prevCtrlBlk->nextCtrlBlk = currentCtrlBlk; - currentCtrlBlk->nextCtrlBlk = channelEntry->headCtrlBlk; - prevDesc->dxedesc.dxe_short_desc.phyNextL = - WLANDXE_U32_SWAP_ENDIAN(physAddress); - currentDesc->dxedesc.dxe_short_desc.phyNextL = - WLANDXE_U32_SWAP_ENDIAN(channelEntry->headCtrlBlk->linkedDescPhyAddr); - } - - prevDesc = currentDesc; - prevCtrlBlk = currentCtrlBlk; - - // advance to the next pre-allocated descriptor in the chunk - adf_os_atomic_inc(&channelEntry->numFreeDesc); - currentDesc++; - currentCtrlBlk++; - physAddress = physAddress + sizeof(WLANDXE_DescType); - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - - -A_STATUS dxe_free_dma_ring(S_HIFDXE_CONTEXT *dxe_ctx, WLANDXE_ChannelCBType *channelEntry) -{ -// a_uint32_t idx = 0; -// WLANDXE_DescCtrlBlkType *currentCtrlBlk = NULL; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity check */ - if ((NULL == dxe_ctx) || (NULL == channelEntry)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_free_dmaring: Channel Entry/dxe ctx is not valid \n")); - return A_EINVAL; - } - - // Free The rx Buffer pool - if ((HIFDXE_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - dxe_rx_ring_cleanup(dxe_ctx, channelEntry ); - } - - if (channelEntry->ctrlblk_mem_pool) - { - adf_os_mem_free(channelEntry->ctrlblk_mem_pool); - channelEntry->ctrlblk_mem_pool = NULL; - } - - if (channelEntry->descblk_mem_pool.vaddr) - { - adf_os_mem_free_consistent( - dxe_ctx->osdev, - sizeof(WLANDXE_DescType)*channelEntry->numDesc, /* pool_size */ - channelEntry->descblk_mem_pool.vaddr, - channelEntry->descblk_mem_pool.paddr, - adf_os_get_dma_mem_context((&channelEntry->descblk_mem_pool), memctx)); - } - - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return A_OK; -} - -//End Local Functions - -/** -* @ HIF DXE Attach . One Time Initialize of DXE HW / Allocate DXE SW Module Context / Alloc DXE Descriptors , Rx Buffers , Control Block /Attach OS Interrupts etc -* -* @param[in]dev - OS Dev Handle -* -* @retval hif_dxe_handle Allocates HIF DEX Context Block and returns handle for subsequent calls to DXE -*/ -hif_dxe_handle hif_dxe_attach(adf_os_device_t dev) -{ - A_STATUS status = A_OK; - static S_HIFDXE_CONTEXT * dxe_ctx = NULL; - u_int32_t idx; - WLANDXE_ChannelCBType *currentChannel = NULL; - int32_t smsmInitState; - S_HIF_DXE_OS_PARAMS hif_dxe_os_params; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - if(dxe_ctx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("%s : Hif Dxe Context Already Allocated. Return Existing.\n",__FUNCTION__)); - adf_os_atomic_inc(&dxe_ctx->ref_count); - return dxe_ctx; - } - - /* This is temporary allocation */ - dxe_ctx = adf_os_mem_alloc(dev,sizeof(S_HIFDXE_CONTEXT)); - if (NULL == dxe_ctx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("WLANDXE_Open Control Block Alloc Fail \n")); - return NULL; - } - adf_os_mem_zero(dxe_ctx, sizeof(S_HIFDXE_CONTEXT)); - - adf_os_atomic_init(&dxe_ctx->ref_count); - adf_os_atomic_inc(&dxe_ctx->ref_count); - - dxe_ctx->osdev = dev; - - hif_dxe_os_params.dxe_tx_cb = dxe_tx_complete_handler; - hif_dxe_os_params.dxe_rx_cb = dxe_rx_handler; - hif_dxe_os_params.pvcontext = dxe_ctx; - dxe_ctx->hif_os_handle = hif_dxe_os_init(dev,&hif_dxe_os_params); - if (NULL == dxe_ctx->hif_os_handle) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("WLANDXE_Open : hif_dxe_os_init Failure! \n")); - adf_os_mem_free(dxe_ctx); - return NULL; - } - - status = dxe_cmn_def_config(dxe_ctx); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("WLANDXE_Open Common Configuration Fail")); - hif_dxe_detach(dxe_ctx); - return NULL; - } - - dxe_ctx->dxeChannel[HIFDXE_CHANNEL_TX_LOW_PRI].channelType = HIFDXE_CHANNEL_TX_LOW_PRI; - dxe_ctx->dxeChannel[HIFDXE_CHANNEL_TX_HIGH_PRI].channelType = HIFDXE_CHANNEL_TX_HIGH_PRI; - dxe_ctx->dxeChannel[HIFDXE_CHANNEL_RX_LOW_PRI].channelType = HIFDXE_CHANNEL_RX_LOW_PRI; - dxe_ctx->dxeChannel[HIFDXE_CHANNEL_RX_HIGH_PRI].channelType = HIFDXE_CHANNEL_RX_HIGH_PRI; - - for (idx = 0; idx < HIFDXE_CHANNEL_MAX; idx++) - { - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("WLANDXE_Open Channel %d Open Start \n", idx)); - currentChannel = &dxe_ctx->dxeChannel[idx]; - - /* Config individual channels from channel default setup table */ - status = dxe_chan_def_config(dxe_ctx, - currentChannel); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("WLANDXE_Open Channel Basic Configuration Fail for channel %d", idx)); - hif_dxe_detach(dxe_ctx); - return NULL; - } - - adf_os_spinlock_init(¤tChannel->dxeChannelLock); - - /* Allocate DXE Control Block will be used by host DXE driver */ - status = dxe_alloc_dma_ring(dxe_ctx, currentChannel); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("WLANDXE_Open Alloc DXE Control Block Fail for channel %d", idx)); - - hif_dxe_detach(dxe_ctx); - return NULL; - } - - /* RX specific attach */ - if ((HIFDXE_CHANNEL_RX_LOW_PRI == currentChannel->channelType) || - (HIFDXE_CHANNEL_RX_HIGH_PRI == currentChannel->channelType)) - { - adf_os_atomic_init(¤tChannel->rx_refill_ref_cnt); - adf_os_atomic_inc(¤tChannel->rx_refill_ref_cnt); - - dxe_rx_ring_fill_n(dxe_ctx, currentChannel, currentChannel->numDesc); - - adf_os_timer_init(dxe_ctx->osdev, ¤tChannel->rx_refill_retry_timer, - dxe_rx_ring_refill_retry, (void *)currentChannel); - } - - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("WLANDXE_Open Channel %d Open Success \n", idx)); - } - - dxe_ctx->dxeCookie = WLANDXE_CTXT_COOKIE; - dxe_ctx->rxIntDisabledByIMPS = FALSE; - dxe_ctx->txIntDisabledByIMPS = FALSE; - - /* Initializing default BMPS host power state and firmware Power state*/ - dxe_ctx->hostPowerState = HIF_DXE_POWER_STATE_BMPS; - dxe_ctx->fwPowerState = HIF_DXE_FW_POWER_STATE_BMPS_UNKNOWN; - - /* Initialize SMSM state - * Init State is - * Clear TX Enable - * RING EMPTY STATE */ - - smsmInitState = hif_dxe_notify_smsm(dxe_ctx,FALSE, TRUE); - if (0 != smsmInitState) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("SMSM Channel init fail %d", smsmInitState)); - hif_dxe_detach(dxe_ctx); - return NULL; - } - - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("HIF_DXE Attach Success : \n")); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - - g_hif_dxe_ctx = dxe_ctx; - - return dxe_ctx; -} - -/** -* @ HIF DXE Start . Initialize DXE Channels For DMA -* -* @param[in]hif_dxe_pdev - HIF DXE Specific Context -* -* @retval A_STATUS -*/ - -A_STATUS hif_dxe_start(hif_dxe_handle hif_dxe_pdev) -{ - A_STATUS status = A_OK; - u_int32_t idx = 0; - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity */ - if (NULL == pdxectx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_start : Invalid DXE Context \n")); - return A_EINVAL; - } - - /* WLANDXE_Start called means DXE engine already initiates - * And DXE HW is reset and init finished - * But here to make sure HW is initialized, reset again */ - status = dxe_dma_core_start(pdxectx); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_start : DXE HW init Fail \n")); - return status; - } - - /* Individual Channel Start */ - for (idx = 0; idx < HIFDXE_CHANNEL_MAX; idx++) - { - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("hif_dxe_start : Start DXE Channel %d \n", idx)); - - /* Program each channel register with configuration arguments */ - //Trigger Start DMA Channel - status = dxe_channel_start(pdxectx, &pdxectx->dxeChannel[idx]); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_start : Start DMA channel %d Fail \n", idx)); - return status; - } - AR_DEBUG_PRINTF(HIF_DXE_DEBUG,("hif_dxe_start : Start DXE Channel %d SUCCESS! \n", idx)); - } - - //FIXME_RT Check if we need to notify hif_dxe_os to Start Routing Interrupts to us only after this point - - /* Enable system level ISR */ - /* Enable RX ready Interrupt at here */ - status = hif_dxe_os_program_int(pdxectx->hif_os_handle,E_HIFDXE_RX_INTERRUPT,E_HIFDXE_INT_ENABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_start : Enable TX complete interrupt FAIL! ")); - return status; - } - - /* Disable TX ready Interrupt and Re-Enable Only when required */ - status = hif_dxe_os_program_int(pdxectx->hif_os_handle,E_HIFDXE_TX_INTERRUPT,E_HIFDXE_INT_DISABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_start : Enable TX complete interrupt FAIL! ")); - return status; - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -/** -* @ HIF DXE Register . Register Packet Callbacks -* -* @param[in]hif_dxe_pdev - HIF DXE Specific Context -* -* @retval A_STATUS -*/ -A_STATUS hif_dxe_client_registration(hif_dxe_handle hif_dxe_pdev, S_HIFDXE_CALLBACK *hif_dxe_cb) -{ - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity */ - if ((NULL == pdxectx) || (NULL == hif_dxe_cb)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_client_registration : Invalid DXE Context \n")); - return A_EINVAL; - } - - if (NULL != hif_dxe_cb->HifTxCompleteCb) { - pdxectx->hif_client_cb.HifTxCompleteCb = hif_dxe_cb->HifTxCompleteCb; - pdxectx->hif_client_cb.HifTxCompleteCtx = hif_dxe_cb->HifTxCompleteCtx; - } - - if (NULL != hif_dxe_cb->HifRxReadyCb) { - pdxectx->hif_client_cb.HifRxReadyCb = hif_dxe_cb->HifRxReadyCb; - pdxectx->hif_client_cb.HifRxReadyCtx = hif_dxe_cb->HifRxReadyCtx; - } - - if (NULL != hif_dxe_cb->HifLowResourceCb) { - pdxectx->hif_client_cb.HifLowResourceCb = hif_dxe_cb->HifLowResourceCb; - pdxectx->hif_client_cb.HifLowResourceCtx = hif_dxe_cb->HifLowResourceCtx; - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return A_OK; -} - -/** -* @ HIF DXE Send . Send packet on DXE -* -* @param[in]hif_dxe_pdev - HIF DXE Specific Context -* @param[in]eHifDxeChannel - DXE Channel for Send -* @param[in]nbuf - SDU to send -* -* @retval A_STATUS -*/ -A_STATUS hif_dxe_send(hif_dxe_handle hif_dxe_pdev, E_HIFDXE_CHANNELTYPE channel, adf_nbuf_t nbuf) -{ - A_STATUS status = A_OK; - WLANDXE_ChannelCBType *currentChannel = NULL; - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - u_int32_t lowThreshold = 0; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity */ - if (NULL == pdxectx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_send : Invalid DXE Context \n")); - return A_EINVAL; - } - - if (NULL == nbuf) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_send : Invalid Data packet \n")); - return A_EINVAL; - } - - if ((HIFDXE_CHANNEL_MAX <= channel)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_send : Invalid Channel \n")); - return A_EINVAL; - } - - currentChannel = &pdxectx->dxeChannel[channel]; - - - lowThreshold = currentChannel->channelType == HIFDXE_CHANNEL_TX_LOW_PRI? - (pdxectx->txCompInt.txLowResourceThreshold_LoPriCh): - (pdxectx->txCompInt.txLowResourceThreshold_HiPriCh); - - /* Decide have to activate TX complete event or not */ - switch (pdxectx->txCompInt.txIntEnable) - { - /* TX complete interrupt will be activated when low DXE resource */ - case WLANDXE_TX_COMP_INT_LR_THRESHOLD: - if (adf_os_atomic_read(¤tChannel->numFreeDesc) <= lowThreshold) - { - if (pdxectx->hif_client_cb.HifLowResourceCb) - { - pdxectx->hif_client_cb.HifLowResourceCb(pdxectx->hif_client_cb.HifLowResourceCtx, - channel, - TRUE); - } - currentChannel->hitLowResource = TRUE; - } - break; - //Do We need to support the other Interrupt Mechanisms? - - case WLANDXE_TX_COMP_INT_PER_K_FRAMES: - break; - - /* TX complete interrupt will be activated periodically */ - case WLANDXE_TX_COMP_INT_TIMER: - break; - default: - adf_os_assert(0); //Eunexpected Configuration - - } - - - /* Update DXE descriptor, this is frame based - * if a frame consist of N fragments, N Descriptor will be programed */ - status = dxe_tx_push_frame(pdxectx,currentChannel, nbuf); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_send : TX Push Frame failure : %d\n",status)); - return status; - } - adf_os_atomic_inc(&pdxectx->tx_pkts_pending); - - adf_os_atomic_inc(¤tChannel->tx_pkts_pending); - - -#if 0 - //Try Drain Tx Queues - currentChannel = &pdxectx->dxeChannel[HIFDXE_CHANNEL_TX_HIGH_PRI]; - - /* Handle TX complete for high priority channel */ - status = dxe_tx_pull_frames(pdxectx, currentChannel, FALSE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_send : Tx Completion Handling Failed on Channel : %d \n",HIFDXE_CHANNEL_TX_HIGH_PRI)); - } - - currentChannel = &pdxectx->dxeChannel[HIFDXE_CHANNEL_TX_LOW_PRI]; - - /* Handle TX complete for low priority channel */ - status = dxe_tx_pull_frames(pdxectx, currentChannel, FALSE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_send : Tx Completion Handling Failed on Channel : %d \n",HIFDXE_CHANNEL_TX_LOW_PRI)); - } -#endif - //Enable Tx Interrupt if Pkts Pending - if (adf_os_atomic_read(&pdxectx->tx_pkts_pending)) - { - status = hif_dxe_os_program_int(pdxectx->hif_os_handle,E_HIFDXE_TX_INTERRUPT,E_HIFDXE_INT_ENABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_send : Enable TX complete interrupt FAIL! ")); - return status; - } - AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("hif_dxe_send TX COMP INT Enabled, remain TX frame count on ring %d\n", adf_os_atomic_read(&pdxectx->tx_pkts_pending))); - /*Kicking the DXE after the TX Complete interrupt was enabled - to avoid - the posibility of a race*/ - } - - //Invoke PS Handler to check if SMSM Notify required - dxe_ps_complete(pdxectx, FALSE); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - - return status; -} - -//FIXME_RT : Do We Need This -//A_STATUS HIF_DXE_CompleteTX(void *dxe_ctx); - - -/** -* @ HIF DXE GetResources . Return Available Free Tx Slots in DXE DMA Tx Ring for specified channel -* -* @param[in]hif_dxe_pdev - HIF DXE Specific Context -* @param[in]eHifDxeChannel - DXE Channel -* -* @retval a_uint32_t Num Available Resources -*/ -u_int32_t hif_dxe_get_resources(hif_dxe_handle hif_dxe_pdev, E_HIFDXE_CHANNELTYPE channel) -{ - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity */ - if (NULL == pdxectx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_get_resources : Invalid DXE Context \n")); - adf_os_assert(0); - return A_EINVAL; - } - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return adf_os_atomic_read(&pdxectx->dxeChannel[channel].numFreeDesc); -} -/** -* @ HIF DXE Flush Tx Packets . Flush And return Tx Packets Pending in DMA through Tx Completion Callbacks. -* -* @param[in]dxe_ctx - HIF DXE Specific Context -* -* @retval A_STATUS -*/ -A_STATUS hif_dxe_flush_txpackets(hif_dxe_handle hif_dxe_pdev) -{ - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - WLANDXE_ChannelCBType *txChannel; - A_STATUS status = A_OK; - u_int32_t txChannelsDisableRegValue; - u_int8_t txChannelDisableWaitLoop; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity */ - if (NULL == pdxectx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_flush_txpackets : Invalid DXE Context \n")); - adf_os_assert(0); - return A_EINVAL; - } - - /* To ensure DXE wake up, Sedn SMSM Notification */ - status = hif_dxe_notify_smsm(pdxectx, FALSE, FALSE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_flush_txpackets, SMSM Kick RIVA Fail %d", status)); - return status; - } - - /* Disable TX Channels first */ - txChannelsDisableRegValue = hif_dxe_os_readreg(pdxectx->hif_os_handle,WALNDEX_DMA_CH_EN_ADDRESS); - txChannelsDisableRegValue &= (~HIFDXE_TX_CHANNELS_EN_BIT_MASK); - hif_dxe_os_writereg(pdxectx->hif_os_handle,WALNDEX_DMA_ENCH_ADDRESS, txChannelsDisableRegValue); - - /* Check TX channels are disabled or not - * To flush TX channels, it should be disabled. */ - for (txChannelDisableWaitLoop = 0; txChannelDisableWaitLoop < HIFDXE_MAX_TX_CH_DISABLE_WAIT; txChannelDisableWaitLoop++) - { - txChannelsDisableRegValue = hif_dxe_os_readreg(pdxectx->hif_os_handle,WALNDEX_DMA_CH_EN_ADDRESS); - - if (0 == (txChannelsDisableRegValue & HIFDXE_TX_CHANNELS_EN_BIT_MASK)) - { - break; - } - else - { - adf_os_udelay(1); - } - } - /* MAX Time wait but could not disabled TX channel */ - if (HIFDXE_MAX_TX_CH_DISABLE_WAIT == txChannelDisableWaitLoop) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_flush_txpackets, During %d usec, failed to disable TX Channel",HIFDXE_MAX_TX_CH_DISABLE_WAIT)); - } - - //If Channels Could not be disabled continue to Force Pull out Tx Frames Anyway . - - /* Low Channel First */ - txChannel = &pdxectx->dxeChannel[HIFDXE_CHANNEL_TX_LOW_PRI]; - status = dxe_tx_pull_frames(pdxectx,txChannel, TRUE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_flush_txpackets Failed to Pull Frames from Channel : %d Status %d\n",txChannel->channelType,status)); - return status; - } - - /* High Channel */ - txChannel = &pdxectx->dxeChannel[HIFDXE_CHANNEL_TX_HIGH_PRI]; - status = dxe_tx_pull_frames(pdxectx, txChannel, TRUE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_flush_txpackets, Failed to Pull Frames from Channel : %d Status %d\n",txChannel->channelType,status)); - return status; - } - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -/** -* @ HIF DXE Set Power State . Synchronously Set Power State relevant for DXE / Ensure No references into DXE are Outstanding -* -* @param[in]hif_dxe_pdev - HIF DXE Specific Context -* @param[in]PowerState - New Power State -* -* @retval A_STATUS -*/ -A_STATUS hif_dxe_set_power_state(hif_dxe_handle hif_dxe_pdev, a_uint8_t PowerState ) -{ - A_STATUS status = A_OK; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -/** -* @ HIF DXE Stop . Stop DMA -* -* @param[in]hif_dxe_pdev - HIF DXE Specific Context -* -* @retval A_STATUS -*/ -A_STATUS hif_dxe_stop(hif_dxe_handle hif_dxe_pdev) -{ - A_STATUS status = A_OK; - u_int32_t idx = 0; - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity */ - if (NULL == pdxectx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_stop : Invalid DXE Context \n")); - return A_EINVAL; - } - - //FIXME_RT Make sure No Outstanding References to DXE . Synchronize with dxe_stopped - hif_dxe_os_stop(pdxectx->hif_os_handle); - - for (idx = 0; idx < HIFDXE_CHANNEL_MAX; idx++) - { - status = dxe_channel_stop(pdxectx, &pdxectx->dxeChannel[idx]); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_stop : channel %d stop failed \n",idx)); - return status; - } - } - - /* During Stop Disable interrupts For Good (INTR Disable is syncronized at Interrupt IRQL)*/ - status = hif_dxe_os_program_int(pdxectx->hif_os_handle,E_HIFDXE_TX_INTERRUPT,E_HIFDXE_INT_DISABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_start : Disable TX complete interrupt FAIL! ")); - } - status = hif_dxe_os_program_int(pdxectx->hif_os_handle,E_HIFDXE_RX_INTERRUPT,E_HIFDXE_INT_DISABLE); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_start : Disable TX complete interrupt FAIL! ")); - } - - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return status; -} - -/** - * @brief HIF DXE Read register - * - * @param[in] hif_dxe_pdev - HIF DXE Specific Context - * @param[in] Addr - * - * @return Read Value - */ -u_int32_t hif_dxe_readreg(hif_dxe_handle hif_dxe_pdev, u_int32_t addr) -{ - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - return hif_dxe_os_readreg(pdxectx->hif_os_handle,addr); -} - -/** - * @brief HIF DXE Write register - * - * @param[in] hif_dxe_pdev - HIF DXE Specific Context - * @param[in] Addr - * @param[in] val - * - * @return void - */ -void -hif_dxe_writereg(hif_dxe_handle hif_dxe_pdev, u_int32_t addr, u_int32_t val) -{ - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - hif_dxe_os_writereg(pdxectx->hif_os_handle,addr,val); -} - -/** -* @ HIF DXE Detach . UnInitialize DXE Resources / HW / Free Memory / Detach OS Interrupts etc -* -* @param[in]dxe_ctx - HIF DXE Specific Context -* -* @retval A_STATUS -*/ -A_STATUS hif_dxe_detach(hif_dxe_handle hif_dxe_pdev) -{ - u_int32_t idx = 0; - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) hif_dxe_pdev; - WLANDXE_ChannelCBType *currentChannel = NULL; - A_STATUS status; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); - - /* Sanity */ - if (NULL == pdxectx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_detach Invalid DXE Context \n")); - return A_EINVAL; - } - - - if (!adf_os_atomic_dec_and_test(&pdxectx->ref_count)) { - /* there are other clients still using dmux_dxe */ - return A_OK; - } - - /*Stop DXE After making Sure OS Is DeInitialized ie No More DPC's are firing*/ - status = hif_dxe_stop(pdxectx); - if (A_OK != status) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("hif_dxe_detach : hif_dxe_stop Failed \n")); - } - - hif_dxe_os_deinit(pdxectx->hif_os_handle); - - for (idx = 0; idx < HIFDXE_CHANNEL_MAX; idx++) - { - currentChannel = &pdxectx->dxeChannel[idx]; - if (currentChannel) - { - adf_os_spinlock_destroy(¤tChannel->dxeChannelLock); - dxe_free_dma_ring(pdxectx, &pdxectx->dxeChannel[idx]); - - /* RX specific detach */ - if ((HIFDXE_CHANNEL_RX_LOW_PRI == currentChannel->channelType) || - (HIFDXE_CHANNEL_RX_HIGH_PRI == currentChannel->channelType)) - { - adf_os_timer_cancel(¤tChannel->rx_refill_retry_timer); - adf_os_timer_free(¤tChannel->rx_refill_retry_timer); - } - } - } - adf_os_mem_free(pdxectx); - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - return A_OK; -} - -#if 0 -void hif_dxe_dump() -{ - S_HIFDXE_CONTEXT * pdxectx =(S_HIFDXE_CONTEXT *) g_hif_dxe_ctx; - WLANDXE_ChannelCBType *currentChannel; - A_UINT8 idx=0; - - AR_DEBUG_PRINTF(HIF_DXE_DEBUG, ("+%s\n",__FUNCTION__)); - for (idx = 0; idx < HIFDXE_CHANNEL_MAX; idx++) - { - currentChannel = &pdxectx->dxeChannel[idx]; - if (currentChannel) - { - A_UINT32 regval = hif_dxe_os_readreg(pdxectx->hif_os_handle,currentChannel->channelRegister.chDXEStatusRegAddr); - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Channel Idx : %d\n",idx)); - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Channel Type : %d\n",currentChannel->channelType)); - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Num Desc : %d\n",currentChannel->numDesc)); - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Num Free Desc : %d\n",currentChannel->numFreeDesc)); - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Channel Status : 0x%x\n",regval)); - } - - //For Debugging Tx Stall Scenario check and print Avalibale BD's in BMU - if(((currentChannel->channelType == HIFDXE_CHANNEL_TX_LOW_PRI) || (currentChannel->channelType == HIFDXE_CHANNEL_TX_HIGH_PRI)) && - currentChannel->tx_pkts_pending > HIF_DXE_TX_PENDING_DEBUG_THRESHOLD ) - { - A_UINT32 avail_bds , bd_thres0 , regval ; - bd_thres0 = hif_dxe_os_readreg(pdxectx->hif_os_handle, WLANDXE_BMU_PDU_THRES0); - avail_bds = hif_dxe_os_readreg(pdxectx->hif_os_handle, WLANDXE_BMU_AVAILABLE_BD_PDU); - if(avail_bds < ((bd_thres0 & WLANDXE_BMU_BD_THRES0_MASK) * 10)) - { - A_UINT32 wq_addr = 0; - A_UINT8 wq_idx = 0; - //Currently dump only if bd's less than 10 times Threshold - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" Channel : %d TxPending : %d Avail BD-PDU : 0x%x Threshold : 0x%x \n",idx,currentChannel->tx_pkts_pending,avail_bds,bd_thres0)); - - for(wq_idx=0; wq_idx < 27; wq_idx++) - { - wq_addr = (0xFB80001c | ((wq_idx << 8) & 0xff00)); - regval = hif_dxe_os_readreg(pdxectx->hif_os_handle,wq_addr); - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("WQ8 : Addr : 0x%x 0x%x \n",wq_addr,regval)); - } - } - } - } -} -#endif diff --git a/CORE/SERVICES/HIF/DXE/hif_dxe.h b/CORE/SERVICES/HIF/DXE/hif_dxe.h deleted file mode 100644 index 687bc4d4e2ee..000000000000 --- a/CORE/SERVICES/HIF/DXE/hif_dxe.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** - * @file hif_dxe.h - * @brief Provide functions for DXE HIF module for RIVA FW. - * @details - * This file Provides the HIF DXE Module API For RIVA Integrated WLAN Platform . - * DXE software module communicates with the RIVA DXE HW block for data path which - * is a DMA engine to transfer Data between [ Host DDR <--> Target DDR] - * Provides API to : - * - Initialize the DMA block registers , Allocate DMA Memory for Descriptors/Rx Network Packets. - * - Register Tx Complete , Rx and Low Resource Callbacks. - * - Send Tx Data packets and report Rx Packets - * - Report Available Free Slots in Tx Ring - * - Flush Tx Packets - * - Set DXE Power State when Host transitions in and out of Power Save - * - Stop DXE and Deallocate resources on Driver Unloads - */ -#ifndef _HIF_DXE_H_ -#define _HIF_DXE_H_ -#include "adf_os_types.h" -#include "athdefs.h" -#include "a_types.h" // for A_BOOL/TRUE/FALSE -#include "adf_nbuf.h" /* adf_nbuf_t */ - -typedef void * hif_dxe_handle; - -typedef enum _E_HIFDXE_CHANNELTYPE -{ - HIFDXE_CHANNEL_TX_LOW_PRI, - HIFDXE_CHANNEL_TX_HIGH_PRI, - HIFDXE_CHANNEL_RX_LOW_PRI, - HIFDXE_CHANNEL_RX_HIGH_PRI, - HIFDXE_CHANNEL_MAX -} E_HIFDXE_CHANNELTYPE; - -typedef A_STATUS (*HIFDXE_TxCompleteCb)(void *pContext, adf_nbuf_t tx_list, E_HIFDXE_CHANNELTYPE channel ,A_STATUS status); -typedef A_STATUS (*HIFDXE_RxFrameReadyCb) (void *pContext, adf_nbuf_t rx_list, E_HIFDXE_CHANNELTYPE channel); -typedef A_STATUS (*HIFDXE_LowResourceCb)(void *pContext, E_HIFDXE_CHANNELTYPE channel, A_BOOL is_low_resource); - - -typedef struct _S_HIFDXE_CALLBACK -{ - HIFDXE_TxCompleteCb HifTxCompleteCb; - HIFDXE_RxFrameReadyCb HifRxReadyCb; - HIFDXE_LowResourceCb HifLowResourceCb; - void *HifTxCompleteCtx; - void *HifRxReadyCtx; - void *HifLowResourceCtx; -} S_HIFDXE_CALLBACK; - - -/** - * @ HIF DXE Attach . One Time Initialize of DXE HW / Allocate DXE SW Module Context / Alloc DXE Descriptors , Rx Buffers , Control Block /Attach OS Interrupts etc - * - * @param[in]dev - OS Dev Handle - * - * @retval hif_dxe_handle Allocates HIF DEX Context Block and returns handle for subsequent calls to DXE - */ -hif_dxe_handle hif_dxe_attach(adf_os_device_t dev); - -/** - * @ HIF DXE Start . Initialize the DMA Channels and per channel DMA Registers to Valid Values. - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * - * @retval A_STATUS - */ - -A_STATUS hif_dxe_start(hif_dxe_handle hif_dxe_pdev); - -/** - * @ HIF DXE Register . Register Packet Callbacks - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_client_registration(hif_dxe_handle hif_dxe_pdev, S_HIFDXE_CALLBACK *hif_dxe_cb); - -/** - * @ HIF DXE Send . Send packet on DXE - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * @param[in]eHifDxeChannel - DXE Channel for Send - * @param[in]nbuf - SDU to send - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_send(hif_dxe_handle hif_dxe_pdev, E_HIFDXE_CHANNELTYPE channel, adf_nbuf_t nbuf); - - - -//FIXME_RT : Do We Need This -//A_STATUS HIF_DXE_CompleteTX(void *hif_dxe_pdev); - - -/** - * @ HIF DXE GetResources . Return Available Free Tx Slots in DXE DMA Tx Ring for specified channel - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * @param[in]eHifDxeChannel - DXE Channel - * - * @retval a_uint32_t Num Available Resources - */ -u_int32_t hif_dxe_get_resources(hif_dxe_handle hif_dxe_pdev, E_HIFDXE_CHANNELTYPE channel); - - -/** - * @ HIF DXE Flush Tx Packets . Flush And return Tx Packets Pending in DMA through Tx Completion Callbacks. - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_flush_packets(hif_dxe_handle hif_dxe_pdev); - - -/** - * @ HIF DXE Set Power State . Synchronously Set Power State relevant for DXE / Ensure No references into DXE are Outstanding - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * @param[in]PowerState - New Power State - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_set_power_state(hif_dxe_handle hif_dxe_pdev, u_int8_t power_state ); - - -/** - * @brief HIF DXE Read register - * - * @param[in] hif_dxe_pdev - HIF DXE Specific Context - * @param[in] Addr - * - * @return Read Value - */ -u_int32_t hif_dxe_readreg(hif_dxe_handle hif_dxe_pdev, u_int32_t addr); - - -/** - * @brief HIF DXE Write register - * - * @param[in] hif_dxe_pdev - HIF DXE Specific Context - * @param[in] Addr - * @param[in] val - * - * @return void - */ -void -hif_dxe_writereg(hif_dxe_handle hif_dxe_pdev, u_int32_t addr, u_int32_t val); - - -/** - * @ HIF DXE Stop . Stop DMA - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_stop(hif_dxe_handle hif_dxe_pdev); - - -/** - * @ HIF DXE Detach . UnInitialize DXE Resources / HW / Free Memory / Detach OS Interrupts etc - * - * @param[in]hif_dxe_pdev - HIF DXE Specific Context - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_detach(hif_dxe_handle hif_dxe_pdev); - -#endif diff --git a/CORE/SERVICES/HIF/DXE/hif_dxe_config.c b/CORE/SERVICES/HIF/DXE/hif_dxe_config.c deleted file mode 100644 index 5429717badc0..000000000000 --- a/CORE/SERVICES/HIF/DXE/hif_dxe_config.c +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** -* @file hif_dxe_config.c -* @brief Provide functions for DXE HIF module DMA Channel configuration -* @details -* This file Implements the HIF DXE DMA Channel Configuration Values like : -* - DMA Channel Base Addresses -* - DMA Channel Interrupt Maskshif -* - Provide DMA Channel to DMA Channel Configuration mapping -* - Per Channel Config Values like : NumDesc , NumBuffers , Priority , DMA xfr direction etc -* - -* - -*/ -#include "adf_os_types.h" -#include "hif_dxe.h" -#include "hif_dxe_hw_pvt.h" -#include "hif_dxe_pvt.h" -#define ATH_MODULE_NAME hif_dxe_config -#include <a_debug.h> - -#define HIF_DXE_CONFIG_DEBUG ATH_DEBUG_MAKE_MODULE_MASK(0) - -#if defined(DEBUG) -static ATH_DEBUG_MASK_DESCRIPTION g_HIFConfigDebugDescription[] = { - {HIF_DXE_CONFIG_DEBUG,"hif_dxe_config"}, -}; - -ATH_DEBUG_INSTANTIATE_MODULE_VAR(hif_dxe_config, - "hif_dxe_config", - "DXE HIF Config Module", - ATH_DEBUG_MASK_DEFAULTS | ATH_DEBUG_INFO | HIF_DXE_CONFIG_DEBUG, - ATH_DEBUG_DESCRIPTION_COUNT(g_HIFConfigDebugDescription), - g_HIFConfigDebugDescription); -#endif - -typedef struct -{ - E_HIFDXE_CHANNELTYPE wlanChannel; - WLANDXE_DMAChannelType DMAChannel; - WLANDXE_ChannelConfigType *channelConfig; -} WLANDXE_ChannelMappingType; - -u_int32_t channelBaseAddressList[WLANDXE_DMA_CHANNEL_MAX] = -{ - WLANDXE_DMA_CHAN0_BASE_ADDRESS, - WLANDXE_DMA_CHAN1_BASE_ADDRESS, - WLANDXE_DMA_CHAN2_BASE_ADDRESS, - WLANDXE_DMA_CHAN3_BASE_ADDRESS, - WLANDXE_DMA_CHAN4_BASE_ADDRESS, - WLANDXE_DMA_CHAN5_BASE_ADDRESS, - WLANDXE_DMA_CHAN6_BASE_ADDRESS -}; - -u_int32_t channelInterruptMask[WLANDXE_DMA_CHANNEL_MAX] = -{ - WLANDXE_INT_MASK_CHAN_0, - WLANDXE_INT_MASK_CHAN_1, - WLANDXE_INT_MASK_CHAN_2, - WLANDXE_INT_MASK_CHAN_3, - WLANDXE_INT_MASK_CHAN_4, - WLANDXE_INT_MASK_CHAN_5, - WLANDXE_INT_MASK_CHAN_6 -}; - -WLANDXE_ChannelConfigType chanTXLowPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - HIFDXE_TX_LO_PRI_RES_NUM , - - /* MAX num RX Buffer */ - 0, - - /* Reference WQ, TX23 */ -#ifdef HIF_DXE_TEST - 11, -#else - 23, -#endif - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_H2B, - - /* Channel Priority 7(Highest) - 0(Lowest) NOT CLEAR YET !!! */ - 4, - - /* BD attached to frames for this pipe */ - TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 5, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!! */ - TRUE, - - /* Use short Descriptor */ - TRUE -}; - -WLANDXE_ChannelConfigType chanTXHighPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - HIFDXE_TX_HI_PRI_RES_NUM , - - /* MAX num RX Buffer */ - 0, - - /* Reference WQ, TX23 */ - 23, - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_H2B, - - /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */ - 6, - - /* BD attached to frames for this pipe */ - TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 7, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/ - TRUE, - - /* Use short Descriptor */ - TRUE -}; - -WLANDXE_ChannelConfigType chanRXLowPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - 256, - - /* MAX num RX Buffer, NOT CLEAR YET !!! */ - 1, - - /* Reference WQ, NOT CLEAR YET !!! */ - /* Temporary BMU Work Q 4 */ - - 11, - - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_B2H, - - /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */ - 5, - - /* BD attached to frames for this pipe */ - TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 6, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/ - TRUE, - - /* Use short Descriptor */ - TRUE -}; - -WLANDXE_ChannelConfigType chanRXHighPriConfig = -{ - /* Q handle type, Circular */ - WLANDXE_CHANNEL_HANDLE_CIRCULA, - - /* Number of Descriptor, NOT CLEAR YET !!! */ - 256, - - /* MAX num RX Buffer, NOT CLEAR YET !!! */ - 1, - - /* Reference WQ, RX11 */ - 4, - - /* USB Only, End point info */ - 0, - - /* Transfer Type */ - WLANDXE_DESC_CTRL_XTYPE_B2H, - - /* Channel Priority 7(Highest) - 0(Lowest), NOT CLEAR YET !!! */ - 6, - - /* BD attached to frames for this pipe */ - TRUE, - - /* chk_size, NOT CLEAR YET !!!*/ - 0, - - /* bmuThdSel, NOT CLEAR YET !!! */ - 8, - - /* Added in Gen5 for Prefetch, NOT CLEAR YET !!!*/ - TRUE, - - /* Use short Descriptor */ - TRUE -}; - - -WLANDXE_ChannelMappingType channelList[HIFDXE_CHANNEL_MAX] = -{ - {HIFDXE_CHANNEL_TX_LOW_PRI, WLANDXE_DMA_CHANNEL_0, &chanTXLowPriConfig}, - {HIFDXE_CHANNEL_TX_HIGH_PRI, WLANDXE_DMA_CHANNEL_4, &chanTXHighPriConfig}, - {HIFDXE_CHANNEL_RX_LOW_PRI, WLANDXE_DMA_CHANNEL_1, &chanRXLowPriConfig}, - {HIFDXE_CHANNEL_RX_HIGH_PRI, WLANDXE_DMA_CHANNEL_3, &chanRXHighPriConfig}, -}; - -WLANDXE_TxCompIntConfigType txCompInt = -{ - /* TX Complete Interrupt enable method */ - WLANDXE_TX_COMP_INT_PER_K_FRAMES, - - /* TX Low Resource remaining resource threshold for Low Pri Ch */ - WLANDXE_TX_LOW_RES_THRESHOLD, - - /* TX Low Resource remaining resource threshold for High Pri Ch */ - WLANDXE_TX_LOW_RES_THRESHOLD, - - /* RX Low Resource remaining resource threshold */ - 5, - - /* Per K frame enable Interrupt */ - /*WLANDXE_HI_PRI_RES_NUM*/ 5, - - /* Periodic timer msec */ - 10 -}; - -A_STATUS dxe_cmn_def_config(S_HIFDXE_CONTEXT * dxe_ctx) -{ - A_MEMCPY(&dxe_ctx->txCompInt,&txCompInt,sizeof(WLANDXE_TxCompIntConfigType)); - return A_OK; -} - - -A_STATUS dxe_chan_def_config(S_HIFDXE_CONTEXT * pdxectx,WLANDXE_ChannelCBType *channelEntry) -{ - A_STATUS status = A_OK; - u_int32_t baseAddress; - u_int32_t dxeControlRead = 0; - u_int32_t dxeControlWrite = 0; - u_int32_t dxeControlWriteValid = 0; - u_int32_t dxeControlWriteEop = 0; - u_int32_t dxeControlWriteEopInt = 0; - u_int32_t idx; - WLANDXE_ChannelMappingType *mappedChannel = NULL; - - /* Sanity */ - if ((NULL == pdxectx) || (NULL == channelEntry)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_chan_def_config : Invalid DXE Context / DMA Channel Entry \n")); - return A_EINVAL; - } - - for(idx = 0; idx < HIFDXE_CHANNEL_MAX; idx++) - { - if(channelEntry->channelType == channelList[idx].wlanChannel) - { - mappedChannel = &channelList[idx]; - break; - } - } - - if((NULL == mappedChannel) || (HIFDXE_CHANNEL_MAX == idx)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("dxe_chan_def_config : Failed to map channel \n")); - return A_EINVAL; - } - - A_MEMCPY(&channelEntry->channelConfig,mappedChannel->channelConfig,sizeof(WLANDXE_ChannelConfigType)); - - baseAddress = channelBaseAddressList[mappedChannel->DMAChannel]; - channelEntry->channelRegister.chDXEBaseAddr = baseAddress; - channelEntry->channelRegister.chDXEStatusRegAddr = baseAddress + WLANDXE_DMA_CH_STATUS_REG; - channelEntry->channelRegister.chDXEDesclRegAddr = baseAddress + WLANDXE_DMA_CH_DESCL_REG; - channelEntry->channelRegister.chDXEDeschRegAddr = baseAddress + WLANDXE_DMA_CH_DESCH_REG; - channelEntry->channelRegister.chDXELstDesclRegAddr = baseAddress + WLANDXE_DMA_CH_LST_DESCL_REG; - channelEntry->channelRegister.chDXECtrlRegAddr = baseAddress + WLANDXE_DMA_CH_CTRL_REG; - channelEntry->channelRegister.chDXESzRegAddr = baseAddress + WLANDXE_DMA_CH_SZ_REG; - channelEntry->channelRegister.chDXEDadrlRegAddr = baseAddress + WLANDXE_DMA_CH_DADRL_REG; - channelEntry->channelRegister.chDXEDadrhRegAddr = baseAddress + WLANDXE_DMA_CH_DADRH_REG; - channelEntry->channelRegister.chDXESadrlRegAddr = baseAddress + WLANDXE_DMA_CH_SADRL_REG; - channelEntry->channelRegister.chDXESadrhRegAddr = baseAddress + WLANDXE_DMA_CH_SADRH_REG; - - /* Channel Mask? - * This value will control channel control register. - * This register will be set to trigger actual DMA transfer activate - * CH_N_CTRL */ - channelEntry->extraConfig.chan_mask = 0; - /* Check VAL bit before processing descriptor */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDVEN_MASK; - /* Use External Descriptor Linked List */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EDEN_MASK; - /* Enable Channel Interrupt on error */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ERR_MASK; - /* Enable INT after XFER done */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_DONE_MASK; - /* Enable INT External Descriptor */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_INE_ED_MASK; - /* Set Channel This is not channel, event counter, somthing wrong */ - channelEntry->extraConfig.chan_mask |= - mappedChannel->DMAChannel << WLANDXE_CH_CTRL_CTR_SEL_OFFSET; - /* Transfer Type */ - channelEntry->extraConfig.chan_mask |= mappedChannel->channelConfig->xfrType; - /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */ - if(!channelEntry->channelConfig.useShortDescFmt) - { - channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_DFMT; - } - /* TX Channel, Set DIQ bit, Clear SIQ bit since source is not WQ */ - if((HIFDXE_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_DIQ_MASK; - } - /* RX Channel, Set SIQ bit, Clear DIQ bit since source is not WQ */ - else if((HIFDXE_CHANNEL_RX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_RX_HIGH_PRI == channelEntry->channelType)) - { - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SIQ_MASK; - } - else - { - /* This is test H2H channel, TX, RX not use work Q - * Do Nothing */ - } - /* Frame Contents Swap */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_SWAP_MASK; - /* Host System Using Little Endian */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_ENDIAN_MASK; - /* BMU Threshold select */ - channelEntry->extraConfig.chan_mask |= - channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET; - /* EOP for control register ??? */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EOP_MASK; - /* Channel Priority */ - channelEntry->extraConfig.chan_mask |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET; - /* PDU REL */ - channelEntry->extraConfig.chan_mask |= WLANDXE_DESC_CTRL_PDU_REL; - /* Disable DMA transfer on this channel */ - channelEntry->extraConfig.chan_mask_read_disable = channelEntry->extraConfig.chan_mask; - /* Enable DMA transfer on this channel */ - channelEntry->extraConfig.chan_mask |= WLANDXE_CH_CTRL_EN_MASK; - /* Channel Mask done */ - - /* Control Read - * Default Descriptor control Word value for RX ready DXE descriptor - * DXE engine will reference this value before DMA transfer */ - dxeControlRead = 0; - /* Source is a Queue ID, not flat memory address */ - dxeControlRead |= WLANDXE_DESC_CTRL_SIQ; - /* Transfer direction is BMU 2 Host */ - dxeControlRead |= WLANDXE_DESC_CTRL_XTYPE_B2H; - /* End of Packet, RX is single fragment */ - dxeControlRead |= WLANDXE_DESC_CTRL_EOP; - /* BD Present, default YES, B2H case it must be 0 to insert BD */ - if(!channelEntry->channelConfig.bdPresent) - { - dxeControlRead |= WLANDXE_DESC_CTRL_BDH; - } - /* Channel Priority */ - dxeControlRead |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET; - /* BMU Threshold select, only used H2B, not this case??? */ - dxeControlRead |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET; - /* PDU Release, Release BD/PDU when DMA done */ - dxeControlRead |= WLANDXE_DESC_CTRL_PDU_REL; - /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */ - if(!channelEntry->channelConfig.useShortDescFmt) - { - dxeControlRead |= WLANDXE_DESC_CTRL_DFMT; - } - /* Interrupt on Descriptor done */ - dxeControlRead |= WLANDXE_DESC_CTRL_INT; - /* For ready status, this Control WORD must be VALID */ - dxeControlRead |= WLANDXE_DESC_CTRL_VALID; - /* Frame Contents Swap */ - dxeControlRead |= WLANDXE_DESC_CTRL_BDT_SWAP; - /* Host Little Endian */ - if((HIFDXE_CHANNEL_TX_LOW_PRI == channelEntry->channelType) || - (HIFDXE_CHANNEL_TX_HIGH_PRI == channelEntry->channelType)) - { - dxeControlRead |= WLANDXE_DESC_CTRL_ENDIANNESS; - } - - /* SWAP if needed */ - channelEntry->extraConfig.cw_ctrl_read = WLANDXE_U32_SWAP_ENDIAN(dxeControlRead); - /* Control Read Done */ - - /* Control Write - * Write into DXE descriptor control word to TX frame - * DXE engine will reference this word to contorl TX DMA channel */ - channelEntry->extraConfig.cw_ctrl_write = 0; - /* Transfer type, from Host 2 BMU */ - dxeControlWrite |= mappedChannel->channelConfig->xfrType; - /* BD Present, this looks some weird ??? */ - if(!channelEntry->channelConfig.bdPresent) - { - dxeControlWrite |= WLANDXE_DESC_CTRL_BDH; - } - /* Channel Priority */ - dxeControlWrite |= channelEntry->channelConfig.chPriority << WLANDXE_CH_CTRL_PRIO_OFFSET; - /* Use Short Descriptor, THIS LOOKS SOME WIERD, REVISIT */ - if(!channelEntry->channelConfig.useShortDescFmt) - { - dxeControlWrite |= WLANDXE_DESC_CTRL_DFMT; - } - /* BMU Threshold select, only used H2B, not this case??? */ - dxeControlWrite |= channelEntry->channelConfig.bmuThdSel << WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET; - /* Destination is WQ */ - dxeControlWrite |= WLANDXE_DESC_CTRL_DIQ; - /* Frame Contents Swap */ - dxeControlWrite |= WLANDXE_DESC_CTRL_BDT_SWAP; - /* Host Little Endian */ - dxeControlWrite |= WLANDXE_DESC_CTRL_ENDIANNESS; - /* Interrupt Enable */ - dxeControlWrite |= WLANDXE_DESC_CTRL_INT; - - dxeControlWriteValid = dxeControlWrite | WLANDXE_DESC_CTRL_VALID; - dxeControlWriteEop = dxeControlWriteValid | WLANDXE_DESC_CTRL_EOP; - dxeControlWriteEopInt = dxeControlWriteEop | WLANDXE_DESC_CTRL_INT; - - /* DXE Descriptor must has Endian swapped value */ - channelEntry->extraConfig.cw_ctrl_write = WLANDXE_U32_SWAP_ENDIAN(dxeControlWrite); - /* Control Write DONE */ - - /* Control Write include VAL bit - * This Control word used to set valid bit and - * trigger DMA transfer for specific descriptor */ - channelEntry->extraConfig.cw_ctrl_write_valid = - WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteValid); - - /* Control Write include EOP - * End of Packet */ - channelEntry->extraConfig.cw_ctrl_write_eop = - WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEop); - - /* Control Write include EOP and INT - * indicate End Of Packet and generate interrupt on descriptor Done */ - channelEntry->extraConfig.cw_ctrl_write_eop_int = - WLANDXE_U32_SWAP_ENDIAN(dxeControlWriteEopInt); - - - /* size mask???? */ - channelEntry->extraConfig.chk_size_mask = - mappedChannel->channelConfig->chk_size << 10; - - channelEntry->extraConfig.refWQ_swapped = - WLANDXE_U32_SWAP_ENDIAN(channelEntry->channelConfig.refWQ); - - /* Set Channel specific Interrupt mask */ - channelEntry->extraConfig.intMask = channelInterruptMask[mappedChannel->DMAChannel]; - - - channelEntry->numDesc = mappedChannel->channelConfig->nDescs; - channelEntry->assignedDMAChannel = mappedChannel->DMAChannel; - adf_os_atomic_set(&channelEntry->numFreeDesc, 0); - adf_os_atomic_set(&channelEntry->numRsvdDesc, 0); - adf_os_atomic_set(&channelEntry->numFragmentCurrentChain, 0); - channelEntry->numTotalFrame = 0; - channelEntry->hitLowResource = FALSE; - return status; -} diff --git a/CORE/SERVICES/HIF/DXE/hif_dxe_hw_pvt.h b/CORE/SERVICES/HIF/DXE/hif_dxe_hw_pvt.h deleted file mode 100644 index ef971b80c2e1..000000000000 --- a/CORE/SERVICES/HIF/DXE/hif_dxe_hw_pvt.h +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** - * @file hif_dxe_desc_pvt.h - * @brief Defines DXE HW Descriptor Structure Format - * @details - * This file Provides the HIF DXE HW Descriptor Definitions/ DMA Channel Structure / DMA Control And Data Descriptors. - * DXE software module communicates with the RIVA DXE HW block for data path which - * is a DMA engine to transfer Data from Host DDR to Target DDR. - */ -#ifndef _HIF_DXE_DESC_PVT_H_ -#define _HIF_DXE_DESC_PVT_H_ -#include <athdefs.h> -#include <adf_os_atomic.h> -/*---------------------------------------------------------------------------- - * Preprocessor Definitions and Constants - * -------------------------------------------------------------------------*/ -#define WLANDXE_CTXT_COOKIE 0xC00CC111 - - -/* From here RIVA DXE register information - * This is temporary definition location to make compile and unit test - * If official msmreg.h integrated, this part will be eliminated */ -/* Start with base address */ - - -#define WLANDXE_BMU_BD_THRES0_MASK 0x000007ff - -#ifdef QCA_ISOC_PRONTO - -#define WLANDXE_CCU_DXE_INT_SELECT 0xfb2050dc -#define WLANDXE_CCU_DXE_INT_SELECT_STAT 0xfb2050e0 -#define WLANDXE_CCU_ASIC_INT_ENABLE 0xfb2050e4 -#define WLANDXE_RIVA_BASE_ADDRESS 0xfb000000 -#define WLANDXE_BMU_AVAILABLE_BD_PDU 0xfb080084 -#define WLANDXE_BMU_PDU_THRES0 0xfb080014 -#else - -#define WLANDXE_CCU_DXE_INT_SELECT 0x03200b10 -#define WLANDXE_CCU_DXE_INT_SELECT_STAT 0x03200b14 -#define WLANDXE_CCU_ASIC_INT_ENABLE 0x03200b18 -#define WLANDXE_RIVA_BASE_ADDRESS 0x03000000 -#define WLANDXE_BMU_AVAILABLE_BD_PDU 0x03080084 -#define WLANDXE_BMU_PDU_THRES0 0x03080014 -#endif //QCA_ISOC_PRONTO - -#define WLANDXE_REGISTER_BASE_ADDRESS WLANDXE_RIVA_BASE_ADDRESS + 0x202000 - -/* Common over the channels register addresses */ -#define WALNDEX_DMA_CSR_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x00 -#define WALNDEX_DMA_ENCH_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x04 -#define WALNDEX_DMA_CH_EN_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x08 -#define WALNDEX_DMA_CH_DONE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x0C -#define WALNDEX_DMA_CH_ERR_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x10 -#define WALNDEX_DMA_CH_STOP_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x14 - -/* Interrupt Control register address */ -#define WLANDXE_INT_MASK_REG_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x18 -#define WLANDXE_INT_SRC_MSKD_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x1C -#define WLANDXE_INT_SRC_RAW_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x20 -#define WLANDXE_INT_ED_SRC_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x24 -#define WLANDXE_INT_DONE_SRC_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x28 -#define WLANDXE_INT_ERR_SRC_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x2C -#define WLANDXE_INT_CLR_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x30 -#define WLANDXE_INT_ED_CLR_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x34 -#define WLANDXE_INT_DONE_CLR_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x38 -#define WLANDXE_INT_ERR_CLR_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x3C - -#define WLANDXE_DMA_CH_PRES_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x40 -#define WLANDXE_ARB_CH_MSK_CLR_ADDRRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x74 - -/* Channel Counter register */ -#define WLANDXE_DMA_COUNTER_0 WLANDXE_REGISTER_BASE_ADDRESS + 0x200 -#define WLANDXE_DMA_COUNTER_1 WLANDXE_REGISTER_BASE_ADDRESS + 0x204 -#define WLANDXE_DMA_COUNTER_2 WLANDXE_REGISTER_BASE_ADDRESS + 0x208 -#define WLANDXE_DMA_COUNTER_3 WLANDXE_REGISTER_BASE_ADDRESS + 0x20C -#define WLANDXE_DMA_COUNTER_4 WLANDXE_REGISTER_BASE_ADDRESS + 0x210 -#define WLANDXE_DMA_COUNTER_5 WLANDXE_REGISTER_BASE_ADDRESS + 0x214 -#define WLANDXE_DMA_COUNTER_6 WLANDXE_REGISTER_BASE_ADDRESS + 0x218 - -#define WLANDXE_ENGINE_STAT_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x64 -#define WLANDXE_BMU_SB_QDAT_AV_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x5c - -/* Channel Base address */ -#define WLANDXE_DMA_CHAN0_BASE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x400 -#define WLANDXE_DMA_CHAN1_BASE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x440 -#define WLANDXE_DMA_CHAN2_BASE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x480 -#define WLANDXE_DMA_CHAN3_BASE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x4C0 -#define WLANDXE_DMA_CHAN4_BASE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x500 -#define WLANDXE_DMA_CHAN5_BASE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x540 -#define WLANDXE_DMA_CHAN6_BASE_ADDRESS WLANDXE_REGISTER_BASE_ADDRESS + 0x580 - -/* Channel specific register offset */ -#define WLANDXE_DMA_CH_CTRL_REG 0x0000 -#define WLANDXE_DMA_CH_STATUS_REG 0x0004 -#define WLANDXE_DMA_CH_SZ_REG 0x0008 -#define WLANDXE_DMA_CH_SADRL_REG 0x000C -#define WLANDXE_DMA_CH_SADRH_REG 0x0010 -#define WLANDXE_DMA_CH_DADRL_REG 0x0014 -#define WLANDXE_DMA_CH_DADRH_REG 0x0018 -#define WLANDXE_DMA_CH_DESCL_REG 0x001C -#define WLANDXE_DMA_CH_DESCH_REG 0x0020 -#define WLANDXE_DMA_CH_LST_DESCL_REG 0x0024 -#define WLANDXE_DMA_CH_LST_DESCH_REG 0x0028 -#define WLANDXE_DMA_CH_BD_REG 0x002C -#define WLANDXE_DMA_CH_HEAD_REG 0x0030 -#define WLANDXE_DMA_CH_TAIL_REG 0x0034 -#define WLANDXE_DMA_CH_PDU_REG 0x0038 -#define WLANDXE_DMA_CH_TSTMP_REG 0x003C - -/* Common CSR Register Contorol mask and offset */ -#define WLANDXE_DMA_CSR_RESERVED_MASK 0xFFFE0000 -#define WLANDXE_DMA_CSR_RESERVED_OFFSET 0x11 -#define WLANDXE_DMA_CSR_RESERVED_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_MASK 0x10000 -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_OFFSET 0x10 -#define WLANDXE_DMA_CSR_H2H_SYNC_EN_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_PAUSED_MASK 0x8000 -#define WLANDXE_DMA_CSR_PAUSED_OFFSET 0xF -#define WLANDXE_DMA_CSR_PAUSED_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_ECTR_EN_MASK 0x4000 -#define WLANDXE_DMA_CSR_ECTR_EN_OFFSET 0xE -#define WLANDXE_DMA_CSR_ECTR_EN_DEFAULT 0x4000 - -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_MASK 0x3E00 -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_OFFSET 0x9 -#define WLANDXE_DMA_CSR_B2H_TSTMP_OFF_DEFAULT 0xE00 - -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_MASK 0x1F0 -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_OFFSET 0x4 -#define WLANDXE_DMA_CSR_H2B_TSTMP_OFF_DEFAULT 0x50 - -#define WLANDXE_DMA_CSR_TSTMP_EN_MASK 0x8 -#define WLANDXE_DMA_CSR_TSTMP_EN_OFFSET 0x3 -#define WLANDXE_DMA_CSR_TSTMP_EN_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_RESET_MASK 0x4 -#define WLANDXE_DMA_CSR_RESET_OFFSET 0x2 -#define WLANDXE_DMA_CSR_RESET_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_PAUSE_MASK 0x2 -#define WLANDXE_DMA_CSR_PAUSE_OFFSET 0x1 -#define WLANDXE_DMA_CSR_PAUSE_DEFAULT 0x0 - -#define WLANDXE_DMA_CSR_EN_MASK 0x1 -#define WLANDXE_DMA_CSR_EN_OFFSET 0x0 -#define WLANDXE_DMA_CSR_EN_DEFAULT 0x0 -#define WLANDXE_DMA_CSR_DEFAULT 0x4E50 - -/* Channel CTRL Register Control mask and offset */ -#define WLANDXE_CH_CTRL_RSVD_MASK 0x80000000 -#define WLANDXE_CH_CTRL_RSVD_OFFSET 0x1F -#define WLANDXE_CH_CTRL_RSVD_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_SWAP_MASK 0x80000000 - -#define WLANDXE_CH_CTRL_BDT_IDX_MASK 0x60000000 -#define WLANDXE_CH_CTRL_BDT_IDX_OFFSET 0x1D -#define WLANDXE_CH_CTRL_BDT_IDX_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_DFMT_MASK 0x10000000 -#define WLANDXE_CH_CTRL_DFMT_OFFSET 0x1C -#define WLANDXE_CH_CTRL_DFMT_DEFAULT 0x10000000 -#define WLANDXE_CH_CTRL_DFMT_ESHORT 0x0 -#define WLANDXE_CH_CTRL_DFMT_ELONG 0x1 - -#define WLANDXE_CH_CTRL_ABORT_MASK 0x8000000 -#define WLANDXE_CH_CTRL_ABORT_OFFSET 0x1B -#define WLANDXE_CH_CTRL_ABORT_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_ENDIAN_MASK 0x4000000 - -#define WLANDXE_CH_CTRL_CTR_SEL_MASK 0x3C00000 -#define WLANDXE_CH_CTRL_CTR_SEL_OFFSET 0x16 -#define WLANDXE_CH_CTRL_CTR_SEL_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_EDVEN_MASK 0x200000 -#define WLANDXE_CH_CTRL_EDVEN_OFFSET 0x15 -#define WLANDXE_CH_CTRL_EDVEN_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_EDEN_MASK 0x100000 -#define WLANDXE_CH_CTRL_EDEN_OFFSET 0x14 -#define WLANDXE_CH_CTRL_EDEN_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_INE_DONE_MASK 0x80000 -#define WLANDXE_CH_CTRL_INE_DONE_OFFSET 0x13 -#define WLANDXE_CH_CTRL_INE_DONE_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_INE_ERR_MASK 0x40000 -#define WLANDXE_CH_CTRL_INE_ERR_OFFSET 0x12 -#define WLANDXE_CH_CTRL_INE_ERR_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_INE_ED_MASK 0x20000 -#define WLANDXE_CH_CTRL_INE_ED_OFFSET 0x11 -#define WLANDXE_CH_CTRL_INE_ED_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_STOP_MASK 0x10000 -#define WLANDXE_CH_CTRL_STOP_OFFSET 0x10 -#define WLANDXE_CH_CTRL_STOP_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_PRIO_MASK 0xE000 -#define WLANDXE_CH_CTRL_PRIO_OFFSET 0xD -#define WLANDXE_CH_CTRL_PRIO_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_BTHLD_SEL_MASK 0x1E00 -#define WLANDXE_CH_CTRL_BTHLD_SEL_OFFSET 0x9 -#define WLANDXE_CH_CTRL_BTHLD_SEL_DEFAULT 0x600 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD0 0x0 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD1 0x1 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD2 0x2 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD3 0x3 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD4 0x4 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD5 0x5 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD6 0x6 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD7 0x7 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD8 0x8 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD9 0x9 -#define WLANDXE_CH_CTRL_BTHLD_SEL_ETHLD10 0xA -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD11 0xB -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD12 0xC -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD13 0xD -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD14 0xE -#define WLANDXE_CH_CTRL_BTHLD_SEL_ERSVD15 0xF - -#define WLANDXE_CH_CTRL_PDU_REL_MASK 0x100 -#define WLANDXE_CH_CTRL_PDU_REL_OFFSET 0x8 -#define WLANDXE_CH_CTRL_PDU_REL_DEFAULT 0x100 -#define WLANDXE_CH_CTRL_PDU_REL_EKEEP 0x0 -#define WLANDXE_CH_CTRL_PDU_REL_ERELEASE 0x1 - -#define WLANDXE_CH_CTRL_PIQ_MASK 0x80 -#define WLANDXE_CH_CTRL_PIQ_OFFSET 0x7 -#define WLANDXE_CH_CTRL_PIQ_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_PIQ_EFLAT 0x0 -#define WLANDXE_CH_CTRL_PIQ_EQUEUE 0x1 - -#define WLANDXE_CH_CTRL_DIQ_MASK 0x40 -#define WLANDXE_CH_CTRL_DIQ_OFFSET 0x6 -#define WLANDXE_CH_CTRL_DIQ_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_DIQ_EFLAT 0x0 -#define WLANDXE_CH_CTRL_DIQ_EQUEUE 0x1 - -#define WLANDXE_CH_CTRL_SIQ_MASK 0x20 -#define WLANDXE_CH_CTRL_SIQ_OFFSET 0x5 -#define WLANDXE_CH_CTRL_SIQ_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_SIQ_EFLAT 0x0 -#define WLANDXE_CH_CTRL_SIQ_EQUEUE 0x1 - -#define WLANDXE_CH_CTRL_BDH_MASK 0x10 -#define WLANDXE_CH_CTRL_BDH_OFFSET 0x4 -#define WLANDXE_CH_CTRL_BDH_DEFAULT 0x0 - -#define WLANDXE_CH_CTRL_EOP_MASK 0x8 -#define WLANDXE_CH_CTRL_EOP_OFFSET 0x3 -#define WLANDXE_CH_CTRL_EOP_DEFAULT 0x8 - -#define WLANDXE_CH_CTRL_XTYPE_MASK 0x6 -#define WLANDXE_CH_CTRL_XTYPE_OFFSET 0x1 -#define WLANDXE_CH_CTRL_XTYPE_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_XTYPE_EH2H 0x0 -#define WLANDXE_CH_CTRL_XTYPE_EB2B 0x1 -#define WLANDXE_CH_CTRL_XTYPE_EH2B 0x2 -#define WLANDXE_CH_CTRL_XTYPE_EB2H 0x3 - -#define WLANDXE_CH_CTRL_DONE_MASK 0x4 - -#define WLANDXE_CH_CTRL_ERR_MASK 0x20 - -#define WLANDXE_CH_CTRL_MASKED_MASK 0x8 - -#define WLANDXE_CH_CTRL_EN_MASK 0x1 -#define WLANDXE_CH_CTRL_EN_OFFSET 0x0 -#define WLANDXE_CH_CTRL_EN_DEFAULT 0x0 -#define WLANDXE_CH_CTRL_DEFAULT 0x10000708 - - -#define WLANDXE_DESC_CTRL_VALID 0x00000001 -#define WLANDXE_DESC_CTRL_XTYPE_MASK 0x00000006 -#define WLANDXE_DESC_CTRL_XTYPE_H2H 0x00000000 -#define WLANDXE_DESC_CTRL_XTYPE_B2B 0x00000002 -#define WLANDXE_DESC_CTRL_XTYPE_H2B 0x00000004 -#define WLANDXE_DESC_CTRL_XTYPE_B2H 0x00000006 -#define WLANDXE_DESC_CTRL_EOP 0x00000008 -#define WLANDXE_DESC_CTRL_BDH 0x00000010 -#define WLANDXE_DESC_CTRL_SIQ 0x00000020 -#define WLANDXE_DESC_CTRL_DIQ 0x00000040 -#define WLANDXE_DESC_CTRL_PIQ 0x00000080 -#define WLANDXE_DESC_CTRL_PDU_REL 0x00000100 -#define WLANDXE_DESC_CTRL_BTHLD_SEL 0x00001E00 -#define WLANDXE_DESC_CTRL_PRIO 0x0000E000 -#define WLANDXE_DESC_CTRL_STOP 0x00010000 -#define WLANDXE_DESC_CTRL_INT 0x00020000 -#define WLANDXE_DESC_CTRL_BDT_SWAP 0x00100000 -#define WLANDXE_DESC_CTRL_ENDIANNESS 0x00200000 -#define WLANDXE_DESC_CTRL_DFMT 0x10000000 -#define WLANDXE_DESC_CTRL_RSVD 0xfffc0000 -/* CSR Register Control mask and offset */ - -#define WLANDXE_CH_STAT_INT_DONE_MASK 0x00008000 -#define WLANDXE_CH_STAT_INT_ERR_MASK 0x00004000 -#define WLANDXE_CH_STAT_INT_ED_MASK 0x00002000 - -#define WLANDXE_CH_STAT_MASKED_MASK 0x00000008 -/* Till here RIVA DXE register information - * This is temporary definition location to make compile and unit test - * If official msmreg.h integrated, this part will be eliminated */ - -/* Interrupt control channel mask */ -#define WLANDXE_INT_MASK_CHAN_0 0x00000001 -#define WLANDXE_INT_MASK_CHAN_1 0x00000002 -#define WLANDXE_INT_MASK_CHAN_2 0x00000004 -#define WLANDXE_INT_MASK_CHAN_3 0x00000008 -#define WLANDXE_INT_MASK_CHAN_4 0x00000010 -#define WLANDXE_INT_MASK_CHAN_5 0x00000020 -#define WLANDXE_INT_MASK_CHAN_6 0x00000040 - -/** DXE HW Long Descriptor format */ -typedef struct -{ - adf_os_dma_addr_t srcMemAddrL; - adf_os_dma_addr_t srcMemAddrH; - adf_os_dma_addr_t dstMemAddrL; - adf_os_dma_addr_t dstMemAddrH; - adf_os_dma_addr_t phyNextL; - adf_os_dma_addr_t phyNextH; -} WLANDXE_LongDesc; - - -/** DXE HW Short Descriptor format */ -typedef struct tDXEShortDesc -{ - adf_os_dma_addr_t srcMemAddrL; - adf_os_dma_addr_t dstMemAddrL; - adf_os_dma_addr_t phyNextL; -} WLANDXE_ShortDesc; - - -/* DXE Descriptor Data Type - * Pick up from GEN5 */ -//FIXME_RT Check if this Needs to be byte packed -typedef struct -{ - union - { - u_int32_t ctrl; - u_int32_t valid :1; //0 = DMA stop, 1 = DMA continue with this descriptor - u_int32_t transferType :2; //0 = Host to Host space - u_int32_t eop :1; //End of Packet - u_int32_t bdHandling :1; //if transferType = Host to BMU, then 0 means first 128 bytes contain BD, and 1 means create new empty BD - u_int32_t siq :1; // SIQ - u_int32_t diq :1; // DIQ - u_int32_t pduRel :1; //0 = don't release BD and PDUs when done, 1 = release them - u_int32_t bthldSel :4; //BMU Threshold Select - u_int32_t prio :3; //Specifies the priority level to use for the transfer - u_int32_t stopChannel :1; //1 = DMA stops processing further, channel requires re-enabling after this - u_int32_t intr :1; //Interrupt on Descriptor Done - u_int32_t rsvd :1; //reserved - u_int32_t transferSize :14; //14 bits used - ignored for BMU transfers, only used for host to host transfers? - } descCtrl; - u_int32_t xfrSize; - union - { - WLANDXE_LongDesc dxe_long_desc; - WLANDXE_ShortDesc dxe_short_desc; - }dxedesc; -} WLANDXE_DescType; - -#endif diff --git a/CORE/SERVICES/HIF/DXE/hif_dxe_os.h b/CORE/SERVICES/HIF/DXE/hif_dxe_os.h deleted file mode 100644 index 3d3412681881..000000000000 --- a/CORE/SERVICES/HIF/DXE/hif_dxe_os.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** - * @file hif_dxe_os.h - * @brief Provide OS Specific Shim Layer API for DXE HIF module. - * @details - * This file Provides the OS Specific Layer API for HIF DXE Module. - * DXE software module communicates with this API for Windows OS specific Initialization - * Provides API For : - * 1. OS Initialization required for DXE Module - * 2. Read/Write DXE registers in OS Specific Manner - * 3. Allocate/Free DMA Memory for DXE Descriptors - * 4. Communicate with SMSM Driver - * 5. Other - */ -#ifndef _HIF_DXE_OS_H_ -#define _HIF_DXE_OS_H_ - -#include "adf_os_types.h" -#include "athdefs.h" -#include "a_debug.h" - -struct _S_HIF_DXE_OSCONTEXT; -typedef struct _S_HIF_DXE_OSCONTEXT * hif_dxe_oshandle; - -typedef enum _E_DXE_INTTYPE -{ - E_HIFDXE_TX_INTERRUPT, - E_HIFDXE_RX_INTERRUPT -}E_DXE_INTTYPE; - -typedef enum _E_DXE_INT_ACTION -{ - E_HIFDXE_INT_ENABLE, - E_HIFDXE_INT_DISABLE, - E_HIFDXE_INT_ACTIVATE, - E_HIFDXE_INT_DEACTIVATE -}E_DXE_INT_ACTION; - -typedef A_STATUS (*hif_dxe_os_cb)(void *ctx); - - - -typedef struct _S_HIF_DXE_OS_PARAMS -{ - hif_dxe_os_cb dxe_tx_cb; - hif_dxe_os_cb dxe_rx_cb; - void *pvcontext; -}S_HIF_DXE_OS_PARAMS; - -#define HIFDXE_SMSM_WLAN_TX_ENABLE 0x00000400 -#define HIFDXE_SMSM_WLAN_TX_RINGS_NOT_EMPTY 0x00000200 - -A_STATUS ol_ath_dxe_initialize(void* Adapter); - - -/** - * @ HIF OS Init Dxe - * - * @param[in/out] osdev OS Specific Context - * - * @retval hif_dxe_oshandle Returns OS Specific Allocation Handle - */ -hif_dxe_oshandle hif_dxe_os_init(adf_os_device_t osdev, - S_HIF_DXE_OS_PARAMS *params); - - -/** - * @ HIF OS DeInit Dxe - * - * @param[in]hif_dxe_osdev OS Specific Context - * - * @retval void - */ -void hif_dxe_os_deinit(hif_dxe_oshandle hif_dxe_osdev); - -/** - * @ HIF OS Enable / Disable TXRX Interrupt - * - * @param[in]hif_dxe_osdev - OS Specific Context - * @param[in]eIntType - * @param[in]bEnable - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_os_program_int(hif_dxe_oshandle hif_dxe_osdev , - E_DXE_INTTYPE eIntType , E_DXE_INT_ACTION eAction); - - -/** - * @ HIF OS Notify SMSM - * - * @param[in]hif_dxe_osdev - OS Specific Context - * @param[in]clrSt - * @param[in]setSt - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_os_notifysmsm(hif_dxe_oshandle hif_dxe_osdev, - u_int32_t clrSt, u_int32_t setSt); - -/** - * @brief HIF Os Read register - * - * @param[in] OS Context - * @param[in] Addr - * - * @return Read Value - */ -u_int32_t -hif_dxe_os_readreg(hif_dxe_oshandle hif_dxe_osdev, u_int32_t addr); - - -/** - * @brief HIF Os Write register - * - * @param[in] OS Context - * @param[in] Addr - * @param[in] val - * - * @return void - */ -void -hif_dxe_os_writereg(hif_dxe_oshandle hif_dxe_osdev, u_int32_t addr, - u_int32_t val); - -/** - * @brief HIF Mem Barrier - * - * @param[in] void - * - * @return void - */ -void hif_dxe_os_mem_barrier(void); - -void hif_dxe_os_dbgdump(hif_dxe_oshandle hif_dxe_osdev); - -void hif_dxe_os_stop(hif_dxe_oshandle hif_dxe_osdev); - -#endif /* _HIF_DXE_OS_H_ */
\ No newline at end of file diff --git a/CORE/SERVICES/HIF/DXE/hif_dxe_pvt.h b/CORE/SERVICES/HIF/DXE/hif_dxe_pvt.h deleted file mode 100644 index ccc484c55632..000000000000 --- a/CORE/SERVICES/HIF/DXE/hif_dxe_pvt.h +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/** - * @file hif_dxe_pvt.h - * @brief Defines Software Structures used by DXE - * @details - * This file Provides the HIF DXE Software Structures. - * DXE software module communicates with the RIVA DXE HW block for data path which - * is a DMA engine to transfer Data from Host DDR to Target DDR. - */ -#ifndef _HIF_DXE_PVT_H_ -#define _HIF_DXE_PVT_H_ -#include <adf_os_types.h> -#include <adf_os_atomic.h> -#include <adf_os_lock.h> -#include <adf_nbuf.h> /* adf_nbuf_t */ -#include <adf_os_timer.h> -#include "hif_dxe.h" -#include "hif_dxe_os.h" - - -/* DXE Descriptor Endian swap macro */ -#ifdef WLANDXE_ENDIAN_SWAP_ENABLE -#define WLANDXE_U32_SWAP_ENDIAN(a) (((a & 0x000000FF) << 24) | \ - ((a & 0x0000FF00) << 8) | \ - ((a & 0x00FF0000) >> 8) | \ - ((a & 0xFF000000) >> 24)) -#else -/* If DXE HW does not need endian swap, DO NOTHING */ -#define WLANDXE_U32_SWAP_ENDIAN(a) (a) -#endif /* WLANDXE_ENDIAN_SWAP_ENABLE */ - -#define TX_INT_SELECT(ch) (1L << ch) -#define RX_INT_SELECT(ch) (1L << (ch + 16)) - -/** Map logical channel to DXE channel */ -#define CH_TX_LOW_PRI (0) -#define CH_TX_HIGH_PRI (4) -#define CH_RX_LOW_PRI (1) -#define CH_RX_HIGH_PRI (3) - -#define HIF_DXE_TX_PENDING_DEBUG_THRESHOLD 5 -// Number of resources which are allocated from ACPI table for RIVA -#define HIFDXE_NUM_OS_MEM_RES (1) // memory 0x03000000 - 0x04000000 -#define HIFDXE_NUM_INTR_RES (2) // TX complete(235) and RX ready(234) - -#define HIFDXE_RX_INTERRUPT_PRO_MASK 0x20 -#define HIFDXE_TX_INTERRUPT_PRO_MASK 0x40 -#define HIFDXE_RX_INTERRUPT_PRO_UNMASK 0x5F -#define HIFDXE_TX_INTERRUPT_PRO_UNMASK 0x3F -#define HIFDXE_TX_CHANNELS_EN_BIT_MASK 0x11 -//FIXME_RT Check This Wait Duration -#define HIFDXE_MAX_TX_CH_DISABLE_WAIT 500 /* MAX 500 usec wait */ - - -/* - * The DXE low-priority channel should be able to accept at least - * as many fragm ents as would be present in a maximum-sized A-MPDU - * (64 frames x number of fragments per frame). - * A small additional margin is provded. - */ -#define HIFDXE_TX_MAX_FRMS 64 -#define HIFDXE_TX_AVG_FRAGS_PER_FRAME 5 /* avg for windows */ -#define HIFDXE_TX_LO_PRI_RES_MARGIN 30 -#define HIFDXE_TX_LO_PRI_RES_NUM (HIFDXE_TX_MAX_FRMS * HIFDXE_TX_AVG_FRAGS_PER_FRAME + HIFDXE_TX_LO_PRI_RES_MARGIN) - - -/*The maximum number of packets that can be chained in dxe for the HI - priority channel */ -#define HIFDXE_TX_HI_PRI_RES_NUM 10 - -#define WLANDXE_TX_LOW_RES_THRESHOLD (5) - -#define HIF_DXE_NUM_RX_CHANNEL 2 -#define HIF_DXE_RX_BUFFER_SIZE 2612 -#define HIF_DXE_RX_RING_REFILL_RETRY_TIME_MS 50 - -/*---------------------------------------------------------------------------- - * Type Declarations - * -------------------------------------------------------------------------*/ -/* DMA Channel Q handle Method type - * Linear handle or circular */ -typedef enum -{ - WLANDXE_CHANNEL_HANDLE_LINEAR, - WLANDXE_CHANNEL_HANDLE_CIRCULA -}WLANDXE_ChannelHandleType; - -typedef enum -{ - WLANDXE_TX_COMP_INT_LR_THRESHOLD, - WLANDXE_TX_COMP_INT_PER_K_FRAMES, - WLANDXE_TX_COMP_INT_TIMER -} WLANDXE_TXCompIntEnableType; - -typedef enum -{ - WLANDXE_SHORT_DESCRIPTOR, - WLANDXE_LONG_DESCRIPTOR -} WLANDXE_DescriptorType; - -typedef enum -{ - WLANDXE_DMA_CHANNEL_0, - WLANDXE_DMA_CHANNEL_1, - WLANDXE_DMA_CHANNEL_2, - WLANDXE_DMA_CHANNEL_3, - WLANDXE_DMA_CHANNEL_4, - WLANDXE_DMA_CHANNEL_5, - WLANDXE_DMA_CHANNEL_6, - WLANDXE_DMA_CHANNEL_MAX -} WLANDXE_DMAChannelType; - -typedef struct _WLANDXE_DescCtrlBlkType { - struct _WLANDXE_DescCtrlBlkType *nextCtrlBlk; - adf_nbuf_t xfrFrame; - volatile WLANDXE_DescType *linkedDesc; - adf_os_dma_addr_t linkedDescPhyAddr; - A_UINT32 ctrlBlkOrder; -} WLANDXE_DescCtrlBlkType; - -typedef struct -{ - /* Q handle method, linear or ring */ - WLANDXE_ChannelHandleType queueMethod; - - /* Number of descriptors for DXE that can be queued for transfer at one time */ - u_int32_t nDescs; - - /* Maximum number of receive buffers of shared memory to use for this pipe */ - u_int32_t nRxBuffers; - - /* Reference WQ - for H2B and B2H only */ - u_int32_t refWQ; - - /* for usb only, endpoint info for CH_SADR or CH_DADR */ - u_int32_t refEP; - - /* H2B(Tx), B2H(Rx), H2H(SRAM<->HostMem R/W) */ - u_int32_t xfrType; - - /* Channel Priority 7(Highest) - 0(Lowest) */ - u_int32_t chPriority; - - /* 1 = BD attached to frames for this pipe */ - u_int8_t bdPresent; - - u_int32_t chk_size; - - u_int32_t bmuThdSel; - - /* Added in Gen5 for Prefetch */ - u_int8_t useLower4G; - - u_int8_t useShortDescFmt; - /* Till here inharited from GEN5 code */ - /* From now on, added for PRIMA */ -} WLANDXE_ChannelConfigType; - -typedef struct -{ - u_int32_t chDXEBaseAddr; - u_int32_t chDXEStatusRegAddr; - u_int32_t chDXEDesclRegAddr; - u_int32_t chDXEDeschRegAddr; - u_int32_t chDXELstDesclRegAddr; - u_int32_t chDXECtrlRegAddr; - u_int32_t chDXESzRegAddr; - u_int32_t chDXEDadrlRegAddr; - u_int32_t chDXEDadrhRegAddr; - u_int32_t chDXESadrlRegAddr; - u_int32_t chDXESadrhRegAddr; -} WLANDXE_ChannelRegisterType; - -typedef struct -{ - u_int32_t refWQ_swapped; - u_int8_t chEnabled; - u_int8_t chConfigured; - u_int32_t channel; - u_int32_t chk_size_mask; - u_int32_t bmuThdSel_mask; - u_int32_t cw_ctrl_read; - u_int32_t cw_ctrl_write; - u_int32_t cw_ctrl_write_valid; - u_int32_t cw_ctrl_write_eop; - u_int32_t cw_ctrl_write_eop_int; - u_int32_t chan_mask; - u_int32_t chan_mask_read_disable; - u_int32_t intMask; -} WLANDXE_ChannelExConfigType; - -typedef enum -{ - HIF_DXE_POWER_STATE_FULL, - HIF_DXE_POWER_STATE_IMPS, - HIF_DXE_POWER_STATE_BMPS, - HIF_DXE_POWER_STATE_BMPS_PENDING, - HIF_DXE_POWER_STATE_DOWN, - HIF_DXE_POWER_STATE_MAX -} E_DXE_HOST_PS_TYPE; - -typedef enum -{ - HIF_DXE_FW_POWER_STATE_ACTIVE, - HIF_DXE_FW_POWER_STATE_IMPS_UNKNOWN, - HIF_DXE_FW_POWER_STATE_BMPS_UNKNOWN, - HIF_DXE_FW_POWER_STATE_DOWN_UNKNOWN, - HIF_DXE_FW_POWER_STATE_MAX -} E_DXE_FIRMWARE_PS_TYPE; - - -typedef struct -{ - struct _S_HIFDXE_CONTEXT *dxe_ctx; // back pointer to DXE context - E_HIFDXE_CHANNELTYPE channelType; - WLANDXE_DescCtrlBlkType *headCtrlBlk; - WLANDXE_DescCtrlBlkType *tailCtrlBlk; - struct - { - void *vaddr; - adf_os_dma_addr_t paddr; - adf_os_dma_mem_context(memctx); - } descblk_mem_pool; - void *ctrlblk_mem_pool; //Memory Pool For per Descriptor Control Block - volatile WLANDXE_DescType *DescBottomLoc; - adf_os_dma_addr_t descBottomLocPhyAddr; - u_int32_t numDesc; - adf_os_atomic_t numFreeDesc; - adf_os_atomic_t numRsvdDesc; - u_int32_t maxFrameSize; - adf_os_atomic_t numFragmentCurrentChain; - u_int32_t numFramePrevious; - u_int32_t numTotalFrame; - adf_os_atomic_t tx_pkts_pending; - adf_os_spinlock_t dxeChannelLock; //Per Channel Spin Lock for Synchronization at DISPATCH LEVEL - u_int8_t hitLowResource; - WLANDXE_ChannelConfigType channelConfig; - WLANDXE_ChannelRegisterType channelRegister; - WLANDXE_ChannelExConfigType extraConfig; - WLANDXE_DMAChannelType assignedDMAChannel; - u_int32_t txIntTracing; - u_int32_t txCompIntTracing; - u_int32_t errorIntCount; - adf_os_atomic_t rx_refill_ref_cnt; - u_int8_t rx_prev_intr_completed_frames; - adf_os_timer_t rx_refill_retry_timer; -} WLANDXE_ChannelCBType; - -typedef struct -{ - WLANDXE_TXCompIntEnableType txIntEnable; - u_int32_t txLowResourceThreshold_LoPriCh; - u_int32_t txLowResourceThreshold_HiPriCh; - u_int32_t rxLowResourceThreshold; - u_int32_t txInterruptEnableFrameCount; - u_int32_t txInterruptEnablePeriod; -} WLANDXE_TxCompIntConfigType; - -typedef struct _S_HIFDXE_CONTEXT -{ - adf_os_device_t osdev; - WLANDXE_ChannelCBType dxeChannel[HIFDXE_CHANNEL_MAX]; - u_int8_t rxIntDisabledByIMPS; - u_int8_t txIntDisabledByIMPS; - u_int32_t dxeCookie; - hif_dxe_oshandle hif_os_handle; - WLANDXE_TxCompIntConfigType txCompInt; - adf_os_atomic_t tx_pkts_pending; - S_HIFDXE_CALLBACK hif_client_cb; - volatile E_DXE_HOST_PS_TYPE hostPowerState; - volatile E_DXE_FIRMWARE_PS_TYPE fwPowerState; - adf_os_atomic_t ref_count; - adf_os_atomic_t tx_pk_count; - - -//Do Not Need These variables . Check and clean. -#ifdef FIXME_RT - u_int32_t interruptPath; - WLANDXE_SetPowerStateCbType setPowerStateCb; - u_int8_t ucTxMsgCnt; - u_int16_t lastKickOffDxe; - u_int32_t dxeFlushTxFrames; -#endif -} S_HIFDXE_CONTEXT; -#endif diff --git a/CORE/SERVICES/HIF/DXE/linux/hif_dxe_os.c b/CORE/SERVICES/HIF/DXE/linux/hif_dxe_os.c deleted file mode 100644 index 8deb89ca1fc5..000000000000 --- a/CORE/SERVICES/HIF/DXE/linux/hif_dxe_os.c +++ /dev/null @@ -1,822 +0,0 @@ -/* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/**======================================================================== - - \file hif_dxe_os.c - \brief Implementation of WMA - Provide Linux OS Specific Shim Layer Implementation for - DXE HIF module. - - This file Provides the Linux OS Specific Layer API for - HIF DXE Module. - - DXE software module communicates with this layer - for Linux Specific Functionality - - Implements : - 1. Linux OS Initialization required for DXE Module - - Get hold of and Initialize DXE OS Resources( - Interrupt , Shared memory)/SMSM Device - - Register ISR/Tasklets for TXRX Interrupts - - Enable/Disable TXRX Interrupts - - DMA Adapter Registration / Initialization - 2. Read/Write DXE registers in Windows Platform Specific Manner - 3. Allocate/Free DMA Memory for DXE Descriptors - - ========================================================================*/ -/**========================================================================= - EDIT HISTORY FOR FILE - - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - $Header:$ $DateTime: $ $Author: $ - - - when who what, where, why - -------- --- ----------------------------------------- - 05/03/2013 Ganesh Created module for HIF Dxe Linux Specific - Babu - ==========================================================================*/ - -#include "adf_os_types.h" -#include "adf_os_lock.h" -#include "adf_os_mem.h" -#include "athdefs.h" -#include "a_debug.h" -#include "hif_dxe_os.h" -#include "hif_dxe_ospvt.h" -#include "hif_dxe.h" -#include "hif_dxe_hw_pvt.h" -#include "hif_dxe_pvt.h" -#include <mach/msm_smsm.h> -#include "vos_threads.h" - -#define ATH_MODULE_NAME hif_dxe_linuxos - -#define HIF_DXE_LINUXOS_DEBUG ATH_DEBUG_MAKE_MODULE_MASK(0) - -#if defined(DEBUG) -static ATH_DEBUG_MASK_DESCRIPTION g_HIFOSDebugDescription[] = { - {HIF_DXE_LINUXOS_DEBUG,"hif_dxe_linuxos"}, -}; - -ATH_DEBUG_INSTANTIATE_MODULE_VAR(hif_dxe_linuxos, - "hif_dxe_linuxos", - "DXE HIF Linux OS Shim Interface", - ATH_DEBUG_MASK_DEFAULTS | ATH_DEBUG_INFO | HIF_DXE_LINUXOS_DEBUG, - ATH_DEBUG_DESCRIPTION_COUNT(g_HIFOSDebugDescription), - g_HIFOSDebugDescription); -#endif - -irqreturn_t hif_dxe_os_tx_isr(int irq,void* pSrvcCtx); -irqreturn_t hif_dxe_os_rx_isr(int irq,void* pSrvcCtx); - - -/** - * @ HIF OS Enable Tx Interrupt - * - * @param[in/out] osdev OS Specific Context - * - * @retval TRUE/FALSE [Success/Fail] - */ -unsigned char hif_dxe_os_enable_tx_intr(void* pctx) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = pctx; - u_int32_t val; - int ret; - - /* Enable Tx IRQ at OS level */ - if(!hif_dxeos_ctx->bTxRegistered) - { - ret = request_irq(hif_dxeos_ctx->tx_irq, hif_dxe_os_tx_isr, - IRQF_TRIGGER_HIGH, "wcnss_wlan", hif_dxeos_ctx); - - if(ret) - { - /* TX IRQ request failed */ - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, - ("hif_dxe_os_enable_tx_interrupt : " - "TX IRQ request failed\n")); - - return FALSE; - } - - hif_dxeos_ctx->bTxRegistered = TRUE; - hif_dxeos_ctx->bTxIntEnabled = TRUE; - - enable_irq_wake(hif_dxeos_ctx->tx_irq); - } - else if(!hif_dxeos_ctx->bTxIntEnabled) - { - hif_dxeos_ctx->bTxIntEnabled = TRUE; - enable_irq(hif_dxeos_ctx->tx_irq); - } - - /* Enable Tx Channel Interrupt */ - val = TX_INT_SELECT(CH_TX_LOW_PRI) | TX_INT_SELECT(CH_TX_HIGH_PRI) | - DXE_READ_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT); - - DXE_WRITE_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT,val); - - return TRUE; -} - -/** - * @ HIF OS Disable Tx Interrupt - * - * @param[in/out] osdev OS Specific Context - * - * @retval void - */ -unsigned char hif_dxe_os_disable_tx_intr(void* pctx) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = pctx; - u_int32_t val = 0; - - /* Disable Tx Channel Interrupt */ - val = ~TX_INT_SELECT(CH_TX_LOW_PRI) & ~TX_INT_SELECT(CH_TX_HIGH_PRI) & - DXE_READ_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT); - - DXE_WRITE_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT,val); - - /* Disable Tx Irq at OS level */ - disable_irq_nosync(hif_dxeos_ctx->tx_irq); - - hif_dxeos_ctx->bTxIntEnabled = FALSE; - - return TRUE; -} - -/** - * @ HIF OS Enable Rx Interrupt - * - * @param[in/out] osdev OS Specific Context - * - * @retval TRUE/FALSE [Success/Fail] - */ -unsigned char hif_dxe_os_enable_rx_intr(void* pctx) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = pctx; - u_int32_t val = 0; - int ret = 0; - - /* Enable Rx IRQ at OS level */ - if(!hif_dxeos_ctx->bRxRegistered) - { - ret = request_irq(hif_dxeos_ctx->rx_irq, hif_dxe_os_rx_isr, - IRQF_TRIGGER_HIGH, "wcnss_wlan", hif_dxeos_ctx); - - if(ret) - { - /* RX IRQ request failed */ - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, - ("hif_dxe_os_enable_tx_interrupt :" - "RX IRQ request failed\n")); - - return FALSE; - } - - hif_dxeos_ctx->bRxRegistered = TRUE; - hif_dxeos_ctx->bRxIntEnabled = TRUE; - - enable_irq_wake(hif_dxeos_ctx->rx_irq); - } - else if(!hif_dxeos_ctx->bRxIntEnabled) - { - hif_dxeos_ctx->bRxIntEnabled = TRUE; - enable_irq(hif_dxeos_ctx->rx_irq); - } - - /* Enable Rx Channel Interrupt */ - val = RX_INT_SELECT(CH_RX_LOW_PRI) | RX_INT_SELECT(CH_RX_HIGH_PRI) | - DXE_READ_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT); - - DXE_WRITE_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT,val); - - return TRUE; -} - -/** - * @ HIF OS Disable Rx Interrupt - * - * @param[in/out] osdev OS Specific Context - * - * @retval void - */ -unsigned char hif_dxe_os_disable_rx_intr(void* pctx) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = pctx; - u_int32_t val = 0; - - /* Disable Rx Channel Interrupt */ - val = ~RX_INT_SELECT(CH_RX_LOW_PRI) & ~RX_INT_SELECT(CH_RX_HIGH_PRI) & - DXE_READ_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT); - - DXE_WRITE_REG(hif_dxeos_ctx,WLANDXE_CCU_DXE_INT_SELECT,val); - - /* Disable Rx Irq at OS level */ - disable_irq_nosync(hif_dxeos_ctx->rx_irq); - - hif_dxeos_ctx->bRxIntEnabled = FALSE; - - return TRUE; -} - -/** - @brief hif_dxe_os_tx_isr is the interrupt service routine which handles - the DXE TX Complete interrupt - - hif_dxe_os_tx_isr is registered with the Operating System to handle the - DXE TX Complete interrupt during system initialization. When a DXE - TX Complete interrupt occurs, it is dispatched to the handler which - had previously been registered via wpalRegisterInterrupt. - - @param dev_id: User-supplied data passed back via the ISR - - @return void - */ -irqreturn_t hif_dxe_os_tx_isr(int irq,void* pSrvcCtx) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = (S_HIF_DXE_OSCONTEXT *)pSrvcCtx; - u_int32_t val = 0; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s \n",__FUNCTION__)); - - if ((NULL == hif_dxeos_ctx) || - (NULL == hif_dxeos_ctx->dxe_hif_params.dxe_tx_cb) || - (FALSE == hif_dxeos_ctx->bTxIntEnabled)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "%s : Tx Intr Not Initalized " - "or Enabled \n",__FUNCTION__)); - - /* Whether we can return without Setting Processing Bit ???*/ - return IRQ_HANDLED; - } - - /* - Set Interrupt processing bit - During this bit set, WLAN HW may not power collapse - */ - val = DXE_READ_REG(hif_dxeos_ctx,WLANDXE_INT_MASK_REG_ADDRESS); - val |= HIFDXE_TX_INTERRUPT_PRO_MASK; - DXE_WRITE_REG(hif_dxeos_ctx,WLANDXE_INT_MASK_REG_ADDRESS, val); - - /* Disable TX Complete Interrupt at here */ - hif_dxe_os_disable_tx_intr(hif_dxeos_ctx); - - /* Deferred the processing to Tasklet */ - tasklet_schedule(&hif_dxeos_ctx->hif_dxe_tx_tasklet); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s \n",__FUNCTION__)); - return IRQ_HANDLED; -} - - -/** - @brief hif_dxe_tx_tasklet_proc - - Function which actually does the DXE TX Complete Processing. - This tasklet is scheduled from hif_dxe_os_tx_isr. - - @param dev_id: User-supplied data passed back via the ISR - - @return void - */ -void hif_dxe_os_tx_processing(unsigned long DeferredContext) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = (S_HIF_DXE_OSCONTEXT *)DeferredContext; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s \n",__FUNCTION__)); - - adf_os_atomic_inc(&hif_dxeos_ctx->ref_count); - - /* Call the Dxe Tx Callback */ - if ((NULL != hif_dxeos_ctx) && - (NULL != hif_dxeos_ctx->dxe_hif_params.dxe_tx_cb)) - { - hif_dxeos_ctx->dxe_hif_params.dxe_tx_cb( - hif_dxeos_ctx->dxe_hif_params.pvcontext); - } - - adf_os_atomic_dec(&hif_dxeos_ctx->ref_count); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); -} - -/** - @brief hif_dxe_rx_tasklet_proc - - Function which actually does the DXE Rx Data Avail Processing. - This tasklet is scheduled from hif_dxe_os_rx_isr. - - @param dev_id: User-supplied data passed back via the ISR - - @return void - */ -void hif_dxe_os_rx_processing(unsigned long DeferredContext) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = - (S_HIF_DXE_OSCONTEXT *)DeferredContext; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s \n",__FUNCTION__)); - - adf_os_atomic_inc(&hif_dxeos_ctx->ref_count); - - /* Call the Dxe Rx Callback */ - if ((NULL != hif_dxeos_ctx) && ( - NULL != hif_dxeos_ctx->dxe_hif_params.dxe_rx_cb)) - { - hif_dxeos_ctx->dxe_hif_params.dxe_rx_cb( - hif_dxeos_ctx->dxe_hif_params.pvcontext); - } - - adf_os_atomic_dec(&hif_dxeos_ctx->ref_count); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); -} - -/** - @brief hif_dxe_os_rx_isr is the interrupt service routine which handles - the DXE RX Available interrupt - - hif_dxe_os_rx_isr is registered with the Operating System to handle the - DXE RX Available interrupt during system initalization. When a DXE - RX Available interrupt occurs, it is dispatched to the handler which - had previously been registered via wpalRegisterInterrupt. - - @param irq: Enumeration of the interrupt that occurred - @param dev_id: User-supplied data passed back via the ISR - - @see hif_dxe_os_enable_rx_intr - - @return IRQ_HANDLED since it is a dedicated interrupt - */ -irqreturn_t hif_dxe_os_rx_isr(int irq, void* pSrvcCtx) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = - (S_HIF_DXE_OSCONTEXT *)pSrvcCtx; - u_int32_t val = 0; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s \n",__FUNCTION__)); - - if ((NULL == hif_dxeos_ctx) || - (NULL == hif_dxeos_ctx->dxe_hif_params.dxe_rx_cb) || - (FALSE == hif_dxeos_ctx->bRxIntEnabled)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, - ("%s : Rx Intr Not Initalized or " - "Enabled \n",__FUNCTION__)); - - /* Whether we can return without Setting Processing Bit ???*/ - return IRQ_HANDLED; - } - - /* - Set Interrupt processing bit - During this bit set, WLAN HW may not power collapse - */ - val = DXE_READ_REG(hif_dxeos_ctx,WLANDXE_INT_MASK_REG_ADDRESS); - val |= HIFDXE_RX_INTERRUPT_PRO_MASK; - DXE_WRITE_REG(hif_dxeos_ctx,WLANDXE_INT_MASK_REG_ADDRESS, val); - - /* Disable RX Complete Interrupt at here */ - hif_dxe_os_disable_rx_intr(hif_dxeos_ctx); - - /* Deferred the processing to Tasklet */ - tasklet_schedule(&hif_dxeos_ctx->hif_dxe_rx_tasklet); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s \n",__FUNCTION__)); - - return IRQ_HANDLED; -} - -A_STATUS ol_ath_dxe_initialize(void* Adapter) -{ - //gpAdapter = (PADAPTER)Adapter; - /* To Do */ - return A_OK; -} - - -/** - * @ HIF OS Init Dxe - * - * @param[in/out] osdev OS Specific Context - * - * @retval hif_dxe_oshandle Returns OS Specific Allocation Handle - */ -hif_dxe_oshandle hif_dxe_os_init(adf_os_device_t osdev , - S_HIF_DXE_OS_PARAMS *hif_dxe_os_params) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = NULL; - struct device *wcnss_device; - - if (NULL == osdev->dev) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "hif_dxe_os_init : Invalid Dev - Null\n")); - return NULL; - } - - /* Get the parent dev ????????? Need to check */ - wcnss_device = osdev->dev; - - hif_dxeos_ctx = (S_HIF_DXE_OSCONTEXT *) - adf_os_mem_alloc(osdev,sizeof(S_HIF_DXE_OSCONTEXT)); - - if (NULL == hif_dxeos_ctx) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "hif_dxe_os_init : Failed To " - "Allocate Memory for hif_dxeos_ctx \n")); - return NULL; - } - - adf_os_mem_set(hif_dxeos_ctx, 0, sizeof(S_HIF_DXE_OSCONTEXT)); - hif_dxeos_ctx->dxe_unloaded = 0; - adf_os_mem_copy(&hif_dxeos_ctx->dxe_hif_params, - hif_dxe_os_params,sizeof(S_HIF_DXE_OS_PARAMS)); - - do - { - /* Get the WCNSS Memory Map */ - hif_dxeos_ctx->wcnss_memory = - wcnss_wlan_get_memory_map(wcnss_device); - - if (NULL == hif_dxeos_ctx->wcnss_memory) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "hif_dxe_os_init : WCNSS memory map " - "unavailable\n")); - break; - } - - /* Get the wcnss Tx Irq */ - hif_dxeos_ctx->tx_irq = - wcnss_wlan_get_dxe_tx_irq(wcnss_device); - - if (0 > hif_dxeos_ctx->tx_irq) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "hif_dxe_os_init : " - "WCNSS TX IRQ unavailable\n")); - break; - } - - /* Get the wcnss Rx Irq */ - hif_dxeos_ctx->rx_irq = - wcnss_wlan_get_dxe_rx_irq(wcnss_device); - - if (0 > hif_dxeos_ctx->tx_irq) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "hif_dxe_os_init :" - "WCNSS RX IRQ unavailable\n")); - break; - } - - /* - 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 - */ - hif_dxeos_ctx->mmio = ioremap( - hif_dxeos_ctx->wcnss_memory->start, - resource_size( - hif_dxeos_ctx->wcnss_memory)); - - if (NULL == hif_dxeos_ctx->mmio) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "hif_dxe_os_init : " - "IO Memory Mapping Failed\n")); - break; - } - - /* Initialize Hif Dxe Tx Tasklet */ - tasklet_init(&hif_dxeos_ctx->hif_dxe_tx_tasklet, - hif_dxe_os_tx_processing, - (unsigned long)hif_dxeos_ctx); - - /* Initialize Hif Dxe Rx Tasklet */ - tasklet_init(&hif_dxeos_ctx->hif_dxe_rx_tasklet, - hif_dxe_os_rx_processing, - (unsigned long)hif_dxeos_ctx); - - /* successfully allocated environment, memory and IRQs */ - return hif_dxeos_ctx; - - }while(0); - - hif_dxe_os_deinit(hif_dxeos_ctx); - - return NULL; -} - - -/** - * @ HIF OS DeInit Dxe - * - * @param[in]hif_dxe_osdev OS Specific Context - * - * @retval void - */ -void hif_dxe_os_deinit(hif_dxe_oshandle hif_dxe_osdev) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = hif_dxe_osdev; - - if ((NULL == hif_dxeos_ctx)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "%s : Invalid DXE Context\n",__FUNCTION__)); - return; - } - - /* Free up registered Tx IRQ */ - if(hif_dxeos_ctx->bTxRegistered) - { - free_irq(hif_dxeos_ctx->tx_irq, hif_dxeos_ctx); - - /* Kill the Tx Tasklet */ - tasklet_kill(&hif_dxeos_ctx->hif_dxe_tx_tasklet); - } - - /* Free up registered Rx IRQ */ - if(hif_dxeos_ctx->bRxRegistered) - { - free_irq(hif_dxeos_ctx->rx_irq, hif_dxeos_ctx); - - /* Kill the Rx Tasklet */ - tasklet_kill(&hif_dxeos_ctx->hif_dxe_rx_tasklet); - } - - /* Unmap the IO Mapping */ - iounmap(hif_dxeos_ctx->mmio); - - /* Free up the allocated memory */ - adf_os_mem_free(hif_dxeos_ctx); - hif_dxeos_ctx = NULL; -} - -/** - * @ HIF Dxe OS Specific Initialization - * - * @param[in]hif_dxe_osdev - OS Specific Context - * @param[in]eIntType - * @param[in]bEnable - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_os_program_int(hif_dxe_oshandle hif_dxe_osdev , - E_DXE_INTTYPE eIntType , - E_DXE_INT_ACTION eAction) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = hif_dxe_osdev; - - switch (eIntType) - { - case E_HIFDXE_TX_INTERRUPT: - { - if (eAction == E_HIFDXE_INT_ENABLE) - { - if(FALSE == - hif_dxe_os_enable_tx_intr - (hif_dxeos_ctx)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "%s : Enable Tx " - "Intr Failed\n",__FUNCTION__)); - return A_ERROR; - } - } - else if (eAction == E_HIFDXE_INT_DISABLE) - { - if(FALSE == - hif_dxe_os_disable_tx_intr - (hif_dxeos_ctx)) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "%s : Disable Tx " - "Intr Failed\n",__FUNCTION__)); - return A_ERROR; - } - } - else if (eAction == E_HIFDXE_INT_ACTIVATE) - { - /* To Do */ - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "%s : E_HIFDXE_INT_ACTIVATE " - "Not Supported\n",__FUNCTION__)); - } - else if (eAction == E_HIFDXE_INT_DEACTIVATE) - { - /* To Do */ - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s : " - "E_HIFDXE_INT_DEACTIVATE " - "Not Supported\n",__FUNCTION__)); - } - } - break; - case E_HIFDXE_RX_INTERRUPT: - { - if (eAction == E_HIFDXE_INT_ENABLE) - { - if(FALSE == - hif_dxe_os_enable_rx_intr( - hif_dxeos_ctx)) - { - return A_ERROR; - } - } - else if (eAction == E_HIFDXE_INT_DISABLE) - { - if(FALSE == - hif_dxe_os_disable_rx_intr( - hif_dxeos_ctx)) - { - return A_ERROR; - } - } - else if (eAction == E_HIFDXE_INT_ACTIVATE) - { - /* To Do */ - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "%s : E_HIFDXE_INT_ACTIVATE " - "Not Supported\n",__FUNCTION__)); - } - else if (eAction == E_HIFDXE_INT_DEACTIVATE) - { - /* To Do */ - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,( - "%s : E_HIFDXE_INT_DEACTIVATE " - "Not Supported\n",__FUNCTION__)); - } - } - break; - } - return A_OK; -} - -/** - * @ HIF OS Notify SMSM - * - * @param[in]hif_dxe_osdev - OS Specific Context - * @param[in]clrSt - * @param[in]setSt - * - * @retval A_STATUS - */ -A_STATUS hif_dxe_os_notifysmsm(hif_dxe_oshandle hif_dxe_osdev, - u_int32_t clrSt, u_int32_t setSt) -{ - int rc; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ( - "+%s Clear : 0x%x Set : 0x%x\n",__FUNCTION__,( - unsigned int)clrSt,(unsigned int)setSt)); - - rc = smsm_change_state(SMSM_APPS_STATE, clrSt, setSt); - - if(0 != rc) - { - AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s : smsm_change_state Failed\n" - ,__FUNCTION__)); - return A_ERROR; - } - - return A_OK; -} - -/** - * @brief HIF OS Read register - * - * @param[in] OS Context - * @param[in] Addr - * - * @return Read Value - */ -u_int32_t hif_dxe_os_readreg(hif_dxe_oshandle hif_dxe_osdev, u_int32_t addr) -{ - u_int32_t val = 0; - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = hif_dxe_osdev; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s osdev : 0x%x mem : 0x%x addr : " - "0x%x\n",__FUNCTION__,(unsigned int)hif_dxeos_ctx, - (unsigned int)(hif_dxeos_ctx->mmio),( - unsigned int)addr)); - - val = readl_relaxed(hif_dxeos_ctx->mmio + ( - addr - WLANDXE_RIVA_BASE_ADDRESS)); - rmb(); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); - - return val; -} - -/** - * @brief HIF OS Write register - * - * @param[in] OS Context - * @param[in] Addr - * @param[in] val - * - * @return Read Value - */ -void hif_dxe_os_writereg(hif_dxe_oshandle hif_dxe_osdev, - u_int32_t addr, u_int32_t val) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = hif_dxe_osdev; - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s osdev : 0x%x mem : 0x%x " - "addr : 0x%x\n",__FUNCTION__,(unsigned int)hif_dxeos_ctx, - (unsigned int)hif_dxeos_ctx->mmio,(unsigned int)addr)); - - wmb(); - writel_relaxed(val, hif_dxeos_ctx->mmio + - (addr - WLANDXE_RIVA_BASE_ADDRESS)); - - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n",__FUNCTION__)); -} - -/** - * @brief HIF Mem Barrier - * - * @param[in] void - * - * @return void - */ -void hif_dxe_os_mem_barrier(void) -{ - /* Memory Barrier */ - mb(); -} - -#define DXE_STOP_WAIT_CNT 10 -#define DXE_STOP_WAIT_SLEEP_UNIT_MS 100 -/** - * @brief Notify HIF DXE OS Layer Of Stop - * - * @param[in] OS Context - * - * @return void - */ -void hif_dxe_os_stop(hif_dxe_oshandle hif_dxe_osdev) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = hif_dxe_osdev; - u_int8_t max_wait_cnt = DXE_STOP_WAIT_CNT; - - /* Wait For DXE Reference to complete (1 sec max)*/ - while (adf_os_atomic_read(&(hif_dxeos_ctx->ref_count)) - && (max_wait_cnt)) { - vos_sleep(DXE_STOP_WAIT_SLEEP_UNIT_MS); - max_wait_cnt--; - } -} - -/** - * @brief HIF DXE OS Layer Dump for Debug - * - * @param[in] OS Context - * - * @return void - */ -void hif_dxe_os_dbgdump(hif_dxe_oshandle hif_dxe_osdev) -{ - S_HIF_DXE_OSCONTEXT * hif_dxeos_ctx = hif_dxe_osdev; - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("hif_dxeos_ctx->mem : %x \n",( - unsigned int)hif_dxeos_ctx->mmio)); - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("hif_dxeos_ctx->mem_phy_start : %x \n",( - unsigned int)hif_dxeos_ctx->wcnss_memory->start)); - AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("hif_dxeos_ctx->mem_phy_end : %x \n",( - unsigned int)hif_dxeos_ctx->wcnss_memory->end)); -} diff --git a/CORE/SERVICES/HIF/DXE/linux/hif_dxe_ospvt.h b/CORE/SERVICES/HIF/DXE/linux/hif_dxe_ospvt.h deleted file mode 100644 index 2f6fa1d0f94c..000000000000 --- a/CORE/SERVICES/HIF/DXE/linux/hif_dxe_ospvt.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - -/**======================================================================== - - \file hif_dxe_ospvt.h - \brief OS Private Layer used by Linux DXE OS Specific Module - - ========================================================================*/ -/**========================================================================= - EDIT HISTORY FOR FILE - - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - $Header:$ $DateTime: $ $Author: $ - - - when who what, where, why - -------- --- ----------------------------------------- - 05/03/2013 Ganesh Created module for HIF Dxe Linux Specific - Babu - ==========================================================================*/ - -#ifndef _HIF_DXE_PVTOS_H_ -#define _HIF_DXE_PVTOS_H_ -#include <linux/irqreturn.h> -#include <linux/interrupt.h> -#include <linux/io.h> -#include "athdefs.h" -#include "adf_os_types.h" -#include "adf_os_atomic.h" -#include <linux/wcnss_wlan.h> - - -#define DXE_READ_REG(ctx,addr) hif_dxe_os_readreg(ctx,addr) -#define DXE_WRITE_REG(ctx,addr,val) hif_dxe_os_writereg(ctx,addr,val) - - -typedef struct _S_HIF_DXE_OSCONTEXT -{ - struct resource *wcnss_memory; - void __iomem *mmio; - - /***************************************/ - /* Tx Irq related Params */ - /***************************************/ - - int tx_irq; - - /* Whether Tx Irq is registered with the OS or not */ - unsigned char bTxRegistered; - - /* Tasklet to do the Tx Processing */ - struct tasklet_struct hif_dxe_tx_tasklet; - - - /***************************************/ - /* Rx Irq related Params */ - /***************************************/ - - int rx_irq; - - /* Whether Rx Irq is registered with the OS or not */ - unsigned char bRxRegistered; - - /* Tasklet to do the Rx Processing */ - struct tasklet_struct hif_dxe_rx_tasklet; - - unsigned char bTxIntEnabled , bRxIntEnabled; - S_HIF_DXE_OS_PARAMS dxe_hif_params; - adf_os_atomic_t ref_count; - - /* Currently not used. Is it required ??? */ - unsigned long dxe_unloaded; -}S_HIF_DXE_OSCONTEXT; -#endif diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h index 2dd18d0a9fc5..5c23554e488c 100644 --- a/CORE/WDA/inc/wlan_qct_wda.h +++ b/CORE/WDA/inc/wlan_qct_wda.h @@ -362,9 +362,6 @@ typedef struct tANI_U8 wdaMaxSta; tWdaTimers wdaTimers; - /* STA, AP, IBSS, MULTI-BSS etc.*/ - tBssSystemRole wdaGlobalSystemRole; - /* driver mode, PRODUCTION or FTM */ tDriverType driverMode; diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c deleted file mode 100644 index 142c577e203d..000000000000 --- a/CORE/WDA/src/wlan_qct_wda.c +++ /dev/null @@ -1,15069 +0,0 @@ -/* - * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - - -/*=========================================================================== - W L A N _ Q C T _ WDA . C - OVERVIEW: - This software unit holds the implementation of the WLAN Transport Layer. - The functions externalized by this module are to be called ONLY by other - WLAN modules that properly register with the Transport Layer initially. - DEPENDENCIES: - Are listed for each API below. -===========================================================================*/ -/*=========================================================================== - EDIT HISTORY FOR FILE - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - $Header$$DateTime$$Author$ - - when who what, where, why ----------- --- ------------------------------------------------- -10/05/2011 haparna Adding support for Keep Alive Feature -2010-12-30 smiryala UMAC convergence changes -2010-08-19 adwivedi WLAN DAL AL(WDA) layer for Prima -===========================================================================*/ -#include "vos_mq.h" -#include "vos_api.h" -#include "vos_packet.h" -#include "vos_nvitem.h" -#include "sirApi.h" -#include "wlan_qct_pal_packet.h" -#include "wlan_qct_wda.h" -#include "wlan_qct_wda_msg.h" -#include "wlan_qct_wdi_cfg.h" -#include "wlan_qct_wdi.h" -#include "wlan_qct_wdi_ds.h" -#include "wlan_hal_cfg.h" -/**********************/ -#include "wniApi.h" -#include "cfgApi.h" -#include "limApi.h" -#include "wlan_qct_tl.h" -#include "wlan_qct_tli_ba.h" -#include "limUtils.h" -#include "btcApi.h" -#include "vos_sched.h" -#include "pttMsgApi.h" -#include "wlan_qct_sys.h" - -/* 11A Channel list to decode RX BD channel information */ -static const tANI_U8 abChannel[]= {36,40,44,48,52,56,60,64,100,104,108,112,116, - 120,124,128,132,136,140,149,153,157,161,165}; - -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD -static const tANI_U8 aUnsortedChannelList[]= {52,56,60,64,100,104,108,112,116, - 120,124,128,132,136,140,36,40,44,48,149,153,157,161,165}; -#endif - -/* Used MACRO's */ -/* Get WDA context from vOSS module */ -#define VOS_GET_WDA_CTXT(a) vos_get_context(VOS_MODULE_ID_WDA, a) -#define VOS_GET_MAC_CTXT(a) vos_get_context(VOS_MODULE_ID_PE, a) -#define WDA_BA_TX_FRM_THRESHOLD (5) -#define CONVERT_WDI2SIR_STATUS(x) \ - ((WDI_STATUS_SUCCESS != (x)) ? eSIR_FAILURE : eSIR_SUCCESS) - -#define IS_WDI_STATUS_FAILURE(status) \ - ((WDI_STATUS_SUCCESS != (status)) && (WDI_STATUS_PENDING != (status))) -#define CONVERT_WDI2VOS_STATUS(x) \ - ((IS_WDI_STATUS_FAILURE(x)) ? VOS_STATUS_E_FAILURE : VOS_STATUS_SUCCESS) - -/* macro's for acessing TL API/data structures */ -#define WDA_TL_GET_STA_STATE(a, b, c) WLANTL_GetSTAState(a, b, c) -#define WDA_TL_GET_TX_PKTCOUNT(a, b, c, d) WLANTL_GetTxPktCount(a, b, c, d) -#define WDA_GET_BA_TXFLAG(a, b, c) \ - (((a)->wdaStaInfo[(b)].ucUseBaBitmap) & (1 << (c))) - -#define WDA_SET_BA_TXFLAG(a, b, c) \ - (((a)->wdaStaInfo[(b)].ucUseBaBitmap) |= (1 << (c))) - -#define WDA_CLEAR_BA_TXFLAG(a, b, c) \ - (((a)->wdaStaInfo[b].ucUseBaBitmap) &= ~(1 << c)) -#define WDA_TL_BA_SESSION_ADD(a, b, c, d, e, f, g) \ - WLANTL_BaSessionAdd(a, b, c, d, e, f, g) -/* timer related Macros */ -#define WDA_CREATE_TIMER(a, b, c, d, e, f, g) \ - tx_timer_create(a, b, c, d, e, f, g) -#define WDA_START_TIMER(a) tx_timer_activate(a) -#define WDA_STOP_TIMER(a) tx_timer_deactivate(a) -#define WDA_DESTROY_TIMER(a) tx_timer_delete(a) -#define WDA_WDI_START_TIMEOUT (WDI_RESPONSE_TIMEOUT + 5000) - -#define WDA_LAST_POLLED_THRESHOLD(a, curSta, tid) \ - ((a)->wdaStaInfo[curSta].framesTxed[tid] + WDA_BA_TX_FRM_THRESHOLD) -#define WDA_BA_MAX_WINSIZE (64) -#define WDA_INVALID_KEY_INDEX 0xFF -#define WDA_NUM_PWR_SAVE_CFG 11 -#define WDA_TX_COMPLETE_TIME_OUT_VALUE 1000 -#define WDA_TRAFFIC_STATS_TIME_OUT_VALUE 1000 - -#define WDA_MAX_RETRIES_TILL_RING_EMPTY 1000 /* MAX 10000 msec = 10 seconds wait */ - -#define WDA_WAIT_MSEC_TILL_RING_EMPTY 10 /* 10 msec wait per cycle */ -#define WDA_IS_NULL_MAC_ADDRESS(mac_addr) \ - ((mac_addr[0] == 0x00) && (mac_addr[1] == 0x00) && (mac_addr[2] == 0x00) &&\ - (mac_addr[1] == 0x00) && (mac_addr[2] == 0x00) && (mac_addr[3] == 0x00)) - -#define WDA_MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] -#define WDA_MAC_ADDRESS_STR "%02x:%02x:%02x:%02x:%02x:%02x" -#define WDA_DUMPCMD_WAIT_TIMEOUT 10000 - -/* extern declarations */ -extern void vos_WDAComplete_cback(v_PVOID_t pVosContext); -extern wpt_uint8 WDI_GetActiveSessionsCount (void *pWDICtx, wpt_macAddr macBSSID, wpt_boolean skipBSSID); - -/* forward declarations */ -void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType, - void *pBodyptr, tANI_U32 bodyVal) ; -VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext, - WDI_StartReqParamsType *wdiStartParams ) ; -VOS_STATUS WDA_wdiCompleteCB(v_PVOID_t pVosContext) ; -VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams); - -extern v_BOOL_t sys_validateStaConfig( void *pImage, unsigned long cbFile, - void **ppStaConfig, v_SIZE_t *pcbStaConfig ) ; -void processCfgDownloadReq(tpAniSirGlobal pMac, tANI_U16 length, - tANI_U32 *pConfig) ; -void WDA_UpdateBSSParams(tWDA_CbContext *pWDA, - WDI_ConfigBSSReqInfoType *wdiBssParams, tAddBssParams *wdaBssParams) ; -void WDA_UpdateSTAParams(tWDA_CbContext *pWDA, - WDI_ConfigStaReqInfoType *wdiStaParams, tAddStaParams *wdaStaParams) ; -void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd, - void* pUserData ) ; -static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA) ; -static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA); -void WDA_BaCheckActivity(tWDA_CbContext *pWDA) ; -void WDA_TimerTrafficStatsInd(tWDA_CbContext *pWDA); -void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams, void* pUserData); -#ifdef WLAN_FEATURE_VOWIFI_11R -VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA, tAggrAddTsParams *pAggrAddTsReqParams); -#endif /* WLAN_FEATURE_VOWIFI_11R */ - -void WDA_TimerHandler(v_VOID_t *pWDA, tANI_U32 timerInfo) ; -void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pContext) ; -VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA); -#ifdef FEATURE_WLAN_SCAN_PNO -static VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA, tSirPNOScanReq *pPNOScanReqParams); -static VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA, tSirSetRSSIFilterReq* pRssiFilterParams); -static VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA, tSirUpdateScanParams *pUpdateScanParams); -#endif // FEATURE_WLAN_SCAN_PNO -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD -VOS_STATUS WDA_ProcessRoamScanOffloadReq(tWDA_CbContext *pWDA,tSirRoamOffloadScanReq *pRoamOffloadScanReqParams); -void WDA_RoamOffloadScanReqCallback(WDI_Status status, void* pUserData); -void WDA_ConvertSirAuthToWDIAuth(WDI_AuthType *AuthType, v_U8_t csrAuthType); -void WDA_ConvertSirEncToWDIEnc(WDI_EdType *EncrType, v_U8_t csrEncrType); -#endif -#ifdef WLAN_FEATURE_PACKET_FILTERING -static VOS_STATUS WDA_Process8023MulticastListReq ( - tWDA_CbContext *pWDA, - tSirRcvFltMcAddrList *pRcvFltMcAddrLis - ); -static VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq ( - tWDA_CbContext *pWDA, - tSirRcvPktFilterCfgType *pRcvPktFilterCfg - ); -static VOS_STATUS WDA_ProcessPacketFilterMatchCountReq ( - tWDA_CbContext *pWDA, - tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp - ); -static VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq ( - tWDA_CbContext *pWDA, - tSirRcvFltPktClearParam *pRcvFltPktClearParam - ); -#endif // WLAN_FEATURE_PACKET_FILTERING -VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA, tSirSetPowerParamsReq *pPowerParams); -static VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA, - tpTxControlParams pTxCtrlParam); -VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA, - v_U8_t *pDefaultKeyId, - v_U8_t *pNumKeys, - WDI_KeysType *pWdiKeys ); - -#ifdef WLAN_FEATURE_GTK_OFFLOAD -static VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA, tpSirGtkOffloadParams pGtkOffloadParams); -static VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA, tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp); -#endif // WLAN_FEATURE_GTK_OFFLOAD - -VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA, - tAniSetTmLevelReq *setTmLevelReq); -#ifdef WLAN_FEATURE_11AC -VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA, - tUpdateVHTOpMode *pData); -#endif - -#ifdef FEATURE_WLAN_LPHB -VOS_STATUS WDA_ProcessLPHBConfReq(tWDA_CbContext *pWDA, - tSirLPHBReq *pData); -#endif /* FEATURE_WLAN_LPHB */ - -/* - * FUNCTION: WDA_open - * Allocate the WDA context - */ -VOS_STATUS WDA_open(v_PVOID_t pVosContext, v_PVOID_t pOSContext, - wda_tgt_cfg_cb pTgtUpdateCB, tMacOpenParameters *pMacParams) -{ - tWDA_CbContext *wdaContext; - VOS_STATUS status; - WDI_DeviceCapabilityType wdiDevCapability = {0} ; - /* Allocate WDA context */ - status = vos_alloc_context(pVosContext, VOS_MODULE_ID_WDA, - (v_VOID_t **)&wdaContext, sizeof(tWDA_CbContext)) ; - if(!VOS_IS_STATUS_SUCCESS(status)) - { - return VOS_STATUS_E_NOMEM; - } - /*__asm int 3;*/ - vos_mem_zero(wdaContext,sizeof(tWDA_CbContext)); - - /* Initialize data structures */ - wdaContext->pVosContext = pVosContext; - wdaContext->wdaState = WDA_INIT_STATE; - wdaContext->uTxFlowMask = WDA_TXFLOWMASK; - - /* Initialize WDA-WDI synchronization event */ - status = vos_event_init(&wdaContext->wdaWdiEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDI Sync Event init failed - status = %d", status); - goto error; - } - /* Init Frame transfer event */ - status = vos_event_init(&wdaContext->txFrameEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Mgmt Frame Event init failed - status = %d", status); - goto error; - } - status = vos_event_init(&wdaContext->suspendDataTxEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS suspend data tx Event init failed - status = %d", status); - goto error; - } - status = vos_event_init(&wdaContext->waitOnWdiIndicationCallBack); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS wait On Wdi Ind Event init failed - status = %d", status); - goto error; - } - vos_trace_setLevel(VOS_MODULE_ID_WDA,VOS_TRACE_LEVEL_ERROR); - wdaContext->driverMode = pMacParams->driverType; - if(WDI_STATUS_SUCCESS != WDI_Init(pOSContext, &wdaContext->pWdiContext, - &wdiDevCapability, pMacParams->driverType)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDI Init failed" ); - goto error; - } - else - { - pMacParams->maxStation = wdiDevCapability.ucMaxSTASupported ; - pMacParams->maxBssId = wdiDevCapability.ucMaxBSSSupported; - pMacParams->frameTransRequired = wdiDevCapability.bFrameXtlSupported; - /* update max STA in WDA used for BA */ - wdaContext->wdaMaxSta = pMacParams->maxStation; - /* store the frameTransRequired flag in wdaContext, to send this to HAL - * in WDA_Start - */ - wdaContext->frameTransRequired = wdiDevCapability.bFrameXtlSupported; - } - return status; - -error: - vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext); - return VOS_STATUS_E_FAILURE; -} - -/* - * FUNCTION: WDA_preStart - * Trigger DAL-AL to start CFG download - */ -VOS_STATUS WDA_preStart(v_PVOID_t pVosContext) -{ - VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; - vos_msg_t wdaMsg = {0} ; - /* - * trigger CFG download in WDA by sending WDA_CFG_DNLD message - */ - wdaMsg.type = WNI_CFG_DNLD_REQ ; - wdaMsg.bodyptr = NULL; - wdaMsg.bodyval = 0; - /* post the message.. */ - vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg ); - if ( !VOS_IS_STATUS_SUCCESS(vosStatus) ) - { - vosStatus = VOS_STATUS_E_BADMSG; - } - return( vosStatus ); -} -/* - * FUNCTION: WDA_wdiStartCallback - * Once WDI_Start is finished, WDI start callback will be called by WDI - * to indicate completion of WDI_Start. - */ -void WDA_wdiStartCallback(WDI_StartRspParamsType *wdiRspParams, - void *pVosContext) -{ - tWDA_CbContext *wdaContext; - VOS_STATUS status; - if (NULL == pVosContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: Invoked with invalid pVosContext", __func__ ); - return; - } - wdaContext = VOS_GET_WDA_CTXT(pVosContext); - if (NULL == wdaContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: Invoked with invalid wdaContext", __func__ ); - return; - } - if (WDI_STATUS_SUCCESS != wdiRspParams->wdiStatus) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: WDI_Start() failure reported", __func__ ); - } - else - { - wdaContext->wdaState = WDA_START_STATE; - } - /* extract and save version information from the Start Response */ - wdaContext->wcnssWlanCompiledVersion.major = - wdiRspParams->wlanCompiledVersion.major; - wdaContext->wcnssWlanCompiledVersion.minor = - wdiRspParams->wlanCompiledVersion.minor; - wdaContext->wcnssWlanCompiledVersion.version = - wdiRspParams->wlanCompiledVersion.version; - wdaContext->wcnssWlanCompiledVersion.revision = - wdiRspParams->wlanCompiledVersion.revision; - wdaContext->wcnssWlanReportedVersion.major = - wdiRspParams->wlanReportedVersion.major; - wdaContext->wcnssWlanReportedVersion.minor = - wdiRspParams->wlanReportedVersion.minor; - wdaContext->wcnssWlanReportedVersion.version = - wdiRspParams->wlanReportedVersion.version; - wdaContext->wcnssWlanReportedVersion.revision = - wdiRspParams->wlanReportedVersion.revision; - wpalMemoryCopy(wdaContext->wcnssSoftwareVersionString, - wdiRspParams->wcnssSoftwareVersion, - sizeof(wdaContext->wcnssSoftwareVersionString)); - wpalMemoryCopy(wdaContext->wcnssHardwareVersionString, - wdiRspParams->wcnssHardwareVersion, - sizeof(wdaContext->wcnssHardwareVersionString)); - /* Notify WDA_start that WDI_Start has completed */ - status = vos_event_set(&wdaContext->wdaWdiEvent); - if (VOS_STATUS_SUCCESS != status) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: Unable to unblock WDA_start", __func__ ); - } - return; -} - -/* - * FUNCTION: WDA_start - * Prepare TLV configuration and call WDI_Start. - */ -VOS_STATUS WDA_start(v_PVOID_t pVosContext) -{ - tWDA_CbContext *wdaContext; - VOS_STATUS status; - WDI_Status wdiStatus; - WDI_StartReqParamsType wdiStartParam; - if (NULL == pVosContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid pVosContext", __func__ ); - return VOS_STATUS_E_FAILURE; - } - wdaContext = VOS_GET_WDA_CTXT(pVosContext); - if (NULL == wdaContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid wdaContext", __func__ ); - return VOS_STATUS_E_FAILURE; - } - /* Non-FTM mode, WDA status for START must be INIT - * FTM mode, WDA Status for START can be INIT or STOP */ - if ( (WDA_INIT_STATE != wdaContext->wdaState) && - (WDA_STOP_STATE != wdaContext->wdaState) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked from wrong state %d", - __func__, wdaContext->wdaState ); - return VOS_STATUS_E_FAILURE; - } - /* initialize the wdiStartParam. Note that we can create this on - the stack since we won't exit until WDI_Start() completes or - times out */ - vos_mem_set(&wdiStartParam, sizeof(wdiStartParam), 0); - wdiStartParam.wdiDriverType = wdaContext->driverMode; - /* prepare the config TLV for the WDI */ - status = WDA_prepareConfigTLV(pVosContext, &wdiStartParam); - if ( !VOS_IS_STATUS_SUCCESS(status) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Unable to prepare Config TLV", __func__ ); - return VOS_STATUS_E_FAILURE; - } - /* note from here onwards if an error occurs we must - reclaim the config TLV buffer */ - wdiStartParam.wdiLowLevelIndCB = WDA_lowLevelIndCallback; - wdiStartParam.pIndUserData = (v_PVOID_t *)wdaContext; - wdiStartParam.wdiReqStatusCB = NULL; - /* initialize the WDA-WDI synchronization event */ - vos_event_reset(&wdaContext->wdaWdiEvent); - /* call WDI start */ - wdiStatus = WDI_Start(&wdiStartParam, - (WDI_StartRspCb)WDA_wdiStartCallback, - (v_VOID_t *)pVosContext); - if ( IS_WDI_STATUS_FAILURE(wdiStatus) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: WDI Start failed", __func__ ); - vos_mem_free(wdiStartParam.pConfigBuffer); - return VOS_STATUS_E_FAILURE; - } - /* wait for WDI start to invoke our callback */ - status = vos_wait_single_event( &wdaContext->wdaWdiEvent, - WDA_WDI_START_TIMEOUT ); - if ( !VOS_IS_STATUS_SUCCESS(status) ) - { - if ( VOS_STATUS_E_TIMEOUT == status ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Timeout occurred during WDI_Start", __func__ ); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Error %d while waiting for WDI_Start", - __func__, status); - } - vos_mem_free(wdiStartParam.pConfigBuffer); - return VOS_STATUS_E_FAILURE; - } - /* WDI_Start() has completed so we can resume our work */ - /* we no longer need the config TLV */ - vos_mem_free(wdiStartParam.pConfigBuffer); - /* if we are not in the START state then WDI_Start() failed */ - if (WDA_START_STATE != wdaContext->wdaState) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: WDI_Start() failure detected", __func__ ); - return VOS_STATUS_E_FAILURE; - } - /* FTM mode does not need to monitor BA activity */ - if ( eDRIVER_TYPE_MFG != wdaContext->driverMode ) - { - status = wdaCreateTimers(wdaContext) ; - if(VOS_STATUS_SUCCESS == status) - { - wdaContext->wdaTimersCreated = VOS_TRUE; - } - } - else - { - vos_event_init(&wdaContext->ftmStopDoneEvent); - } - return status; -} - -/* - * FUNCTION: WDA_prepareConfigTLV - * Function to prepare CFG for DAL(WDA) - */ -VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext, - WDI_StartReqParamsType *wdiStartParams ) -{ - /* get pMac to acess CFG data base */ - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pVosContext); - tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - tHalCfg *tlvStruct = NULL ; - tANI_U8 *tlvStructStart = NULL ; - tANI_U32 strLength = WNI_CFG_STA_ID_LEN; - v_PVOID_t *configParam; - tANI_U32 configParamSize; - tANI_U32 *configDataValue; - WDI_WlanVersionType wcnssCompiledApiVersion; - tANI_U8 i; - - if ((NULL == pMac)||(NULL == wdaContext)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid wdaContext or pMac", __func__ ); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - configParamSize = (sizeof(tHalCfg) * QWLAN_HAL_CFG_MAX_PARAMS) + - WNI_CFG_STA_ID_LEN + - WNI_CFG_EDCA_WME_ACBK_LEN + - WNI_CFG_EDCA_WME_ACBE_LEN + - WNI_CFG_EDCA_WME_ACVI_LEN + - WNI_CFG_EDCA_WME_ACVO_LEN + - + (QWLAN_HAL_CFG_INTEGER_PARAM * sizeof(tANI_U32)); - /* malloc memory for all configs in one shot */ - configParam = vos_mem_malloc(configParamSize); - - if(NULL == configParam ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:configParam is NULL", __func__); - VOS_ASSERT(0) ; - return VOS_STATUS_E_NOMEM; - } - vos_mem_set(configParam, configParamSize, 0); - wdiStartParams->pConfigBuffer = configParam; - tlvStruct = (tHalCfg *)configParam; - tlvStructStart = (tANI_U8 *)configParam; - /* TODO: Remove Later */ - /* QWLAN_HAL_CFG_STA_ID */ - tlvStruct->type = QWLAN_HAL_CFG_STA_ID; - configDataValue = (tANI_U32*)((tANI_U8 *) tlvStruct + sizeof(tHalCfg)); - if(wlan_cfgGetStr(pMac, WNI_CFG_STA_ID, (tANI_U8*)configDataValue, &strLength) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_STA_ID"); - goto handle_failure; - } - tlvStruct->length = strLength ; - /* calculate the pad bytes to have the CFG in aligned format */ - tlvStruct->padBytes = ALIGNED_WORD_SIZE - - (tlvStruct->length & (ALIGNED_WORD_SIZE - 1)); - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes)) ; - /* QWLAN_HAL_CFG_CURRENT_TX_ANTENNA */ - tlvStruct->type = QWLAN_HAL_CFG_CURRENT_TX_ANTENNA; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_TX_ANTENNA, configDataValue ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_CURRENT_RX_ANTENNA */ - tlvStruct->type = QWLAN_HAL_CFG_CURRENT_RX_ANTENNA; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_RX_ANTENNA, configDataValue) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_CURRENT_RX_ANTENNA"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE */ - tlvStruct->type = QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_LOW_GAIN_OVERRIDE, configDataValue ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_LOW_GAIN_OVERRIDE"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - - /* QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN */ - tlvStruct->type = QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_POWER_STATE_PER_CHAIN, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_POWER_STATE_PER_CHAIN"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - /* QWLAN_HAL_CFG_CAL_PERIOD */ - tlvStruct->type = QWLAN_HAL_CFG_CAL_PERIOD; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_PERIOD, configDataValue ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_CAL_PERIOD"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - /* QWLAN_HAL_CFG_CAL_CONTROL */ - tlvStruct->type = QWLAN_HAL_CFG_CAL_CONTROL ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_CONTROL, configDataValue ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_CAL_CONTROL"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - /* QWLAN_HAL_CFG_PROXIMITY */ - tlvStruct->type = QWLAN_HAL_CFG_PROXIMITY ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_PROXIMITY, configDataValue ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_PROXIMITY"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_NETWORK_DENSITY */ - tlvStruct->type = QWLAN_HAL_CFG_NETWORK_DENSITY ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_NETWORK_DENSITY, configDataValue ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_NETWORK_DENSITY"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - /* QWLAN_HAL_CFG_MAX_MEDIUM_TIME */ - tlvStruct->type = QWLAN_HAL_CFG_MAX_MEDIUM_TIME ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MEDIUM_TIME, configDataValue ) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_MAX_MEDIUM_TIME"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - /* QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU */ - tlvStruct->type = QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MPDUS_IN_AMPDU, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_MAX_MPDUS_IN_AMPDU"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_RTS_THRESHOLD */ - tlvStruct->type = QWLAN_HAL_CFG_RTS_THRESHOLD ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_RTS_THRESHOLD, configDataValue ) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_RTS_THRESHOLD"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - /* QWLAN_HAL_CFG_SHORT_RETRY_LIMIT */ - tlvStruct->type = QWLAN_HAL_CFG_SHORT_RETRY_LIMIT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_RETRY_LIMIT, configDataValue ) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_SHORT_RETRY_LIMIT"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_LONG_RETRY_LIMIT */ - tlvStruct->type = QWLAN_HAL_CFG_LONG_RETRY_LIMIT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_LONG_RETRY_LIMIT, configDataValue ) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_LONG_RETRY_LIMIT"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD */ - tlvStruct->type = QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO */ - tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ZERO, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ZERO"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - - /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE */ - tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ONE, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ONE"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO */ - tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_TWO, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_TWO"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - - /* QWLAN_HAL_CFG_FIXED_RATE */ - tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_FIXED_RATE"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - - /* QWLAN_HAL_CFG_RETRYRATE_POLICY */ - tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_POLICY ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_POLICY, configDataValue ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_RETRYRATE_POLICY"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - - /* QWLAN_HAL_CFG_RETRYRATE_SECONDARY */ - tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_SECONDARY ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_SECONDARY, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_RETRYRATE_SECONDARY"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_RETRYRATE_TERTIARY */ - tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_TERTIARY ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_TERTIARY, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_RETRYRATE_TERTIARY"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION */ - tlvStruct->type = QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_FORCE_POLICY_PROTECTION, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_FORCE_POLICY_PROTECTION"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ */ - tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_24GHZ, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_24GHZ"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ */ - tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_5GHZ, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_5GHZ"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - - /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ */ - tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_24GHZ, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_24GHZ"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - - /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ */ - tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_5GHZ, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_5GHZ"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - /* QWLAN_HAL_CFG_MAX_BA_SESSIONS */ - tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_SESSIONS ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_SESSIONS, configDataValue ) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_MAX_BA_SESSIONS"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - - /* QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT */ - tlvStruct->type = QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - /* QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER */ - tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_BCN_FILTER, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_PS_ENABLE_BCN_FILTER"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - /* QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR */ - tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_RSSI_MONITOR, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_PS_ENABLE_RSSI_MONITOR"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */ - tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - - /* QWLAN_HAL_CFG_STATS_PERIOD */ - tlvStruct->type = QWLAN_HAL_CFG_STATS_PERIOD ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_STATS_PERIOD, configDataValue ) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_STATS_PERIOD"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length); - /* QWLAN_HAL_CFG_CFP_MAX_DURATION */ - tlvStruct->type = QWLAN_HAL_CFG_CFP_MAX_DURATION ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_CFP_MAX_DURATION, configDataValue ) != - eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_CFP_MAX_DURATION"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_FRAME_TRANS_ENABLED */ - tlvStruct->type = QWLAN_HAL_CFG_FRAME_TRANS_ENABLED ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - vos_mem_copy(configDataValue, &wdaContext->frameTransRequired, - sizeof(tANI_U32)); - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_DTIM_PERIOD */ - tlvStruct->type = QWLAN_HAL_CFG_DTIM_PERIOD ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_DTIM_PERIOD, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_DTIM_PERIOD"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_EDCA_WMM_ACBK */ - tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBK ; - strLength = WNI_CFG_EDCA_WME_ACBK_LEN; - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBK, (tANI_U8 *)configDataValue, - &strLength) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_EDCA_WME_ACBK"); - goto handle_failure; - } - tlvStruct->length = strLength; - /* calculate the pad bytes to have the CFG in aligned format */ - tlvStruct->padBytes = ALIGNED_WORD_SIZE - - (tlvStruct->length & (ALIGNED_WORD_SIZE - 1)); - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; - /* QWLAN_HAL_CFG_EDCA_WMM_ACBE */ - tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBE ; - strLength = WNI_CFG_EDCA_WME_ACBE_LEN; - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBE, (tANI_U8 *)configDataValue, - &strLength) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_EDCA_WME_ACBE"); - goto handle_failure; - } - tlvStruct->length = strLength; - /* calculate the pad bytes to have the CFG in aligned format */ - tlvStruct->padBytes = ALIGNED_WORD_SIZE - - (tlvStruct->length & (ALIGNED_WORD_SIZE - 1)); - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; - /* QWLAN_HAL_CFG_EDCA_WMM_ACVI */ - tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVO ; - strLength = WNI_CFG_EDCA_WME_ACVI_LEN; - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVO, (tANI_U8 *)configDataValue, - &strLength) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_EDCA_WME_ACVI"); - goto handle_failure; - } - tlvStruct->length = strLength; - /* calculate the pad bytes to have the CFG in aligned format */ - tlvStruct->padBytes = ALIGNED_WORD_SIZE - - (tlvStruct->length & (ALIGNED_WORD_SIZE - 1)); - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; - /* QWLAN_HAL_CFG_EDCA_WMM_ACVO */ - tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVI ; - strLength = WNI_CFG_EDCA_WME_ACVO_LEN; - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVI, (tANI_U8 *)configDataValue, - &strLength) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_EDCA_WME_ACVO"); - goto handle_failure; - } - tlvStruct->length = strLength; - /* calculate the pad bytes to have the CFG in aligned format */ - tlvStruct->padBytes = ALIGNED_WORD_SIZE - - (tlvStruct->length & (ALIGNED_WORD_SIZE - 1)); - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ; - /* QWLAN_HAL_CFG_BA_THRESHOLD_HIGH */ - tlvStruct->type = QWLAN_HAL_CFG_BA_THRESHOLD_HIGH ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_BA_THRESHOLD_HIGH, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_BA_THRESHOLD_HIGH"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_MAX_BA_BUFFERS */ - tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_BUFFERS ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_BUFFERS, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_MAX_BA_BUFFERS"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE */ - tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_PS_POLL_VALUE, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_DYNAMIC_PS_POLL_VALUE"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI */ - tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS */ - tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI */ - tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS */ - tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN */ - tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_WAKEUP_EN, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TELE_BCN_WAKEUP_EN"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD */ - tlvStruct->type = QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /*QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE*/ - tlvStruct->type = QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TX_PWR_CTRL_ENABLE, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TX_PWR_CTRL_ENABLE"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP */ - tlvStruct->type = QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_CLOSE_LOOP, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_ENABLE_CLOSE_LOOP"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* [COEX] strictly speaking, the Coex parameters are not part of the WLAN_CFG_FILE binary, - * but are from the WLAN_INI_FILE file. However, this is the only parameter download routine - * into FW, so the parameters are added here. - */ - /* [COEX] QWLAN_HAL_CFG_BTC_EXECUTION_MODE */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_EXECUTION_MODE ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcExecutionMode; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcConsBtSlotsToBlockDuringDhcp; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* [COEX] QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcA2DPBtSubIntervalsDuringDhcp; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenInqBt; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenPageBt; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenConnBt; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenLeBt; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenInqWlan; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenPageWlan; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenConnWlan; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcStaticLenLeWlan; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcDynMaxLenBt; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcDynMaxLenWlan; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcMaxScoBlockPerc; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnA2dp; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO */ - tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnSco; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - for (i = 0; i < QWLAN_HAL_CFG_MWS_COEX_MAX_VICTIM; i++) - { - /* [COEX] QWLAN_HAL_CFG_MWS_COEX_VX_WAN_FREQ */ - tlvStruct->type = QWLAN_HAL_CFG_MWS_COEX_V1_WAN_FREQ + i*4; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.mwsCoexVictimWANFreq[i]; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_MWS_COEX_VX_WLAN_FREQ */ - tlvStruct->type = QWLAN_HAL_CFG_MWS_COEX_V1_WLAN_FREQ + i*4; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.mwsCoexVictimWLANFreq[i]; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_MWS_COEX_VX_CONFIG */ - tlvStruct->type = QWLAN_HAL_CFG_MWS_COEX_V1_CONFIG + i*4; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.mwsCoexVictimConfig[i]; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* [COEX] QWLAN_HAL_CFG_MWS_COEX_VX_CONFIG2 */ - tlvStruct->type = QWLAN_HAL_CFG_MWS_COEX_V1_CONFIG2 + i*4; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.mwsCoexVictimConfig2[i]; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - } - - /* [COEX] QWLAN_HAL_CFG_MWS_COEX_MODEM_BACKOFF */ - tlvStruct->type = QWLAN_HAL_CFG_MWS_COEX_MODEM_BACKOFF ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.mwsCoexModemBackoff; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - for (i = 0; i < QWLAN_HAL_CFG_MWS_COEX_MAX_CONFIG; i++) - { - /* [COEX] QWLAN_HAL_CFG_MWS_COEX_CONFIGX */ - tlvStruct->type = QWLAN_HAL_CFG_MWS_COEX_CONFIG1 + i; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.mwsCoexConfig[i]; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - } - - /* [COEX] QWLAN_HAL_CFG_SAR_POWER_BACKOFF */ - tlvStruct->type = QWLAN_HAL_CFG_SAR_POWER_BACKOFF ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = pMac->btc.btcConfig.SARPowerBackoff; - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_WCNSS_API_VERSION */ - tlvStruct->type = QWLAN_HAL_CFG_WCNSS_API_VERSION ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - WDI_GetWcnssCompiledApiVersion(&wcnssCompiledApiVersion); - *configDataValue = WLAN_HAL_CONSTRUCT_API_VERSION(wcnssCompiledApiVersion.major, - wcnssCompiledApiVersion.minor, - wcnssCompiledApiVersion.version, - wcnssCompiledApiVersion.revision); - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT */ - tlvStruct->type = QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_AP_KEEP_ALIVE_TIMEOUT, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_AP_KEEP_ALIVE_TIMEOUT"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT */ - tlvStruct->type = QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_GO_KEEP_ALIVE_TIMEOUT, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_GO_KEEP_ALIVE_TIMEOUT"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST */ - tlvStruct->type = QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_MC_ADDR_LIST, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_ENABLE_MC_ADDR_LIST"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_ENABLE_LPWR_IMG_TRANSITION */ - tlvStruct->type = QWLAN_HAL_CFG_ENABLE_LPWR_IMG_TRANSITION ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_LPWR_IMG_TRANSITION, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_ENABLE_LPWR_IMG_TRANSITION"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; -#ifdef WLAN_SOFTAP_VSTA_FEATURE - tlvStruct->type = QWLAN_HAL_CFG_MAX_ASSOC_LIMIT; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_ASSOC_STA_LIMIT"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; -#endif - - /* QWLAN_HAL_CFG_ENABLE_MCC_ADAPTIVE_SCHEDULER */ - tlvStruct->type = QWLAN_HAL_CFG_ENABLE_MCC_ADAPTIVE_SCHEDULER; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - - if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - -/* QWLAN_HAL_CFG_AP_LINK_MONITOR_TIMEOUT */ - tlvStruct->type = QWLAN_HAL_CFG_AP_LINK_MONITOR_TIMEOUT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_AP_LINK_MONITOR_TIMEOUT, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_AP_LINK_MONITOR_TIMEOUT"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; -#ifdef FEATURE_WLAN_TDLS - /* QWLAN_HAL_CFG_TDLS_PUAPSD_MASK */ - tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_MASK; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE */ - tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_ENABLED, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TDLS_BUF_STA_ENABLED"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME */ - tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_PUAPSD_INACT_TIME, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TDLS_PUAPSD_INACT_TIME"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - /* QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP */ - tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_RX_FRAME_THRESHOLD, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TDLS_RX_FRAME_THRESHOLD"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_TDLS_OFF_CHANNEL_CAPABLE */ - tlvStruct->type = QWLAN_HAL_CFG_TDLS_OFF_CHANNEL_CAPABLE; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - - if (wlan_cfgGetInt(pMac, WNI_CFG_TDLS_OFF_CHANNEL_ENABLED, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_TDLS_BUF_STA_ENABLED"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - -#endif - - /* QWLAN_HAL_CFG_ENABLE_ADAPTIVE_RX_DRAIN */ - tlvStruct->type = QWLAN_HAL_CFG_ENABLE_ADAPTIVE_RX_DRAIN_FEATURE ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_ADAPT_RX_DRAIN, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_ENABLE_ADAPT_RX_DRAIN"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_FLEX_CONNECT_POWER_FACTOR */ - tlvStruct->type = QWLAN_HAL_CFG_FLEXCONNECT_POWER_FACTOR; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_FLEX_CONNECT_POWER_FACTOR, configDataValue) - != eSIR_SUCCESS) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_FLEX_CONNECT_POWER_FACTOR"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)(((tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)); - - /* QWLAN_HAL_CFG_ANTENNA_DIVERSITY */ - tlvStruct->type = QWLAN_HAL_CFG_ANTENNA_DIVERSITY; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if (wlan_cfgGetInt(pMac, WNI_CFG_ANTENNA_DIVESITY, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_ANTENNA_DIVESITY"); - goto handle_failure; - } - - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - /* QWLAN_HAL_CFG_GO_LINK_MONITOR_TIMEOUT */ - tlvStruct->type = QWLAN_HAL_CFG_GO_LINK_MONITOR_TIMEOUT ; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - if(wlan_cfgGetInt(pMac, WNI_CFG_GO_LINK_MONITOR_TIMEOUT, - configDataValue ) != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_GO_LINK_MONITOR_TIMEOUT"); - goto handle_failure; - } - tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length) ; - - wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ; -#ifdef WLAN_DEBUG - { - int i; - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "****** Dumping CFG TLV ***** "); - for (i=0; (i+7) < wdiStartParams->usConfigBufferLen; i+=8) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%02x %02x %02x %02x %02x %02x %02x %02x", - tlvStructStart[i], - tlvStructStart[i+1], - tlvStructStart[i+2], - tlvStructStart[i+3], - tlvStructStart[i+4], - tlvStructStart[i+5], - tlvStructStart[i+6], - tlvStructStart[i+7]); - } - /* Dump the bytes in the last line*/ - for (; i < wdiStartParams->usConfigBufferLen; i++) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%02x ",tlvStructStart[i]); - } - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "**************************** "); - } -#endif - return VOS_STATUS_SUCCESS ; -handle_failure: - vos_mem_free(configParam); - return VOS_STATUS_E_FAILURE; -} -/* - * FUNCTION: WDA_wdiCompleteCB - * call the voss call back function - */ -void WDA_stopCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *wdaContext; - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - wdaContext = (tWDA_CbContext *)pWdaParams->pWdaContext; - - if (NULL == wdaContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid wdaContext", __func__ ); - return ; - } - - /* free the config structure */ - if(pWdaParams->wdaWdiApiMsgParam != NULL) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - } - vos_mem_free(pWdaParams); - - if(WDI_STATUS_SUCCESS != status) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDI stop callback returned failure" ); - VOS_ASSERT(0) ; - } - else - { - wdaContext->wdaState = WDA_STOP_STATE; - } - - /* FTM Driver stop procedure should be synced. - * Stop and Close will happen on same context */ - if (eDRIVER_TYPE_MFG == wdaContext->driverMode) - { - if (VOS_STATUS_SUCCESS != vos_event_set(&wdaContext->ftmStopDoneEvent)) - { - VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, - "%s: FTM Stop Event Set Fail", __func__); - VOS_ASSERT(0); - } - } - - /* Indicate VOSS about the start complete */ - vos_WDAComplete_cback(wdaContext->pVosContext); - - return ; -} -/* - * FUNCTION: WDA_stop - * call WDI_stop - */ -VOS_STATUS WDA_stop(v_PVOID_t pVosContext, tANI_U8 reason) -{ - WDI_Status wdiStatus; - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_StopReqParamsType *wdiStopReq; - tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - tWDA_ReqParams *pWdaParams ; - - if (NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid pWDA", __func__ ); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - if (pWDA->wdiFailed == true) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: WDI in failed state", __func__ ); - return VOS_STATUS_E_ALREADY; - } - - /* FTM mode stay START_STATE */ - if( (WDA_READY_STATE != pWDA->wdaState) && - (WDA_INIT_STATE != pWDA->wdaState) && - (WDA_START_STATE != pWDA->wdaState) ) - { - VOS_ASSERT(0); - } - wdiStopReq = (WDI_StopReqParamsType *) - vos_mem_malloc(sizeof(WDI_StopReqParamsType)); - if(NULL == wdiStopReq) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - wdiStopReq->wdiStopReason = reason; - wdiStopReq->wdiReqStatusCB = NULL; - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiStopReq); - return VOS_STATUS_E_NOMEM; - } - - if ( (eDRIVER_TYPE_MFG != pWDA->driverMode) && - (VOS_TRUE == pWDA->wdaTimersCreated)) - { - wdaDestroyTimers(pWDA); - pWDA->wdaTimersCreated = VOS_FALSE; - } - - pWdaParams->wdaWdiApiMsgParam = (v_PVOID_t *)wdiStopReq; - pWdaParams->wdaMsgParam = NULL; - pWdaParams->pWdaContext = pWDA; - - /* call WDI stop */ - wdiStatus = WDI_Stop(wdiStopReq, - (WDI_StopRspCb)WDA_stopCallback, pWdaParams); - - if (IS_WDI_STATUS_FAILURE(wdiStatus) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "error in WDA Stop" ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - status = VOS_STATUS_E_FAILURE; - } - - /* FTM Driver stop procedure should be synced. - * Stop and Close will happen on same context */ - if (eDRIVER_TYPE_MFG == pWDA->driverMode) - { - status = vos_wait_single_event(&pWDA->ftmStopDoneEvent, - WDI_RESPONSE_TIMEOUT); - if (status != VOS_STATUS_SUCCESS) - { - VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, - "%s: FTM Stop Timepoout", __func__); - VOS_ASSERT(0); - vos_event_reset(&pWDA->ftmStopDoneEvent); - } - } - return status; -} -/* - * FUNCTION: WDA_close - * call WDI_close and free the WDA context - */ -VOS_STATUS WDA_close(v_PVOID_t pVosContext) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - VOS_STATUS vstatus; - tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - if (NULL == wdaContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid wdaContext", __func__ ); - return VOS_STATUS_E_FAILURE; - } - if((WDA_INIT_STATE != wdaContext->wdaState) && - (WDA_STOP_STATE != wdaContext->wdaState)) - { - VOS_ASSERT(0); - } - /*call WDI close*/ - wstatus = WDI_Close(); - if ( wstatus != WDI_STATUS_SUCCESS ) - { - status = VOS_STATUS_E_FAILURE; - } - wdaContext->wdaState = WDA_CLOSE_STATE; - /* Destroy the events */ - vstatus = vos_event_destroy(&wdaContext->wdaWdiEvent); - if(!VOS_IS_STATUS_SUCCESS(vstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDI Sync Event destroy failed - status = %d", status); - status = VOS_STATUS_E_FAILURE; - } - - vstatus = vos_event_destroy(&wdaContext->txFrameEvent); - if(!VOS_IS_STATUS_SUCCESS(vstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event destroy failed - status = %d", status); - status = VOS_STATUS_E_FAILURE; - } - vstatus = vos_event_destroy(&wdaContext->suspendDataTxEvent); - if(!VOS_IS_STATUS_SUCCESS(vstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event destroy failed - status = %d", status); - status = VOS_STATUS_E_FAILURE; - } - vstatus = vos_event_destroy(&wdaContext->waitOnWdiIndicationCallBack); - if(!VOS_IS_STATUS_SUCCESS(vstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event destroy failed - status = %d", status); - status = VOS_STATUS_E_FAILURE; - } - /* free WDA context */ - vstatus = vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext); - if ( !VOS_IS_STATUS_SUCCESS(vstatus) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "error in WDA close " ); - status = VOS_STATUS_E_FAILURE; - } - return status; -} -/* - * FUNCTION: WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual - * returns 1 if the compiled version is greater than or equal to the input version - */ - -uint8 WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL); - tSirVersionType compiledVersion; - status = WDA_GetWcnssWlanCompiledVersion(vosContext, &compiledVersion); - if ((compiledVersion.major > major) || ((compiledVersion.major == major)&& (compiledVersion.minor > minor)) || - ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version > version)) || - ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version == version) && - (compiledVersion.revision >= revision))) - return 1; - else - return 0; -} -/* - * FUNCTION: WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual - * returns 1 if the compiled version is greater than or equal to the input version - */ -uint8 WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL); - tSirVersionType reportedVersion; - status = WDA_GetWcnssWlanReportedVersion(vosContext, &reportedVersion); - if ((reportedVersion.major > major) || ((reportedVersion.major == major)&& (reportedVersion.minor > minor)) || - ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version > version)) || - ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version == version) && - (reportedVersion.revision >= revision))) - return 1; - else - return 0; -} -/* - * FUNCTION: WDA_GetWcnssWlanCompiledVersion - * Returns the version of the WCNSS WLAN API with which the HOST - * device driver was compiled - */ -VOS_STATUS WDA_GetWcnssWlanCompiledVersion(v_PVOID_t pvosGCtx, - tSirVersionType *pVersion) -{ - tWDA_CbContext *pWDA; - if ((NULL == pvosGCtx) || (NULL == pVersion)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid parameter", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx); - if (NULL == pWDA ) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid WDA context", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - *pVersion = pWDA->wcnssWlanCompiledVersion; - return VOS_STATUS_SUCCESS; -} -/* - * FUNCTION: WDA_GetWcnssWlanReportedVersion - * Returns the version of the WCNSS WLAN API with which the WCNSS - * device driver was compiled - */ -VOS_STATUS WDA_GetWcnssWlanReportedVersion(v_PVOID_t pvosGCtx, - tSirVersionType *pVersion) -{ - tWDA_CbContext *pWDA; - if ((NULL == pvosGCtx) || (NULL == pVersion)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid parameter", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx); - if (NULL == pWDA ) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid WDA context", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - *pVersion = pWDA->wcnssWlanReportedVersion; - return VOS_STATUS_SUCCESS; -} -/* - * FUNCTION: WDA_GetWcnssSoftwareVersion - * Returns the WCNSS Software version string - */ -VOS_STATUS WDA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx, - tANI_U8 *pVersion, - tANI_U32 versionBufferSize) -{ - tWDA_CbContext *pWDA; - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: Entered", __func__); - if ((NULL == pvosGCtx) || (NULL == pVersion)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid parameter", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx); - if (NULL == pWDA ) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid WDA context", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - wpalMemoryCopy(pVersion, pWDA->wcnssSoftwareVersionString, versionBufferSize); - return VOS_STATUS_SUCCESS; -} -/* - * FUNCTION: WDA_GetWcnssHardwareVersion - * Returns the WCNSS Hardware version string - */ -VOS_STATUS WDA_GetWcnssHardwareVersion(v_PVOID_t pvosGCtx, - tANI_U8 *pVersion, - tANI_U32 versionBufferSize) -{ - tWDA_CbContext *pWDA; - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: Entered", __func__); - if ((NULL == pvosGCtx) || (NULL == pVersion)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid parameter", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx); - if (NULL == pWDA ) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid WDA context", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - wpalMemoryCopy(pVersion, pWDA->wcnssHardwareVersionString, versionBufferSize); - return VOS_STATUS_SUCCESS; -} -/* - * FUNCTION: WDA_WniCfgDnld - * Trigger CFG Download - */ -VOS_STATUS WDA_WniCfgDnld(tWDA_CbContext *pWDA) -{ - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE; - v_VOID_t *pFileImage = NULL; - v_SIZE_t cbFileImageSize = 0; - v_VOID_t *pCfgBinary = NULL; - v_SIZE_t cbCfgBinarySize = 0; - v_BOOL_t bStatus = VOS_FALSE; - - if (NULL == pMac ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid MAC context ", __func__ ); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - /* get the number of bytes in the CFG Binary... */ - vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, NULL, - &cbFileImageSize ); - if ( VOS_STATUS_E_NOMEM != vosStatus ) - { - VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, - "Error obtaining binary size" ); - goto fail; - } - // malloc a buffer to read in the Configuration binary file. - pFileImage = vos_mem_malloc( cbFileImageSize ); - if ( NULL == pFileImage ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to allocate memory for the CFG binary [size= %d bytes]", - cbFileImageSize ); - vosStatus = VOS_STATUS_E_NOMEM; - goto fail; - } - - /* Get the entire CFG file image... */ - vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, pFileImage, - &cbFileImageSize ); - if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Error: Cannot retrieve CFG file image from vOSS. [size= %d bytes]", - cbFileImageSize ); - goto fail; - } - - /* - * Validate the binary image. This function will return a pointer - * and length where the CFG binary is located within the binary image file. - */ - bStatus = sys_validateStaConfig( pFileImage, cbFileImageSize, - &pCfgBinary, &cbCfgBinarySize ); - if ( VOS_FALSE == bStatus ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Error: Cannot find STA CFG in binary image file" ); - vosStatus = VOS_STATUS_E_FAILURE; - goto fail; - } - /* - * TODO: call the config download function - * for now calling the existing cfg download API - */ - processCfgDownloadReq(pMac,cbCfgBinarySize,pCfgBinary); - vosStatus = VOS_STATUS_SUCCESS; - - /* fall through to clean up and return success */ - -fail: - vos_mem_free( pFileImage ); - return vosStatus; -} -/* ----------------------------------------------------------------- - * WDI interface - * ----------------------------------------------------------------- - */ -/* - * FUNCTION: WDA_suspendDataTxCallback - * call back function called from TL after suspend Transmission - */ -VOS_STATUS WDA_SuspendDataTxCallback( v_PVOID_t pvosGCtx, - v_U8_t* ucSTAId, - VOS_STATUS vosStatus) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: Entered " ,__func__); - if (NULL == pWDA ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid WDA context ", __func__ ); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - if(VOS_IS_STATUS_SUCCESS(vosStatus)) - { - pWDA->txStatus = WDA_TL_TX_SUSPEND_SUCCESS; - } - else - { - pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE; - } - /* Trigger the event to bring the WDA TL suspend function to come - * out of wait*/ - vosStatus = vos_event_set(&pWDA->suspendDataTxEvent); - if(!VOS_IS_STATUS_SUCCESS(vosStatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "NEW VOS Event Set failed - status = %d", vosStatus); - } - /* If TL suspended had timedout before this callback was called, resume back - * TL.*/ - if (pWDA->txSuspendTimedOut) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Late TLSuspendCallback, resuming TL back again"); - WDA_ResumeDataTx(pWDA); - pWDA->txSuspendTimedOut = FALSE; - } - return VOS_STATUS_SUCCESS; -} -/* - * FUNCTION: WDA_suspendDataTx - * Update TL to suspend the data Transmission - */ -VOS_STATUS WDA_SuspendDataTx(tWDA_CbContext *pWDA) -{ - VOS_STATUS status = VOS_STATUS_E_FAILURE; - tANI_U8 eventIdx = 0; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: Entered " ,__func__); - pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE; - if (pWDA->txSuspendTimedOut) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "TL suspend timedout previously, CB not called yet"); - return status; - } - /* Reset the event to be not signalled */ - status = vos_event_reset(&pWDA->suspendDataTxEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event reset failed - status = %d",status); - return VOS_STATUS_E_FAILURE; - } - /*Indicate TL to suspend transmission for all Sta Id */ - status = WLANTL_SuspendDataTx(pWDA->pVosContext, NULL, - WDA_SuspendDataTxCallback); - if(status != VOS_STATUS_SUCCESS) - { - return status; - } - /* Wait for the event to be set by the TL, to get the response of - * suspending the TX queues, this event should be set by the Callback - * function called by TL*/ - status = vos_wait_events(&pWDA->suspendDataTxEvent, 1, - WDA_TL_SUSPEND_TIMEOUT, &eventIdx); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Status %d when waiting for Suspend Data TX Event", - __func__, status); - /* Set this flag to true when TL suspend times out, so that when TL - * suspend eventually happens and calls the callback, TL can be resumed - * right away by looking at this flag when true.*/ - pWDA->txSuspendTimedOut = TRUE; - } - else - { - pWDA->txSuspendTimedOut = FALSE; - } - if(WDA_TL_TX_SUSPEND_SUCCESS == pWDA->txStatus) - { - status = VOS_STATUS_SUCCESS; - } - return status; -} -/* - * FUNCTION: WDA_resumeDataTx - * Update TL to resume the data Transmission - */ -VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: Entered " ,__func__); - - status = WLANTL_ResumeDataTx(pWDA->pVosContext, NULL); - return status; -} -/* - * FUNCTION: WDA_InitScanReqCallback - * Trigger Init SCAN callback - */ -void WDA_InitScanReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tInitScanParams *pWDA_ScanParam ; - VOS_STATUS status; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pWDA_ScanParam = (tInitScanParams *)pWdaParams->wdaMsgParam; - if(NULL == pWDA_ScanParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWDA_ScanParam received NULL", __func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; - } - if(WDI_STATUS_SUCCESS != wdiStatus) - { - status = WDA_ResumeDataTx(pWDA) ; - if(VOS_STATUS_SUCCESS != status) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s error in Resume Tx ", __func__ ); - } - } - /* free WDI command buffer */ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - - /* assign status to scan params */ - /* without converting the Status to Failure or Success Just - pass the same status to lim */ - pWDA_ScanParam->status = wdiStatus ; - /* send SCAN RSP message back to PE */ - WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)pWDA_ScanParam, 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessInitScanReq - * Trigger Init SCAN in DAL - */ -VOS_STATUS WDA_ProcessInitScanReq(tWDA_CbContext *pWDA, - tInitScanParams *initScanParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_InitScanReqParamsType *wdiInitScanParam = - (WDI_InitScanReqParamsType *)vos_mem_malloc( - sizeof(WDI_InitScanReqParamsType)) ; - tWDA_ReqParams *pWdaParams; - tANI_U8 i = 0; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiInitScanParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiInitScanParam); - return VOS_STATUS_E_NOMEM; - } - - /* Copy init Scan params to WDI structure */ - wdiInitScanParam->wdiReqInfo.wdiScanMode = initScanParams->scanMode ; - vos_mem_copy(wdiInitScanParam->wdiReqInfo.macBSSID, initScanParams->bssid, - sizeof(tSirMacAddr)) ; - wdiInitScanParam->wdiReqInfo.bNotifyBSS = initScanParams->notifyBss ; - wdiInitScanParam->wdiReqInfo.ucFrameType = initScanParams->frameType ; - wdiInitScanParam->wdiReqInfo.ucFrameLength = initScanParams->frameLength ; - wdiInitScanParam->wdiReqInfo.bUseNOA = initScanParams->useNoA; - wdiInitScanParam->wdiReqInfo.scanDuration = initScanParams->scanDuration; - wdiInitScanParam->wdiReqInfo.wdiScanEntry.activeBSScnt = - initScanParams->scanEntry.activeBSScnt ; - for (i=0; i < initScanParams->scanEntry.activeBSScnt; i++) - { - wdiInitScanParam->wdiReqInfo.wdiScanEntry.bssIdx[i] = - initScanParams->scanEntry.bssIdx[i] ; - } - - /* if Frame length, copy macMgmtHdr or WDI structure */ - if(0 != wdiInitScanParam->wdiReqInfo.ucFrameLength) - { - vos_mem_copy(&wdiInitScanParam->wdiReqInfo.wdiMACMgmtHdr, - &initScanParams->macMgmtHdr, sizeof(tSirMacMgmtHdr)) ; - } - wdiInitScanParam->wdiReqStatusCB = NULL ; - - /* Store Init Req pointer, as this will be used for response */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = initScanParams; - pWdaParams->wdaWdiApiMsgParam = wdiInitScanParam; - /* first try to suspend TX */ - status = WDA_SuspendDataTx(pWDA) ; - if(WDI_STATUS_SUCCESS != status) - { - goto handleWdiFailure; - } - /* call DAL API to pass init scan request to DAL */ - status = WDI_InitScanReq(wdiInitScanParam, - WDA_InitScanReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "error in WDA Init Scan, Resume Tx " ); - status = WDA_ResumeDataTx(pWDA) ; - VOS_ASSERT(0) ; - - goto handleWdiFailure; - } - return CONVERT_WDI2VOS_STATUS(status) ; -handleWdiFailure: - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in WDI Api, free all the memory " ); - /* free WDI command buffer */ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /* send Failure to PE */ - initScanParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)initScanParams, 0) ; - return CONVERT_WDI2VOS_STATUS(status) ; -} - -/* - * FUNCTION: WDA_StartScanReqCallback - * send Start SCAN RSP back to PE - */ -void WDA_StartScanReqCallback(WDI_StartScanRspParamsType *pScanRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tStartScanParams *pWDA_ScanParam; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pWDA_ScanParam = (tStartScanParams *)pWdaParams->wdaMsgParam; - if(NULL == pWDA_ScanParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWDA_ScanParam received NULL", __func__); - VOS_ASSERT(0) ; - vos_mem_free(pWdaParams); - return ; - } - if(NULL == pWdaParams->wdaWdiApiMsgParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: wdaWdiApiMsgParam is NULL", __func__); - VOS_ASSERT(0) ; - vos_mem_free(pWdaParams); - return ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - - /* assign status to scan params */ - pWDA_ScanParam->status = pScanRsp->wdiStatus ; - /* send SCAN RSP message back to PE */ - WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)pWDA_ScanParam, 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessStartScanReq - * Trigger start SCAN in WDI - */ -VOS_STATUS WDA_ProcessStartScanReq(tWDA_CbContext *pWDA, - tStartScanParams *startScanParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_StartScanReqParamsType *wdiStartScanParams = - (WDI_StartScanReqParamsType *)vos_mem_malloc( - sizeof(WDI_StartScanReqParamsType)) ; - tWDA_ReqParams *pWdaParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiStartScanParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiStartScanParams); - return VOS_STATUS_E_NOMEM; - } - /* Copy init Scan params to WDI structure */ - wdiStartScanParams->ucChannel = startScanParams->scanChannel ; - wdiStartScanParams->wdiReqStatusCB = NULL ; - - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = startScanParams; - pWdaParams->wdaWdiApiMsgParam = wdiStartScanParams; - /* call DAL API to pass init scan request to DAL */ - status = WDI_StartScanReq(wdiStartScanParams, - WDA_StartScanReqCallback, pWdaParams) ; - /* failure returned by WDI API */ - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Start Scan WDI API, free all the memory " - "It should be due to previous abort scan." ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - startScanParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)startScanParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_EndScanReqCallback - * END SCAN callback - */ -void WDA_EndScanReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tEndScanParams *endScanParam; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - endScanParam = (tEndScanParams *)pWdaParams->wdaMsgParam; - if(NULL == endScanParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: endScanParam received NULL", __func__); - VOS_ASSERT(0) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; - } - - /* Free WDI command buffer */ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /* assign status to scan params */ - endScanParam->status = status ; - /* send response back to PE */ - WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParam, 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessEndScanReq - * Trigger END SCAN in WDI - */ -VOS_STATUS WDA_ProcessEndScanReq(tWDA_CbContext *pWDA, - tEndScanParams *endScanParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_EndScanReqParamsType *wdiEndScanParams = - (WDI_EndScanReqParamsType *)vos_mem_malloc( - sizeof(WDI_EndScanReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiEndScanParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiEndScanParams); - return VOS_STATUS_E_NOMEM; - } - /* Copy init Scan params to WDI structure */ - wdiEndScanParams->ucChannel = endScanParams->scanChannel ; - wdiEndScanParams->wdiReqStatusCB = NULL ; - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = endScanParams; - pWdaParams->wdaWdiApiMsgParam = wdiEndScanParams; - /* call DAL API to pass init scan request to DAL */ - status = WDI_EndScanReq(wdiEndScanParams, - WDA_EndScanReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in End Scan WDI API, free all the memory " - "It should be due to previous abort scan." ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - endScanParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_FinishScanReqCallback - * Trigger Finish SCAN callback - */ -void WDA_FinishScanReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tFinishScanParams *finishScanParam; - VOS_STATUS status; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - finishScanParam = (tFinishScanParams *)pWdaParams->wdaMsgParam; - if(NULL == finishScanParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: finishScanParam is NULL", __func__); - VOS_ASSERT(0) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /* - * Now Resume TX, if we reached here means, TX is already suspended, we - * have to resume it unconditionaly - */ - status = WDA_ResumeDataTx(pWDA) ; - - if(VOS_STATUS_SUCCESS != status) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s error in Resume Tx ", __func__ ); - } - finishScanParam->status = wdiStatus ; - WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParam, 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessFinshScanReq - * Trigger Finish SCAN in WDI - */ -VOS_STATUS WDA_ProcessFinishScanReq(tWDA_CbContext *pWDA, - tFinishScanParams *finishScanParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_FinishScanReqParamsType *wdiFinishScanParams = - (WDI_FinishScanReqParamsType *)vos_mem_malloc( - sizeof(WDI_FinishScanReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - tANI_U8 i = 0; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiFinishScanParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiFinishScanParams); - return VOS_STATUS_E_NOMEM; - } - /* Copy init Scan params to WDI structure */ - wdiFinishScanParams->wdiReqInfo.wdiScanMode = finishScanParams->scanMode ; - vos_mem_copy(wdiFinishScanParams->wdiReqInfo.macBSSID, - finishScanParams->bssid, sizeof(tSirMacAddr)) ; - wdiFinishScanParams->wdiReqInfo.bNotifyBSS = finishScanParams->notifyBss ; - wdiFinishScanParams->wdiReqInfo.ucFrameType = finishScanParams->frameType ; - wdiFinishScanParams->wdiReqInfo.ucFrameLength = - finishScanParams->frameLength ; - wdiFinishScanParams->wdiReqInfo.ucCurrentOperatingChannel = - finishScanParams->currentOperChannel ; - wdiFinishScanParams->wdiReqInfo.wdiCBState = finishScanParams->cbState ; - wdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt = - finishScanParams->scanEntry.activeBSScnt ; - for (i = 0; i < finishScanParams->scanEntry.activeBSScnt; i++) - { - wdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] = - finishScanParams->scanEntry.bssIdx[i] ; - } - - - /* if Frame length, copy macMgmtHdr ro WDI structure */ - if(0 != wdiFinishScanParams->wdiReqInfo.ucFrameLength) - { - vos_mem_copy(&wdiFinishScanParams->wdiReqInfo.wdiMACMgmtHdr, - &finishScanParams->macMgmtHdr, - sizeof(WDI_MacMgmtHdr)) ; - } - wdiFinishScanParams->wdiReqStatusCB = NULL ; - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = finishScanParams; - pWdaParams->wdaWdiApiMsgParam = wdiFinishScanParams; - /* call DAL API to pass init scan request to DAL */ - status = WDI_FinishScanReq(wdiFinishScanParams, - WDA_FinishScanReqCallback, pWdaParams) ; - - - /* - * WDI API returns failure.. - */ - if(IS_WDI_STATUS_FAILURE( status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Finish Scan WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - finishScanParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/*--------------------------------------------------------------------- - * ASSOC API's - *--------------------------------------------------------------------- - */ -/* - * FUNCTION: WDA_JoinReqCallback - * Trigger Init SCAN callback - */ -void WDA_JoinReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSwitchChannelParams *joinReqParam; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - joinReqParam = (tSwitchChannelParams *)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams) ; - /* reset macBSSID */ - vos_mem_set(pWDA->macBSSID, sizeof(pWDA->macBSSID),0 ); - /* reset macSTASelf */ - vos_mem_set(pWDA->macSTASelf, sizeof(pWDA->macSTASelf),0 ); - joinReqParam->status = status ; - WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam , 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessJoinReq - * Trigger Join REQ in WDI - */ -VOS_STATUS WDA_ProcessJoinReq(tWDA_CbContext *pWDA, - tSwitchChannelParams* joinReqParam) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_JoinReqParamsType *wdiJoinReqParam = - (WDI_JoinReqParamsType *)vos_mem_malloc( - sizeof(WDI_JoinReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiJoinReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(joinReqParam); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiJoinReqParam); - vos_mem_free(joinReqParam); - return VOS_STATUS_E_NOMEM; - } - - /*if the BSSID or self STA in pWDA is NULL, join request can't be processed*/ - if(WDA_IS_NULL_MAC_ADDRESS(pWDA->macBSSID) || - WDA_IS_NULL_MAC_ADDRESS(pWDA->macSTASelf)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: received join request when BSSID or self-STA is NULL " - " BSSID:" WDA_MAC_ADDRESS_STR "Self-STA:" WDA_MAC_ADDRESS_STR, - __func__, WDA_MAC_ADDR_ARRAY(pWDA->macBSSID), - WDA_MAC_ADDR_ARRAY(pWDA->macSTASelf)); - VOS_ASSERT(0); - vos_mem_free(wdiJoinReqParam); - vos_mem_free(pWdaParams); - joinReqParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ; - return VOS_STATUS_E_INVAL; - } - - /* copy the BSSID for pWDA */ - vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macBSSID, pWDA->macBSSID, - sizeof(tSirMacAddr)) ; - vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macSTASelf, - pWDA->macSTASelf, sizeof(tSirMacAddr)) ; - wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucChannel = - joinReqParam->channelNumber ; -#ifdef WLAN_FEATURE_VOWIFI - wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.cMaxTxPower = - joinReqParam->maxTxPower ; -#else - wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucLocalPowerConstraint = - joinReqParam->localPowerConstraint ; -#endif - wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.wdiSecondaryChannelOffset = - joinReqParam->secondaryChannelOffset ; - wdiJoinReqParam->wdiReqInfo.linkState = pWDA->linkState; - - wdiJoinReqParam->wdiReqStatusCB = NULL ; - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = joinReqParam; - pWdaParams->wdaWdiApiMsgParam = wdiJoinReqParam; - status = WDI_JoinReq(wdiJoinReqParam, - (WDI_JoinRspCb )WDA_JoinReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Join WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - joinReqParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_SwitchChannelReqCallback - * send Switch channel RSP back to PE - */ -void WDA_SwitchChannelReqCallback( - WDI_SwitchCHRspParamsType *wdiSwitchChanRsp, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - tWDA_CbContext *pWDA; - tSwitchChannelParams *pSwitchChanParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pSwitchChanParams = (tSwitchChannelParams *)pWdaParams->wdaMsgParam; - -#ifdef WLAN_FEATURE_VOWIFI - pSwitchChanParams->txMgmtPower = wdiSwitchChanRsp->ucTxMgmtPower; -#endif - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - pSwitchChanParams->status = - wdiSwitchChanRsp->wdiStatus ; - WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessChannelSwitchReq - * Request to WDI to switch channel REQ params. - */ -VOS_STATUS WDA_ProcessChannelSwitchReq(tWDA_CbContext *pWDA, - tSwitchChannelParams *pSwitchChanParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SwitchChReqParamsType *wdiSwitchChanParam = - (WDI_SwitchChReqParamsType *)vos_mem_malloc( - sizeof(WDI_SwitchChReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiSwitchChanParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiSwitchChanParam); - return VOS_STATUS_E_NOMEM; - } - wdiSwitchChanParam->wdiChInfo.ucChannel = pSwitchChanParams->channelNumber; -#ifndef WLAN_FEATURE_VOWIFI - wdiSwitchChanParam->wdiChInfo.ucLocalPowerConstraint = - pSwitchChanParams->localPowerConstraint; -#endif - wdiSwitchChanParam->wdiChInfo.wdiSecondaryChannelOffset = - pSwitchChanParams->secondaryChannelOffset; - wdiSwitchChanParam->wdiReqStatusCB = NULL ; - /* Store req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pSwitchChanParams; - pWdaParams->wdaWdiApiMsgParam = wdiSwitchChanParam; -#ifdef WLAN_FEATURE_VOWIFI - wdiSwitchChanParam->wdiChInfo.cMaxTxPower - = pSwitchChanParams->maxTxPower; - vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macSelfStaMacAddr, - pSwitchChanParams ->selfStaMacAddr, - sizeof(tSirMacAddr)); -#endif - vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macBSSId, - pSwitchChanParams->bssId, - sizeof(tSirMacAddr)); - - status = WDI_SwitchChReq(wdiSwitchChanParam, - (WDI_SwitchChRspCb)WDA_SwitchChannelReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in process channel switch Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - pSwitchChanParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_ConfigBssReqCallback - * config BSS Req Callback, called by WDI - */ -void WDA_ConfigBssReqCallback(WDI_ConfigBSSRspParamsType *wdiConfigBssRsp - ,void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tAddBssParams *configBssReqParam; - tAddStaParams *staConfigBssParam; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - configBssReqParam = (tAddBssParams *)pWdaParams->wdaMsgParam; - staConfigBssParam = &configBssReqParam->staContext ; - configBssReqParam->status = - wdiConfigBssRsp->wdiStatus; - if(WDI_STATUS_SUCCESS == wdiConfigBssRsp->wdiStatus) - { - vos_mem_copy(configBssReqParam->bssId, wdiConfigBssRsp->macBSSID, - sizeof(tSirMacAddr)); - configBssReqParam->bssIdx = wdiConfigBssRsp->ucBSSIdx; - configBssReqParam->bcastDpuSignature = wdiConfigBssRsp->ucBcastSig; - configBssReqParam->mgmtDpuSignature = wdiConfigBssRsp->ucUcastSig; - - if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_STA) - { - if(configBssReqParam->bssType == eSIR_IBSS_MODE) - { - pWDA->wdaGlobalSystemRole = eSYSTEM_STA_IN_IBSS_ROLE; - staConfigBssParam->staType = STA_ENTRY_BSSID; - } - else if ((configBssReqParam->bssType == eSIR_BTAMP_STA_MODE) && - (staConfigBssParam->staType == STA_ENTRY_SELF)) - { - /* This is the 1st add BSS Req for the BTAMP STA */ - pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE; - staConfigBssParam->staType = STA_ENTRY_BSSID; - } - else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) && - (staConfigBssParam->staType == STA_ENTRY_PEER)) - { - /* This is the 2nd ADD BSS Request that is sent - * on the BTAMP STA side. The Sta type is - * set to STA_ENTRY_PEER here.*/ - pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE; - } - else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) && - (staConfigBssParam->staType == STA_ENTRY_SELF)) - { - /* statype is already set by PE. - * Only 1 ADD BSS Req is sent on the BTAMP AP side.*/ - pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_AP_ROLE; - staConfigBssParam->staType = STA_ENTRY_BSSID; - } - else - { - pWDA->wdaGlobalSystemRole = eSYSTEM_STA_ROLE; - staConfigBssParam->staType = STA_ENTRY_PEER; - } - } - else if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_AP) - { - pWDA->wdaGlobalSystemRole = eSYSTEM_AP_ROLE; - staConfigBssParam->staType = STA_ENTRY_SELF; - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Invalid operation mode specified"); - VOS_ASSERT(0); - } - - staConfigBssParam->staIdx = wdiConfigBssRsp->ucSTAIdx; - staConfigBssParam->bssIdx = wdiConfigBssRsp->ucBSSIdx; - staConfigBssParam->ucUcastSig = wdiConfigBssRsp->ucUcastSig; - staConfigBssParam->ucBcastSig = wdiConfigBssRsp->ucBcastSig; - vos_mem_copy(staConfigBssParam->staMac, wdiConfigBssRsp->macSTA, - sizeof(tSirMacAddr)); - staConfigBssParam->txChannelWidthSet = - configBssReqParam->txChannelWidthSet; - if(staConfigBssParam->staType == STA_ENTRY_PEER && - staConfigBssParam->htCapable) - { - pWDA->wdaStaInfo[staConfigBssParam->staIdx].bssIdx = - wdiConfigBssRsp->ucBSSIdx; - pWDA->wdaStaInfo[staConfigBssParam->staIdx].ucValidStaIndex = - WDA_VALID_STA_INDEX ; - } - if(WDI_DS_SetStaIdxPerBssIdx(pWDA->pWdiContext, - wdiConfigBssRsp->ucBSSIdx, - wdiConfigBssRsp->ucSTAIdx)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: fail to set STA idx associated with BSS index", __func__); - VOS_ASSERT(0) ; - } - if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigBssRsp->ucSTAIdx)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: add BSS into mempool fail", __func__); - VOS_ASSERT(0) ; - } -#ifdef WLAN_FEATURE_VOWIFI - configBssReqParam->txMgmtPower = wdiConfigBssRsp->ucTxMgmtPower; -#endif - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam , 0) ; - return ; -} -/* - * FUNCTION: WDA_UpdateEdcaParamsForAC - * Update WDI EDCA params with PE edca params - */ -void WDA_UpdateEdcaParamsForAC(tWDA_CbContext *pWDA, - WDI_EdcaParamRecord *wdiEdcaParam, - tSirMacEdcaParamRecord *macEdcaParam) -{ - wdiEdcaParam->wdiACI.aifsn = macEdcaParam->aci.aifsn; - wdiEdcaParam->wdiACI.acm= macEdcaParam->aci.acm; - wdiEdcaParam->wdiACI.aci = macEdcaParam->aci.aci; - wdiEdcaParam->wdiCW.min = macEdcaParam->cw.min; - wdiEdcaParam->wdiCW.max = macEdcaParam->cw.max; - wdiEdcaParam->usTXOPLimit = macEdcaParam->txoplimit; -} -/* - * FUNCTION: WDA_ProcessConfigBssReq - * Configure BSS before starting Assoc with AP - */ -VOS_STATUS WDA_ProcessConfigBssReq(tWDA_CbContext *pWDA, - tAddBssParams* configBssReqParam) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_ConfigBSSReqParamsType *wdiConfigBssReqParam; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if (NULL == configBssReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: configBssReqParam is NULL", __func__); - return VOS_STATUS_E_INVAL; - } - - wdiConfigBssReqParam = (WDI_ConfigBSSReqParamsType *)vos_mem_malloc( - sizeof(WDI_ConfigBSSReqParamsType)) ; - - if(NULL == wdiConfigBssReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiConfigBssReqParam); - return VOS_STATUS_E_NOMEM; - } - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: maxTxPower %d", __func__, configBssReqParam->maxTxPower); - vos_mem_set(wdiConfigBssReqParam, sizeof(WDI_ConfigBSSReqParamsType), 0); - WDA_UpdateBSSParams(pWDA, &wdiConfigBssReqParam->wdiReqInfo, - configBssReqParam) ; - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = configBssReqParam; - pWdaParams->wdaWdiApiMsgParam = wdiConfigBssReqParam; - status = WDI_ConfigBSSReq(wdiConfigBssReqParam, - (WDI_ConfigBSSRspCb )WDA_ConfigBssReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Config BSS WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - configBssReqParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#ifdef ENABLE_HAL_COMBINED_MESSAGES -/* - * FUNCTION: WDA_PostAssocReqCallback - * Post ASSOC req callback, send RSP back to PE - */ -void WDA_PostAssocReqCallback(WDI_PostAssocRspParamsType *wdiPostAssocRsp, - void* pUserData) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; - tPostAssocParams *postAssocReqParam = - (tPostAssocParams *)pWDA->wdaMsgParam ; - /*STA context within the BSS Params*/ - tAddStaParams *staPostAssocParam = - &postAssocReqParam->addBssParams.staContext ; - /*STA Params for self STA*/ - tAddStaParams *selfStaPostAssocParam = - &postAssocReqParam->addStaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - postAssocReqParam->status = - wdiPostAssocRsp->wdiStatus ; - if(WDI_STATUS_SUCCESS == wdiPostAssocRsp->wdiStatus) - { - staPostAssocParam->staIdx = wdiPostAssocRsp->bssParams.ucSTAIdx ; - vos_mem_copy(staPostAssocParam->staMac, wdiPostAssocRsp->bssParams.macSTA, - sizeof(tSirMacAddr)) ; - staPostAssocParam->ucUcastSig = wdiPostAssocRsp->bssParams.ucUcastSig ; - staPostAssocParam->ucBcastSig = wdiPostAssocRsp->bssParams.ucBcastSig ; - staPostAssocParam->bssIdx = wdiPostAssocRsp->bssParams.ucBSSIdx; - selfStaPostAssocParam->staIdx = wdiPostAssocRsp->staParams.ucSTAIdx; - } - vos_mem_free(pWDA->wdaWdiApiMsgParam) ; - pWDA->wdaWdiApiMsgParam = NULL; - pWDA->wdaMsgParam = NULL; - WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessPostAssocReq - * Trigger POST ASSOC processing in WDI - */ -VOS_STATUS WDA_ProcessPostAssocReq(tWDA_CbContext *pWDA, - tPostAssocParams *postAssocReqParam) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - - WDI_PostAssocReqParamsType *wdiPostAssocReqParam = - (WDI_PostAssocReqParamsType *)vos_mem_malloc( - sizeof(WDI_PostAssocReqParamsType)) ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - - if(NULL == wdiPostAssocReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - - /* update BSS params into WDI structure */ - WDA_UpdateBSSParams(pWDA, &wdiPostAssocReqParam->wdiBSSParams, - &postAssocReqParam->addBssParams) ; - /* update STA params into WDI structure */ - WDA_UpdateSTAParams(pWDA, &wdiPostAssocReqParam->wdiSTAParams, - &postAssocReqParam->addStaParams) ; - - wdiPostAssocReqParam->wdiBSSParams.ucEDCAParamsValid = - postAssocReqParam->addBssParams.highPerformance; - WDA_UpdateEdcaParamsForAC(pWDA, - &wdiPostAssocReqParam->wdiBSSParams.wdiBEEDCAParams, - &postAssocReqParam->addBssParams.acbe); - WDA_UpdateEdcaParamsForAC(pWDA, - &wdiPostAssocReqParam->wdiBSSParams.wdiBKEDCAParams, - &postAssocReqParam->addBssParams.acbk); - WDA_UpdateEdcaParamsForAC(pWDA, - &wdiPostAssocReqParam->wdiBSSParams.wdiVIEDCAParams, - &postAssocReqParam->addBssParams.acvi); - WDA_UpdateEdcaParamsForAC(pWDA, - &wdiPostAssocReqParam->wdiBSSParams.wdiVOEDCAParams, - &postAssocReqParam->addBssParams.acvo); - /* Store Init Req pointer, as this will be used for response */ - pWDA->wdaMsgParam = (void *)postAssocReqParam ; - /* store Params pass it to WDI */ - pWDA->wdaWdiApiMsgParam = (void *)wdiPostAssocReqParam ; - status = WDI_PostAssocReq(wdiPostAssocReqParam, - (WDI_PostAssocRspCb )WDA_PostAssocReqCallback, pWDA) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Post Assoc WDI API, free all the memory " ); - vos_mem_free(pWDA->wdaWdiApiMsgParam) ; - pWDA->wdaWdiApiMsgParam = NULL; - pWDA->wdaMsgParam = NULL; - postAssocReqParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif -/* - * FUNCTION: WDA_AddStaReqCallback - * ADD STA req callback, send RSP back to PE - */ -void WDA_AddStaReqCallback(WDI_ConfigSTARspParamsType *wdiConfigStaRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tAddStaParams *addStaReqParam; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,"%s: pWdaParams is NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - addStaReqParam = (tAddStaParams *)pWdaParams->wdaMsgParam; - addStaReqParam->status = - wdiConfigStaRsp->wdiStatus ; - if(WDI_STATUS_SUCCESS == wdiConfigStaRsp->wdiStatus) - { - addStaReqParam->staIdx = wdiConfigStaRsp->ucSTAIdx; - /*TODO: UMAC structure doesn't have these fields*/ - /*addStaReqParam-> = wdiConfigStaRsp->ucDpuIndex; - addStaReqParam-> = wdiConfigStaRsp->ucBcastDpuIndex; - addStaReqParam-> = wdiConfigStaRsp->ucBcastMgmtDpuIdx; */ - addStaReqParam->ucUcastSig = wdiConfigStaRsp->ucUcastSig; - addStaReqParam->ucBcastSig = wdiConfigStaRsp->ucBcastSig; - /* update staIndex as valid index for BA if STA is HT capable*/ -#ifdef FEATURE_WLAN_TDLS - if( (addStaReqParam->staType == STA_ENTRY_PEER || - addStaReqParam->staType == STA_ENTRY_TDLS_PEER) && addStaReqParam->htCapable) -#else - if(addStaReqParam->staType == STA_ENTRY_PEER && addStaReqParam->htCapable) -#endif - { - pWDA->wdaStaInfo[addStaReqParam->staIdx].bssIdx = - wdiConfigStaRsp->ucBssIdx; - pWDA->wdaStaInfo[addStaReqParam->staIdx].ucValidStaIndex = - WDA_VALID_STA_INDEX ; - } - if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigStaRsp->ucSTAIdx)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: add STA into mempool fail", __func__); - VOS_ASSERT(0) ; - return ; - } - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams) ; - WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ; - return ; -} -/* - * FUNCTION: WDA_ConfigStaReq - * Trigger Config STA processing in WDI - */ -VOS_STATUS WDA_ProcessAddStaReq(tWDA_CbContext *pWDA, - tAddStaParams *addStaReqParam) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_ConfigSTAReqParamsType *wdiConfigStaReqParam = - (WDI_ConfigSTAReqParamsType *)vos_mem_malloc( - sizeof(WDI_ConfigSTAReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiConfigStaReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiConfigStaReqParam); - return VOS_STATUS_E_NOMEM; - } - vos_mem_set(wdiConfigStaReqParam, sizeof(WDI_ConfigSTAReqParamsType), 0); - /* update STA params into WDI structure */ - WDA_UpdateSTAParams(pWDA, &wdiConfigStaReqParam->wdiReqInfo, - addStaReqParam) ; - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = addStaReqParam; - pWdaParams->wdaWdiApiMsgParam = wdiConfigStaReqParam; - status = WDI_ConfigSTAReq(wdiConfigStaReqParam, - (WDI_ConfigSTARspCb )WDA_AddStaReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Config STA WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - addStaReqParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_DelBSSReqCallback - * Dens DEL BSS RSP back to PE - */ -void WDA_DelBSSReqCallback(WDI_DelBSSRspParamsType *wdiDelBssRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tDeleteBssParams *delBssReqParam; - tANI_U8 staIdx,tid; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - delBssReqParam = (tDeleteBssParams *)pWdaParams->wdaMsgParam; - delBssReqParam->status = wdiDelBssRsp->wdiStatus ; - if(WDI_STATUS_SUCCESS == wdiDelBssRsp->wdiStatus) - { - vos_mem_copy(delBssReqParam->bssid, wdiDelBssRsp->macBSSID, - sizeof(tSirMacAddr)) ; - } - if(WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, &staIdx)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Get STA index from BSS index Fail", __func__); - VOS_ASSERT(0) ; - } - if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, staIdx)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: DEL STA from MemPool Fail", __func__); - VOS_ASSERT(0) ; - } - if(WDI_DS_ClearStaIdxPerBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, staIdx)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Clear STA index form table Fail", __func__); - VOS_ASSERT(0) ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /* reset the the system role*/ - pWDA->wdaGlobalSystemRole = eSYSTEM_UNKNOWN_ROLE; - - /* Reset the BA related information */ - for(staIdx=0; staIdx < WDA_MAX_STA; staIdx++) - { - if( pWDA->wdaStaInfo[staIdx].bssIdx == wdiDelBssRsp->ucBssIdx ) - { - pWDA->wdaStaInfo[staIdx].ucValidStaIndex = WDA_INVALID_STA_INDEX; - pWDA->wdaStaInfo[staIdx].ucUseBaBitmap = 0; - /* Reset framesTxed counters here */ - for(tid = 0; tid < STACFG_MAX_TC; tid++) - { - pWDA->wdaStaInfo[staIdx].framesTxed[tid] = 0; - } - } - } - WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssReqParam , 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessDelBssReq - * Init DEL BSS req with WDI - */ -VOS_STATUS WDA_ProcessDelBssReq(tWDA_CbContext *pWDA, - tDeleteBssParams *delBssParam) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_DelBSSReqParamsType *wdiDelBssReqParam = - (WDI_DelBSSReqParamsType *)vos_mem_malloc( - sizeof(WDI_DelBSSReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiDelBssReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiDelBssReqParam); - return VOS_STATUS_E_NOMEM; - } - wdiDelBssReqParam->ucBssIdx = delBssParam->bssIdx; - wdiDelBssReqParam->wdiReqStatusCB = NULL ; - - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = delBssParam; - pWdaParams->wdaWdiApiMsgParam = wdiDelBssReqParam; - status = WDI_DelBSSReq(wdiDelBssReqParam, - (WDI_DelBSSRspCb )WDA_DelBSSReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Del BSS WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - delBssParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssParam, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_DelSTAReqCallback - * Dens DEL STA RSP back to PE - */ -void WDA_DelSTAReqCallback(WDI_DelSTARspParamsType *wdiDelStaRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tDeleteStaParams *delStaReqParam; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - delStaReqParam = (tDeleteStaParams *)pWdaParams->wdaMsgParam; - delStaReqParam->status = wdiDelStaRsp->wdiStatus ; - if(WDI_STATUS_SUCCESS == wdiDelStaRsp->wdiStatus) - { - if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, wdiDelStaRsp->ucSTAIdx)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: DEL STA from MemPool Fail", __func__); - VOS_ASSERT(0) ; - } - delStaReqParam->staIdx = wdiDelStaRsp->ucSTAIdx ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /*Reset the BA information corresponding to this STAIdx */ - pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucValidStaIndex = - WDA_INVALID_STA_INDEX; - pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucUseBaBitmap = 0; - - WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaReqParam , 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessDelStaReq - * Init DEL STA req with WDI - */ -VOS_STATUS WDA_ProcessDelStaReq(tWDA_CbContext *pWDA, - tDeleteStaParams *delStaParam) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_DelSTAReqParamsType *wdiDelStaReqParam = - (WDI_DelSTAReqParamsType *)vos_mem_malloc( - sizeof(WDI_DelSTAReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiDelStaReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiDelStaReqParam); - return VOS_STATUS_E_NOMEM; - } - wdiDelStaReqParam->ucSTAIdx = delStaParam->staIdx ; - wdiDelStaReqParam->wdiReqStatusCB = NULL ; - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = delStaParam; - pWdaParams->wdaWdiApiMsgParam = wdiDelStaReqParam; - status = WDI_DelSTAReq(wdiDelStaReqParam, - (WDI_DelSTARspCb )WDA_DelSTAReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Del STA WDI API, free all the memory status = %d", - status ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - delStaParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaParam, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -void WDA_ProcessAddStaSelfRsp(WDI_AddSTASelfRspParamsType* pwdiAddSTASelfRsp, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tAddStaSelfParams *pAddStaSelfRsp = NULL; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pAddStaSelfRsp = (tAddStaSelfParams*)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - pAddStaSelfRsp->status = CONVERT_WDI2SIR_STATUS(pwdiAddSTASelfRsp->wdiStatus); - vos_mem_copy(pAddStaSelfRsp->selfMacAddr, - pwdiAddSTASelfRsp->macSelfSta, - sizeof(pAddStaSelfRsp->selfMacAddr)); - WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfRsp, 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessAddStaSelfReq - * - */ -VOS_STATUS WDA_ProcessAddStaSelfReq( tWDA_CbContext *pWDA, tpAddStaSelfParams pAddStaSelfReq) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_AddSTASelfReqParamsType *wdiAddStaSelfReq = - (WDI_AddSTASelfReqParamsType *)vos_mem_malloc( - sizeof(WDI_AddSTASelfReqParamsType)) ; - tWDA_ReqParams *pWdaParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if( NULL == wdiAddStaSelfReq ) - { - VOS_ASSERT( 0 ); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Unable to allocate memory " ,__func__); - return( VOS_STATUS_E_NOMEM ); - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if( NULL == pWdaParams ) - { - VOS_ASSERT( 0 ); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Unable to allocate memory " ,__func__); - vos_mem_free(wdiAddStaSelfReq) ; - return( VOS_STATUS_E_NOMEM ); - } - wdiAddStaSelfReq->wdiReqStatusCB = NULL; - vos_mem_copy( wdiAddStaSelfReq->wdiAddSTASelfInfo.selfMacAddr, pAddStaSelfReq->selfMacAddr, 6); - wdiAddStaSelfReq->wdiAddSTASelfInfo.currDeviceMode = pAddStaSelfReq->currDeviceMode; - /* Store Init Req pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pAddStaSelfReq; - pWdaParams->wdaWdiApiMsgParam = wdiAddStaSelfReq; - wstatus = WDI_AddSTASelfReq( wdiAddStaSelfReq, WDA_ProcessAddStaSelfRsp, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Add Self Sta Request API, free all the memory status = %d", - wstatus ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - pAddStaSelfReq->status = eSIR_FAILURE ; - WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfReq, 0) ; - } - return status; -} -/* - * FUNCTION: WDA_DelSTASelfRespCallback - * - */ -void WDA_DelSTASelfRespCallback(WDI_DelSTASelfRspParamsType * - wdiDelStaSelfRspParams , void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tDelStaSelfParams *delStaSelfParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid pWdaParams pointer", __func__); - VOS_ASSERT(0); - return; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam; - delStaSelfParams->status = - wdiDelStaSelfRspParams->wdiStatus ; - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_DelSTASelfReqCallback - * - */ -void WDA_DelSTASelfReqCallback(WDI_Status wdiStatus, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tDelStaSelfParams *delStaSelfParams; - - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d pWdaParams: %p", - __func__, wdiStatus, pWdaParams); - - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid pWdaParams pointer", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam; - - delStaSelfParams->status = wdiStatus ; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ; - } - - return ; -} - -/* - * FUNCTION: WDA_DelSTASelfReq - * Trigger Config STA processing in WDI - */ -VOS_STATUS WDA_ProcessDelSTASelfReq(tWDA_CbContext *pWDA, - tDelStaSelfParams* pDelStaSelfReqParam) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - tWDA_ReqParams *pWdaParams = NULL; - WDI_DelSTASelfReqParamsType *wdiDelStaSelfReq = - (WDI_DelSTASelfReqParamsType *)vos_mem_malloc( - sizeof(WDI_DelSTASelfReqParamsType)) ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if( NULL == wdiDelStaSelfReq ) - { - VOS_ASSERT( 0 ); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Unable to allocate memory " ,__func__); - return( VOS_STATUS_E_NOMEM ); - } - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if( NULL == pWdaParams ) - { - VOS_ASSERT( 0 ); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Unable to allocate memory " ,__func__); - vos_mem_free(wdiDelStaSelfReq) ; - return( VOS_STATUS_E_NOMEM ); - } - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pDelStaSelfReqParam; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelStaSelfReq; - vos_mem_copy( wdiDelStaSelfReq->wdiDelStaSelfInfo.selfMacAddr, - pDelStaSelfReqParam->selfMacAddr, sizeof(tSirMacAddr)); - - wdiDelStaSelfReq->wdiReqStatusCB = WDA_DelSTASelfReqCallback; - wdiDelStaSelfReq->pUserData = pWdaParams; - - wstatus = WDI_DelSTASelfReq(wdiDelStaSelfReq, - (WDI_DelSTASelfRspCb)WDA_DelSTASelfRespCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "Failure in Del Sta Self REQ WDI API, free all the memory " ); - VOS_ASSERT(0); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - pDelStaSelfReqParam->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)pDelStaSelfReqParam, 0) ; - } - return status; -} - -/* - * FUNCTION: WDA_SendMsg - * Send Message back to PE - */ -void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType, - void *pBodyptr, tANI_U32 bodyVal) -{ - tSirMsgQ msg = {0} ; - tANI_U32 status = VOS_STATUS_SUCCESS ; - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - msg.type = msgType; - msg.bodyval = bodyVal; - msg.bodyptr = pBodyptr; - status = limPostMsgApi(pMac, &msg); - if (VOS_STATUS_SUCCESS != status) - { - if(NULL != pBodyptr) - { - vos_mem_free(pBodyptr); - } - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: limPostMsgApi is failed " ,__func__); - VOS_ASSERT(0) ; - } - return ; -} -/* - * FUNCTION: WDA_UpdateBSSParams - * Translated WDA/PE BSS info into WDI BSS info.. - */ -void WDA_UpdateBSSParams(tWDA_CbContext *pWDA, - WDI_ConfigBSSReqInfoType *wdiBssParams, - tAddBssParams *wdaBssParams) -{ - v_U8_t keyIndex = 0; - /* copy bssReq Params to WDI structure */ - vos_mem_copy(wdiBssParams->macBSSID, - wdaBssParams->bssId, sizeof(tSirMacAddr)) ; - vos_mem_copy(wdiBssParams->macSelfAddr, wdaBssParams->selfMacAddr, - sizeof(tSirMacAddr)) ; - wdiBssParams->wdiBSSType = wdaBssParams->bssType ; - wdiBssParams->ucOperMode = wdaBssParams->operMode ; - wdiBssParams->wdiNWType = wdaBssParams->nwType ; - wdiBssParams->ucShortSlotTimeSupported = - wdaBssParams->shortSlotTimeSupported ; - wdiBssParams->ucllaCoexist = wdaBssParams->llaCoexist ; - wdiBssParams->ucllbCoexist = wdaBssParams->llbCoexist ; - wdiBssParams->ucllgCoexist = wdaBssParams->llgCoexist ; - wdiBssParams->ucHT20Coexist = wdaBssParams->ht20Coexist ; - wdiBssParams->ucObssProtEnabled = wdaBssParams->obssProtEnabled ; - - wdiBssParams->ucllnNonGFCoexist = wdaBssParams->llnNonGFCoexist ; - wdiBssParams->ucTXOPProtectionFullSupport = - wdaBssParams->fLsigTXOPProtectionFullSupport ; - wdiBssParams->ucRIFSMode = wdaBssParams->fRIFSMode ; - wdiBssParams->usBeaconInterval = wdaBssParams->beaconInterval ; - wdiBssParams->ucDTIMPeriod = wdaBssParams->dtimPeriod ; - wdiBssParams->ucTXChannelWidthSet = wdaBssParams->txChannelWidthSet ; - wdiBssParams->ucCurrentOperChannel = wdaBssParams->currentOperChannel ; - wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ; - wdiBssParams->bHiddenSSIDEn = wdaBssParams->bHiddenSSIDEn ; - - wdiBssParams->ucRMFEnabled = wdaBssParams->rmfEnabled; - - /* copy SSID into WDI structure */ - wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ; - vos_mem_copy(wdiBssParams->wdiSSID.sSSID, - wdaBssParams->ssId.ssId, wdaBssParams->ssId.length) ; - WDA_UpdateSTAParams(pWDA, &wdiBssParams->wdiSTAContext, - &wdaBssParams->staContext) ; - wdiBssParams->wdiAction = wdaBssParams->updateBss; -#ifdef WLAN_FEATURE_VOWIFI - wdiBssParams->cMaxTxPower = wdaBssParams->maxTxPower; -#endif - wdiBssParams->ucPersona = wdaBssParams->halPersona; - wdiBssParams->bSpectrumMgtEn = wdaBssParams->bSpectrumMgtEnabled; -#ifdef WLAN_FEATURE_VOWIFI_11R - wdiBssParams->bExtSetStaKeyParamValid = wdaBssParams->extSetStaKeyParamValid; - if(wdiBssParams->bExtSetStaKeyParamValid) - { - /* copy set STA key params to WDI structure */ - wdiBssParams->wdiExtSetKeyParam.ucSTAIdx = - wdaBssParams->extSetStaKeyParam.staIdx; - wdiBssParams->wdiExtSetKeyParam.wdiEncType = - wdaBssParams->extSetStaKeyParam.encType; - wdiBssParams->wdiExtSetKeyParam.wdiWEPType = - wdaBssParams->extSetStaKeyParam.wepType; - wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx = - wdaBssParams->extSetStaKeyParam.defWEPIdx; - if(wdaBssParams->extSetStaKeyParam.encType != eSIR_ED_NONE) - { - if( (wdiBssParams->wdiExtSetKeyParam.wdiWEPType == WDI_WEP_STATIC) && - (WDA_INVALID_KEY_INDEX == wdaBssParams->extSetStaKeyParam.defWEPIdx) && - (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole)) - { - WDA_GetWepKeysFromCfg( pWDA, - &wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx, - &wdiBssParams->wdiExtSetKeyParam.ucNumKeys, - wdiBssParams->wdiExtSetKeyParam.wdiKey ); - } - else - { - for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; - keyIndex++) - { - wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyId = - wdaBssParams->extSetStaKeyParam.key[keyIndex].keyId; - wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].unicast = - wdaBssParams->extSetStaKeyParam.key[keyIndex].unicast; - wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection = - wdaBssParams->extSetStaKeyParam.key[keyIndex].keyDirection; - vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc, - wdaBssParams->extSetStaKeyParam.key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN); - wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole = - wdaBssParams->extSetStaKeyParam.key[keyIndex].paeRole; - wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyLength = - wdaBssParams->extSetStaKeyParam.key[keyIndex].keyLength; - vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].key, - wdaBssParams->extSetStaKeyParam.key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH); - } - wdiBssParams->wdiExtSetKeyParam.ucNumKeys = - SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; - } - } - wdiBssParams->wdiExtSetKeyParam.ucSingleTidRc = wdaBssParams->extSetStaKeyParam.singleTidRc; - } - else /* wdaBssParams->bExtSetStaKeyParamValid is not valid */ - { - vos_mem_zero( &wdaBssParams->extSetStaKeyParam, - sizeof(wdaBssParams->extSetStaKeyParam) ); - } -#endif /*WLAN_FEATURE_VOWIFI_11R*/ -#ifdef WLAN_FEATURE_11AC - wdiBssParams->ucVhtCapableSta = wdaBssParams->vhtCapable; - wdiBssParams->ucVhtTxChannelWidthSet = wdaBssParams->vhtTxChannelWidthSet; -#endif - - return ; -} -/* - * FUNCTION: WDA_UpdateSTAParams - * Translated WDA/PE BSS info into WDI BSS info.. - */ -void WDA_UpdateSTAParams(tWDA_CbContext *pWDA, - WDI_ConfigStaReqInfoType *wdiStaParams, - tAddStaParams *wdaStaParams) -{ - tANI_U8 i = 0; - /* Update STA params */ - vos_mem_copy(wdiStaParams->macBSSID, wdaStaParams->bssId, - sizeof(tSirMacAddr)) ; - wdiStaParams->usAssocId = wdaStaParams->assocId; - wdiStaParams->wdiSTAType = wdaStaParams->staType; - wdiStaParams->staIdx = wdaStaParams->staIdx; - - wdiStaParams->ucShortPreambleSupported = - wdaStaParams->shortPreambleSupported; - vos_mem_copy(wdiStaParams->macSTA, wdaStaParams->staMac, - sizeof(tSirMacAddr)) ; - wdiStaParams->usListenInterval = wdaStaParams->listenInterval; - - wdiStaParams->ucWMMEnabled = wdaStaParams->wmmEnabled; - - wdiStaParams->ucHTCapable = wdaStaParams->htCapable; - wdiStaParams->ucTXChannelWidthSet = wdaStaParams->txChannelWidthSet; - wdiStaParams->ucRIFSMode = wdaStaParams->rifsMode; - wdiStaParams->ucLSIGTxopProtection = wdaStaParams->lsigTxopProtection; - wdiStaParams->ucMaxAmpduSize = wdaStaParams->maxAmpduSize; - wdiStaParams->ucMaxAmpduDensity = wdaStaParams->maxAmpduDensity; - wdiStaParams->ucMaxAmsduSize = wdaStaParams->maxAmsduSize; - - wdiStaParams->ucShortGI40Mhz = wdaStaParams->fShortGI40Mhz; - wdiStaParams->ucShortGI20Mhz = wdaStaParams->fShortGI20Mhz; - wdiStaParams->wdiSupportedRates.opRateMode = - wdaStaParams->supportedRates.opRateMode; - for(i = 0;i < WDI_NUM_11B_RATES;i++) - { - wdiStaParams->wdiSupportedRates.llbRates[i] = - wdaStaParams->supportedRates.llbRates[i]; - } - for(i = 0;i < WDI_NUM_11A_RATES;i++) - { - wdiStaParams->wdiSupportedRates.llaRates[i] = - wdaStaParams->supportedRates.llaRates[i]; - } - for(i = 0;i < SIR_NUM_POLARIS_RATES;i++) - { - wdiStaParams->wdiSupportedRates.aLegacyRates[i] = - wdaStaParams->supportedRates.aniLegacyRates[i]; - } - wdiStaParams->wdiSupportedRates.uEnhancedRateBitmap = - wdaStaParams->supportedRates.aniEnhancedRateBitmap; -#ifdef WLAN_FEATURE_11AC - wdiStaParams->wdiSupportedRates.vhtRxMCSMap = wdaStaParams->supportedRates.vhtRxMCSMap; - wdiStaParams->wdiSupportedRates.vhtRxHighestDataRate = wdaStaParams->supportedRates.vhtRxHighestDataRate; - wdiStaParams->wdiSupportedRates.vhtTxMCSMap = wdaStaParams->supportedRates.vhtTxMCSMap; - wdiStaParams->wdiSupportedRates.vhtTxHighestDataRate = wdaStaParams->supportedRates.vhtTxHighestDataRate; -#endif - for(i = 0;i <SIR_MAC_MAX_SUPPORTED_MCS_SET;i++) - { - wdiStaParams->wdiSupportedRates.aSupportedMCSSet[i] = - wdaStaParams->supportedRates.supportedMCSSet[i]; - } - wdiStaParams->wdiSupportedRates.aRxHighestDataRate = - wdaStaParams->supportedRates.rxHighestDataRate; - - wdiStaParams->ucRMFEnabled = wdaStaParams->rmfEnabled; - - wdiStaParams->wdiAction = wdaStaParams->updateSta; - - wdiStaParams->ucAPSD = wdaStaParams->uAPSD; - wdiStaParams->ucMaxSPLen = wdaStaParams->maxSPLen; - wdiStaParams->ucGreenFieldCapable = wdaStaParams->greenFieldCapable; - - wdiStaParams->ucDelayedBASupport = wdaStaParams->delBASupport; - wdiStaParams->us32MaxAmpduDuratio = wdaStaParams->us32MaxAmpduDuration; - wdiStaParams->ucDsssCckMode40Mhz = wdaStaParams->fDsssCckMode40Mhz; - wdiStaParams->ucEncryptType = wdaStaParams->encryptType; - wdiStaParams->ucP2pCapableSta = wdaStaParams->p2pCapableSta; -#ifdef WLAN_FEATURE_11AC - wdiStaParams->ucVhtCapableSta = wdaStaParams->vhtCapable; - wdiStaParams->ucVhtTxChannelWidthSet = wdaStaParams->vhtTxChannelWidthSet; - wdiStaParams->ucVhtTxBFEnabled = wdaStaParams->vhtTxBFCapable; -#endif - wdiStaParams->ucHtLdpcEnabled= wdaStaParams->htLdpcCapable; - wdiStaParams->ucVhtLdpcEnabled = wdaStaParams->vhtLdpcCapable; - return ; -} -/* - * ------------------------------------------------------------------------- - * CFG update to WDI - * ------------------------------------------------------------------------- - */ - - /* - * FUNCTION: WDA_ConvertWniCfgIdToHALCfgId - * Convert the WNI CFG ID to HAL CFG ID - */ -static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId) -{ - switch(wniCfgId) - { - case WNI_CFG_STA_ID: - return QWLAN_HAL_CFG_STA_ID; - case WNI_CFG_CURRENT_TX_ANTENNA: - return QWLAN_HAL_CFG_CURRENT_TX_ANTENNA; - case WNI_CFG_CURRENT_RX_ANTENNA: - return QWLAN_HAL_CFG_CURRENT_RX_ANTENNA; - case WNI_CFG_LOW_GAIN_OVERRIDE: - return QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE; - case WNI_CFG_POWER_STATE_PER_CHAIN: - return QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN; - case WNI_CFG_CAL_PERIOD: - return QWLAN_HAL_CFG_CAL_PERIOD; - case WNI_CFG_CAL_CONTROL: - return QWLAN_HAL_CFG_CAL_CONTROL; - case WNI_CFG_PROXIMITY: - return QWLAN_HAL_CFG_PROXIMITY; - case WNI_CFG_NETWORK_DENSITY: - return QWLAN_HAL_CFG_NETWORK_DENSITY; - case WNI_CFG_MAX_MEDIUM_TIME: - return QWLAN_HAL_CFG_MAX_MEDIUM_TIME; - case WNI_CFG_MAX_MPDUS_IN_AMPDU: - return QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU; - case WNI_CFG_RTS_THRESHOLD: - return QWLAN_HAL_CFG_RTS_THRESHOLD; - case WNI_CFG_SHORT_RETRY_LIMIT: - return QWLAN_HAL_CFG_SHORT_RETRY_LIMIT; - case WNI_CFG_LONG_RETRY_LIMIT: - return QWLAN_HAL_CFG_LONG_RETRY_LIMIT; - case WNI_CFG_FRAGMENTATION_THRESHOLD: - return QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD; - case WNI_CFG_DYNAMIC_THRESHOLD_ZERO: - return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO; - case WNI_CFG_DYNAMIC_THRESHOLD_ONE: - return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE; - case WNI_CFG_DYNAMIC_THRESHOLD_TWO: - return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO; - case WNI_CFG_FIXED_RATE: - return QWLAN_HAL_CFG_FIXED_RATE; - case WNI_CFG_RETRYRATE_POLICY: - return QWLAN_HAL_CFG_RETRYRATE_POLICY; - case WNI_CFG_RETRYRATE_SECONDARY: - return QWLAN_HAL_CFG_RETRYRATE_SECONDARY; - case WNI_CFG_RETRYRATE_TERTIARY: - return QWLAN_HAL_CFG_RETRYRATE_TERTIARY; - case WNI_CFG_FORCE_POLICY_PROTECTION: - return QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION; - case WNI_CFG_FIXED_RATE_MULTICAST_24GHZ: - return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ; - case WNI_CFG_FIXED_RATE_MULTICAST_5GHZ: - return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ; - case WNI_CFG_DEFAULT_RATE_INDEX_24GHZ: - return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ; - case WNI_CFG_DEFAULT_RATE_INDEX_5GHZ: - return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ; - case WNI_CFG_MAX_BA_SESSIONS: - return QWLAN_HAL_CFG_MAX_BA_SESSIONS; - case WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT: - return QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT; - case WNI_CFG_PS_ENABLE_BCN_FILTER: - return QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER; - case WNI_CFG_PS_ENABLE_RSSI_MONITOR: - return QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR; - case WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE: - return QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE; - case WNI_CFG_STATS_PERIOD: - return QWLAN_HAL_CFG_STATS_PERIOD; - case WNI_CFG_CFP_MAX_DURATION: - return QWLAN_HAL_CFG_CFP_MAX_DURATION; -#if 0 /*This is not part of CFG*/ - case WNI_CFG_FRAME_TRANS_ENABLED: - return QWLAN_HAL_CFG_FRAME_TRANS_ENABLED; -#endif - case WNI_CFG_DTIM_PERIOD: - return QWLAN_HAL_CFG_DTIM_PERIOD; - case WNI_CFG_EDCA_WME_ACBK: - return QWLAN_HAL_CFG_EDCA_WMM_ACBK; - case WNI_CFG_EDCA_WME_ACBE: - return QWLAN_HAL_CFG_EDCA_WMM_ACBE; - case WNI_CFG_EDCA_WME_ACVI: - return QWLAN_HAL_CFG_EDCA_WMM_ACVI; - case WNI_CFG_EDCA_WME_ACVO: - return QWLAN_HAL_CFG_EDCA_WMM_ACVO; -#if 0 - case WNI_CFG_TELE_BCN_WAKEUP_EN: - return QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN; - case WNI_CFG_TELE_BCN_TRANS_LI: - return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI; - case WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS: - return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS; - case WNI_CFG_TELE_BCN_MAX_LI: - return QWLAN_HAL_CFG_TELE_BCN_MAX_LI; - case WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS: - return QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS; -#endif - case WNI_CFG_ENABLE_CLOSE_LOOP: - return QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP; - case WNI_CFG_ENABLE_LPWR_IMG_TRANSITION: - return QWLAN_HAL_CFG_ENABLE_LPWR_IMG_TRANSITION; - default: - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "There is no HAL CFG Id corresponding to WNI CFG Id: %d", - wniCfgId); - return VOS_STATUS_E_INVAL; - } - } -} -/* - * FUNCTION: WDA_UpdateCfgCallback - * - */ -void WDA_UpdateCfgCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; - WDI_UpdateCfgReqParamsType *wdiCfgParam = - (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgApiMsgParam ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - /* - * currently there is no response message is expected between PE and - * WDA, Failure return from WDI is a ASSERT condition - */ - if(WDI_STATUS_SUCCESS != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: CFG (%d) config failure", __func__, - ((tHalCfg *)(wdiCfgParam->pConfigBuffer))->type); - } - - vos_mem_free(wdiCfgParam->pConfigBuffer) ; - vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ; - pWDA->wdaWdiCfgApiMsgParam = NULL; - return ; -} -/* - * FUNCTION: WDA_UpdateCfg - * - */ -VOS_STATUS WDA_UpdateCfg(tWDA_CbContext *pWDA, tSirMsgQ *cfgParam) -{ - - WDI_Status status = WDI_STATUS_SUCCESS ; - tANI_U32 val =0; - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ; - tHalCfg *configData; - WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ; - tANI_U8 *configDataValue; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if (NULL == pMac ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid MAC context ", __func__ ); - return VOS_STATUS_E_FAILURE; - } - if(WDA_START_STATE != pWDA->wdaState) - { - return VOS_STATUS_E_FAILURE; - } - - if(NULL != pWDA->wdaWdiCfgApiMsgParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:wdaWdiCfgApiMsgParam is not NULL", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - - wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc( - sizeof(WDI_UpdateCfgReqParamsType)) ; - if(NULL == wdiCfgReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - wdiCfgReqParam->pConfigBuffer = vos_mem_malloc(sizeof(tHalCfg) + - sizeof(tANI_U32)) ; - if(NULL == wdiCfgReqParam->pConfigBuffer) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(wdiCfgReqParam); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - /*convert the WNI CFG Id to HAL CFG Id*/ - ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->type = - WDA_ConvertWniCfgIdToHALCfgId(cfgParam->bodyval); - - /*TODO: revisit this for handling string parameters */ - if (wlan_cfgGetInt(pMac, (tANI_U16) cfgParam->bodyval, - &val) != eSIR_SUCCESS) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to cfg get id %d", cfgParam->bodyval); - vos_mem_free(wdiCfgReqParam->pConfigBuffer); - vos_mem_free(wdiCfgReqParam); - return eSIR_FAILURE; - } - ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->length = sizeof(tANI_U32); - configData =((tHalCfg *)wdiCfgReqParam->pConfigBuffer) ; - configDataValue = ((tANI_U8 *)configData + sizeof(tHalCfg)); - vos_mem_copy( configDataValue, &val, sizeof(tANI_U32)); - wdiCfgReqParam->wdiReqStatusCB = NULL ; - - /* store Params pass it to WDI */ - pWDA->wdaWdiCfgApiMsgParam = (void *)wdiCfgReqParam ; -#ifdef FEATURE_HAL_SUPPORT_DYNAMIC_UPDATE_CFG - status = WDI_UpdateCfgReq(wdiCfgReqParam, - (WDI_UpdateCfgRspCb )WDA_UpdateCfgCallback, pWDA) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Update CFG WDI API, free all the memory " ); - vos_mem_free(wdiCfgReqParam->pConfigBuffer) ; - vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ; - pWDA->wdaWdiCfgApiMsgParam = NULL; - /* Failure is not expected */ - VOS_ASSERT(0) ; - } -#else - vos_mem_free(wdiCfgReqParam->pConfigBuffer) ; - vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ; - pWDA->wdaWdiCfgApiMsgParam = NULL; -#endif - return CONVERT_WDI2VOS_STATUS(status) ; -} - -VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA, - v_U8_t *pDefaultKeyId, - v_U8_t *pNumKeys, - WDI_KeysType *pWdiKeys ) -{ - v_U32_t i, j, defKeyId = 0; - v_U32_t val = SIR_MAC_KEY_LENGTH; - VOS_STATUS status = WDI_STATUS_SUCCESS; - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ; - if (NULL == pMac ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid MAC context ", __func__ ); - return VOS_STATUS_E_FAILURE; - } - if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_WEP_DEFAULT_KEYID, - &defKeyId )) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to retrieve defaultKeyId from CFG. Defaulting to 0..."); - } - - *pDefaultKeyId = (v_U8_t)defKeyId; - /* Need to extract ALL of the configured WEP Keys */ - for( i = 0, j = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; i++ ) - { - val = SIR_MAC_KEY_LENGTH; - if( eSIR_SUCCESS != wlan_cfgGetStr( pMac, - (v_U16_t) (WNI_CFG_WEP_DEFAULT_KEY_1 + i), - pWdiKeys[j].key, - &val )) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WEP Key index [%d] may not configured in CFG",i); - } - else - { - pWdiKeys[j].keyId = (tANI_U8) i; - /* - * Actually, a DC (Don't Care) because - * this is determined (and set) by PE/MLME - */ - pWdiKeys[j].unicast = 0; - /* - * Another DC (Don't Care) - */ - pWdiKeys[j].keyDirection = eSIR_TX_RX; - /* Another DC (Don't Care). Unused for WEP */ - pWdiKeys[j].paeRole = 0; - /* Determined from wlan_cfgGetStr() above.*/ - pWdiKeys[j].keyLength = (tANI_U16) val; - j++; - *pNumKeys = (tANI_U8) j; - } - } - return status; -} -/* - * FUNCTION: WDA_SetBssKeyReqCallback - * send SET BSS key RSP back to PE - */ -void WDA_SetBssKeyReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSetBssKeyParams *setBssKeyParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - setBssKeyParams = (tSetBssKeyParams *)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - setBssKeyParams->status = status ; - WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessSetBssKeyReq - * Request to WDI for programming the BSS key( key for - * broadcast/multicast frames Encryption) - */ -VOS_STATUS WDA_ProcessSetBssKeyReq(tWDA_CbContext *pWDA, - tSetBssKeyParams *setBssKeyParams ) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SetBSSKeyReqParamsType *wdiSetBssKeyParam = - (WDI_SetBSSKeyReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetBSSKeyReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - v_U8_t keyIndex; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiSetBssKeyParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiSetBssKeyParam); - return VOS_STATUS_E_NOMEM; - } - vos_mem_zero(wdiSetBssKeyParam, sizeof(WDI_SetBSSKeyReqParamsType)); - /* copy set BSS params to WDI structure */ - wdiSetBssKeyParam->wdiBSSKeyInfo.ucBssIdx = setBssKeyParams->bssIdx; - wdiSetBssKeyParam->wdiBSSKeyInfo.wdiEncType = setBssKeyParams->encType; - wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys = setBssKeyParams->numKeys; - if(setBssKeyParams->encType != eSIR_ED_NONE) - { - if( setBssKeyParams->numKeys == 0 && - (( setBssKeyParams->encType == eSIR_ED_WEP40)|| - setBssKeyParams->encType == eSIR_ED_WEP104)) - { - tANI_U8 defaultKeyId = 0; - WDA_GetWepKeysFromCfg( pWDA, &defaultKeyId, - &wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys, - wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys ); - } - else - { - for( keyIndex=0; keyIndex < setBssKeyParams->numKeys; keyIndex++) - { - wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyId = - setBssKeyParams->key[keyIndex].keyId; - wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].unicast = - setBssKeyParams->key[keyIndex].unicast; - wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyDirection = - setBssKeyParams->key[keyIndex].keyDirection; - vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc, - setBssKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN); - wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].paeRole = - setBssKeyParams->key[keyIndex].paeRole; - wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyLength = - setBssKeyParams->key[keyIndex].keyLength; - vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].key, - setBssKeyParams->key[keyIndex].key, - SIR_MAC_MAX_KEY_LENGTH); - } - } - } - wdiSetBssKeyParam->wdiBSSKeyInfo.ucSingleTidRc = - setBssKeyParams->singleTidRc; - wdiSetBssKeyParam->wdiReqStatusCB = NULL ; - /* Store set key pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = setBssKeyParams; - pWdaParams->wdaWdiApiMsgParam = wdiSetBssKeyParam; - status = WDI_SetBSSKeyReq(wdiSetBssKeyParam, - (WDI_SetBSSKeyRspCb)WDA_SetBssKeyReqCallback ,pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set BSS Key Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - setBssKeyParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_RemoveBssKeyReqCallback - * send SET BSS key RSP back to PE - */ -void WDA_RemoveBssKeyReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tRemoveBssKeyParams *removeBssKeyParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - removeBssKeyParams = (tRemoveBssKeyParams *)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - removeBssKeyParams->status = status ; - WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessRemoveBssKeyReq - * Request to WDI to remove the BSS key( key for broadcast/multicast - * frames Encryption) - */ -VOS_STATUS WDA_ProcessRemoveBssKeyReq(tWDA_CbContext *pWDA, - tRemoveBssKeyParams *removeBssKeyParams ) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_RemoveBSSKeyReqParamsType *wdiRemoveBssKeyParam = - (WDI_RemoveBSSKeyReqParamsType *)vos_mem_malloc( - sizeof(WDI_RemoveBSSKeyReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiRemoveBssKeyParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiRemoveBssKeyParam); - return VOS_STATUS_E_NOMEM; - } - /* copy Remove BSS key params to WDI structure*/ - wdiRemoveBssKeyParam->wdiKeyInfo.ucBssIdx = removeBssKeyParams->bssIdx; - wdiRemoveBssKeyParam->wdiKeyInfo.wdiEncType = removeBssKeyParams->encType; - wdiRemoveBssKeyParam->wdiKeyInfo.ucKeyId = removeBssKeyParams->keyId; - wdiRemoveBssKeyParam->wdiKeyInfo.wdiWEPType = removeBssKeyParams->wepType; - wdiRemoveBssKeyParam->wdiReqStatusCB = NULL ; - /* Store remove key pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = removeBssKeyParams; - pWdaParams->wdaWdiApiMsgParam = wdiRemoveBssKeyParam; - status = WDI_RemoveBSSKeyReq(wdiRemoveBssKeyParam, - (WDI_RemoveBSSKeyRspCb)WDA_RemoveBssKeyReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Remove BSS Key Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - removeBssKeyParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_SetBssKeyReqCallback - * send SET BSS key RSP back to PE - */ -void WDA_SetStaKeyReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSetStaKeyParams *setStaKeyParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR - ,"%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - setStaKeyParams->status = status ; - WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessSetStaKeyReq - * Request to WDI for programming the STA key( key for Unicast frames - * Encryption) - */ -VOS_STATUS WDA_ProcessSetStaKeyReq(tWDA_CbContext *pWDA, - tSetStaKeyParams *setStaKeyParams ) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam = - (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetSTAKeyReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - v_U8_t keyIndex; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiSetStaKeyParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiSetStaKeyParam); - return VOS_STATUS_E_NOMEM; - } - vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0); - vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType)); - /* copy set STA key params to WDI structure */ - wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx; - wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType; - wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType; - wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx; - if(setStaKeyParams->encType != eSIR_ED_NONE) - { - if( (wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType == WDI_WEP_STATIC) && - (WDA_INVALID_KEY_INDEX == setStaKeyParams->defWEPIdx) && - (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole)) - { - WDA_GetWepKeysFromCfg( pWDA, - &wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx, - &wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys, - wdiSetStaKeyParam->wdiKeyInfo.wdiKey ); - } - else - { - for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; - keyIndex++) - { - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId = - setStaKeyParams->key[keyIndex].keyId; - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast = - setStaKeyParams->key[keyIndex].unicast; - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection = - setStaKeyParams->key[keyIndex].keyDirection; - vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc, - setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN); - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole = - setStaKeyParams->key[keyIndex].paeRole; - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength = - setStaKeyParams->key[keyIndex].keyLength; - vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key, - setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH); - /* set default index to index which have key direction as WDI_TX_DEFAULT */ - if (WDI_TX_DEFAULT == wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection) - { - wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = keyIndex; - } - } - wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = - SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; - } - } - wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc; - wdiSetStaKeyParam->wdiReqStatusCB = NULL ; - /* Store set key pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = setStaKeyParams; - pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam; - status = WDI_SetSTAKeyReq(wdiSetStaKeyParam, - (WDI_SetSTAKeyRspCb)WDA_SetStaKeyReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in set STA Key Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - setStaKeyParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_SetBcastStaKeyReqCallback - * send SET Bcast STA key RSP back to PE - */ -void WDA_SetBcastStaKeyReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSetStaKeyParams *setStaKeyParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - setStaKeyParams->status = status ; - WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams , 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessSetBcastStaKeyReq - * Request to WDI for programming the Bcast STA key( key for Broadcast frames - * Encryption) - */ -VOS_STATUS WDA_ProcessSetBcastStaKeyReq(tWDA_CbContext *pWDA, - tSetStaKeyParams *setStaKeyParams ) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam = - (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetSTAKeyReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - v_U8_t keyIndex; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiSetStaKeyParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiSetStaKeyParam); - return VOS_STATUS_E_NOMEM; - } - vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0); - vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType)); - /* copy set STA key params to WDI structure */ - wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx; - wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType; - wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType; - wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx; - if(setStaKeyParams->encType != eSIR_ED_NONE) - { - for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; - keyIndex++) - { - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId = - setStaKeyParams->key[keyIndex].keyId; - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast = - setStaKeyParams->key[keyIndex].unicast; - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection = - setStaKeyParams->key[keyIndex].keyDirection; - vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc, - setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN); - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole = - setStaKeyParams->key[keyIndex].paeRole; - wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength = - setStaKeyParams->key[keyIndex].keyLength; - vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key, - setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH); - } - wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = - SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; - } - wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc; - /* Store set key pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = setStaKeyParams; - pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam; - status = WDI_SetSTABcastKeyReq(wdiSetStaKeyParam, - (WDI_SetSTAKeyRspCb)WDA_SetBcastStaKeyReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in set BCAST STA Key Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - setStaKeyParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_RemoveStaKeyReqCallback - * send SET BSS key RSP back to PE - */ -void WDA_RemoveStaKeyReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tRemoveStaKeyParams *removeStaKeyParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - removeStaKeyParams = (tRemoveStaKeyParams *)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - removeStaKeyParams->status = status ; - WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams , 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessRemoveStaKeyReq - * Request to WDI to remove the STA key( key for Unicast frames Encryption) - */ -VOS_STATUS WDA_ProcessRemoveStaKeyReq(tWDA_CbContext *pWDA, - tRemoveStaKeyParams *removeStaKeyParams ) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_RemoveSTAKeyReqParamsType *wdiRemoveStaKeyParam = - (WDI_RemoveSTAKeyReqParamsType *)vos_mem_malloc( - sizeof(WDI_RemoveSTAKeyReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiRemoveStaKeyParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiRemoveStaKeyParam); - return VOS_STATUS_E_NOMEM; - } - /* copy remove STA key params to WDI structure*/ - wdiRemoveStaKeyParam->wdiKeyInfo.ucSTAIdx = removeStaKeyParams->staIdx; - wdiRemoveStaKeyParam->wdiKeyInfo.wdiEncType = removeStaKeyParams->encType; - wdiRemoveStaKeyParam->wdiKeyInfo.ucKeyId = removeStaKeyParams->keyId; - wdiRemoveStaKeyParam->wdiKeyInfo.ucUnicast = removeStaKeyParams->unicast; - wdiRemoveStaKeyParam->wdiReqStatusCB = NULL ; - /* Store remove key pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = removeStaKeyParams; - pWdaParams->wdaWdiApiMsgParam = wdiRemoveStaKeyParam; - status = WDI_RemoveSTAKeyReq(wdiRemoveStaKeyParam, - (WDI_RemoveSTAKeyRspCb)WDA_RemoveStaKeyReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in remove STA Key Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - removeStaKeyParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_IsHandleSetLinkStateReq - * Update the WDA state and return the status to handle this message or not - */ -WDA_processSetLinkStateStatus WDA_IsHandleSetLinkStateReq( - tWDA_CbContext *pWDA, - tLinkStateParams *linkStateParams) -{ - WDA_processSetLinkStateStatus status = WDA_PROCESS_SET_LINK_STATE; - switch(linkStateParams->state) - { - case eSIR_LINK_PREASSOC_STATE: - case eSIR_LINK_BTAMP_PREASSOC_STATE: - /* - * set the WDA state to PRE ASSOC - * copy the BSSID into pWDA to use it in join request and return, - * No need to handle these messages. - */ - if( !WDA_IS_NULL_MAC_ADDRESS(linkStateParams->bssid) ) - { - vos_mem_copy(pWDA->macBSSID,linkStateParams->bssid, - sizeof(tSirMacAddr)); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: BSSID in set link state is NULL ", __func__); - VOS_ASSERT(0); - } - - if( !WDA_IS_NULL_MAC_ADDRESS(linkStateParams->selfMacAddr) ) - { - vos_mem_copy(pWDA->macSTASelf,linkStateParams->selfMacAddr, - sizeof(tSirMacAddr)); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, - "%s: self mac address in set link state is NULL ", __func__); - VOS_ASSERT(0); - } - - /* UMAC is issuing the setlink state with PREASSOC twice (before set - *channel and after ) so reset the WDA state to ready when the second - * time UMAC issue the link state with PREASSOC - */ - if(WDA_PRE_ASSOC_STATE == pWDA->wdaState) - { - /* RESET WDA state back to WDA_READY_STATE */ - pWDA->wdaState = WDA_READY_STATE; - } - else - { - pWDA->wdaState = WDA_PRE_ASSOC_STATE; - } - //populate linkState info in WDACbCtxt - pWDA->linkState = linkStateParams->state; - break; - case eSIR_LINK_DOWN_STATE: - status = WDA_IGNORE_SET_LINK_STATE; - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG, - "Ignoring DOWN link state in WDA"); - break; - default: - if(pWDA->wdaState != WDA_READY_STATE) - { - /*If WDA_SET_LINK_STATE is recieved with any other link state apart - *from eSIR_LINK_PREASSOC_STATE and eSIR_LINK_BTAMP_PREASSOC_STATE when - *pWDA->wdaState is in WDA_PRE_ASSOC_STATE(This can happen only in - *error cases) so reset the WDA state to WDA_READY_STATE to avoid - *the ASSERT in WDA_Stop during module unload.*/ - if (pWDA->wdaState == WDA_PRE_ASSOC_STATE) - { - pWDA->wdaState = WDA_READY_STATE; - /* Don't ignore the set link in this case*/ - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Set link state called when WDA is not in READY STATE " ); - status = WDA_IGNORE_SET_LINK_STATE; - } - } - break; - } - - return status; -} -/* - * FUNCTION: WDA_SetLinkStateCallback - * call back function for set link state from WDI - */ -void WDA_SetLinkStateCallback(WDI_Status status, void* pUserData) -{ - tWDA_CbContext *pWDA; - tLinkStateParams *linkStateParams; - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ; - /* - * In STA mode start the BA activity check timer after association - * and in AP mode start BA activity check timer after BSS start */ - if( ((linkStateParams->state == eSIR_LINK_POSTASSOC_STATE) && - status == WDI_STATUS_SUCCESS) || ((status == WDI_STATUS_SUCCESS) && - (linkStateParams->state == eSIR_LINK_AP_STATE)) || - ((status == WDI_STATUS_SUCCESS) && - (linkStateParams->state == eSIR_LINK_IBSS_STATE))) - { - WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr); - } - WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ; - /* - * No respone required for WDA_SET_LINK_STATE so free the request - * param here - */ - if( pWdaParams != NULL ) - { - if( pWdaParams->wdaWdiApiMsgParam != NULL ) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - } - vos_mem_free(pWdaParams); - } - return ; -} -/* - * FUNCTION: WDA_ProcessSetLinkState - * Request to WDI to set the link status. - */ -VOS_STATUS WDA_ProcessSetLinkState(tWDA_CbContext *pWDA, - tLinkStateParams *linkStateParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SetLinkReqParamsType *wdiSetLinkStateParam = - (WDI_SetLinkReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetLinkReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - tpAniSirGlobal pMac; - pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - - if(NULL == pMac) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pMac is NULL", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiSetLinkStateParam); - return VOS_STATUS_E_FAILURE; - } - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiSetLinkStateParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiSetLinkStateParam); - return VOS_STATUS_E_NOMEM; - } - if(WDA_IGNORE_SET_LINK_STATE == - WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams)) - { - status = WDI_STATUS_E_FAILURE; - } - else - { - vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID, - linkStateParams->bssid, sizeof(tSirMacAddr)); - vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr, - linkStateParams->selfMacAddr, sizeof(tSirMacAddr)); - wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state; - wdiSetLinkStateParam->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - /* Store remove key pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)linkStateParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ; - /* Stop Timer only other than GO role and concurrent session */ - if( (linkStateParams->state == eSIR_LINK_IDLE_STATE) - && (0 == WDI_GetActiveSessionsCount(pWDA->pWdiContext, linkStateParams->bssid, TRUE)) && - (wdaGetGlobalSystemRole(pMac) != eSYSTEM_AP_ROLE) ) - { - WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr); - } - status = WDI_SetLinkStateReq(wdiSetLinkStateParam, - (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in set link state Req WDI API, free all the memory " ); - } - } - if(IS_WDI_STATUS_FAILURE(status)) - { - vos_mem_free(wdiSetLinkStateParam) ; - WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams, 0); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_GetStatsReqParamsCallback - * send the response to PE with Stats received from WDI - */ -void WDA_GetStatsReqParamsCallback( - WDI_GetStatsRspParamsType *wdiGetStatsRsp, - void* pUserData) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; - tAniGetPEStatsRsp *pGetPEStatsRspParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - pGetPEStatsRspParams = - (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) + - (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType))); - - if(NULL == pGetPEStatsRspParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return; - } - vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0); - pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType; - pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) + - (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)); - - //Fill the Session Id Properly in PE - pGetPEStatsRspParams->sessionId = 0; - pGetPEStatsRspParams->rc = - wdiGetStatsRsp->wdiStatus; - pGetPEStatsRspParams->staId = wdiGetStatsRsp->ucSTAIdx; - pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask; - vos_mem_copy( pGetPEStatsRspParams + 1, - wdiGetStatsRsp + 1, - wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)); - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ; - - return; -} - -/* - * FUNCTION: WDA_ProcessGetStatsReq - * Request to WDI to get the statistics - */ -VOS_STATUS WDA_ProcessGetStatsReq(tWDA_CbContext *pWDA, - tAniGetPEStatsReq *pGetStatsParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_GetStatsReqParamsType wdiGetStatsParam; - tAniGetPEStatsRsp *pGetPEStatsRspParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx = - pGetStatsParams->staId; - wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask = - pGetStatsParams->statsMask; - wdiGetStatsParam.wdiReqStatusCB = NULL ; - status = WDI_GetStatsReq(&wdiGetStatsParam, - (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Get Stats Req WDI API, free all the memory " ); - pGetPEStatsRspParams = - (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp)); - if(NULL == pGetPEStatsRspParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pGetStatsParams); - return VOS_STATUS_E_NOMEM; - } - pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP; - pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp); - pGetPEStatsRspParams->staId = pGetStatsParams->staId; - pGetPEStatsRspParams->rc = eSIR_FAILURE; - WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, - (void *)pGetPEStatsRspParams, 0) ; - } - /* Free the request message */ - vos_mem_free(pGetStatsParams); - return CONVERT_WDI2VOS_STATUS(status); -} - -#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_ESE || defined(FEATURE_WLAN_LFR) -/* - * FUNCTION: WDA_GetGetRssiReqRoamRssiReqParamsCallback - * send the response to PE with roam Rssi received from WDI - */ -void WDA_GetRoamRssiReqParamsCallback( - WDI_GetRoamRssiRspParamsType *wdiGetRoamRssiRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA = NULL; - tAniGetRoamRssiRsp *pGetRoamRssiRspParams = NULL; - tpAniGetRssiReq pGetRoamRssiReqParams = NULL; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pGetRoamRssiReqParams = (tAniGetRssiReq *)pWdaParams->wdaMsgParam; - - if(NULL == pGetRoamRssiReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pGetRoamRssiReqParams received NULL", __func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; - } - pGetRoamRssiRspParams = - (tAniGetRoamRssiRsp *)vos_mem_malloc(sizeof(tAniGetRoamRssiRsp)); - - if(NULL == pGetRoamRssiRspParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return; - } - vos_mem_set(pGetRoamRssiRspParams, sizeof(tAniGetRoamRssiRsp), 0); - pGetRoamRssiRspParams->rc = - wdiGetRoamRssiRsp->wdiStatus; - pGetRoamRssiRspParams->staId = wdiGetRoamRssiRsp->ucSTAIdx; - pGetRoamRssiRspParams->rssi = wdiGetRoamRssiRsp->rssi; - - /* Assign get roam rssi req (backup) in to the response */ - pGetRoamRssiRspParams->rssiReq = pGetRoamRssiReqParams; - - /* free WDI command buffer */ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_GET_ROAM_RSSI_RSP, pGetRoamRssiRspParams , 0) ; - - return; -} - - - -/* - * FUNCTION: WDA_ProcessGetRoamRssiReq - * Request to WDI to get the statistics - */ -VOS_STATUS WDA_ProcessGetRoamRssiReq(tWDA_CbContext *pWDA, - tAniGetRssiReq *pGetRoamRssiParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_GetRoamRssiReqParamsType wdiGetRoamRssiParam; - tAniGetRoamRssiRsp *pGetRoamRssiRspParams = NULL; - tWDA_ReqParams *pWdaParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - wdiGetRoamRssiParam.wdiGetRoamRssiParamsInfo.ucSTAIdx = - pGetRoamRssiParams->staId; - wdiGetRoamRssiParam.wdiReqStatusCB = NULL ; - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - /* Store Init Req pointer, as this will be used for response */ - pWdaParams->pWdaContext = pWDA; - - /* Take Get roam Rssi req backup as it stores the callback to be called after - receiving the response */ - pWdaParams->wdaMsgParam = pGetRoamRssiParams; - pWdaParams->wdaWdiApiMsgParam = NULL; - - status = WDI_GetRoamRssiReq(&wdiGetRoamRssiParam, - (WDI_GetRoamRssiRspCb)WDA_GetRoamRssiReqParamsCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Get RoamRssi Req WDI API, free all the memory status=%d", status ); - pGetRoamRssiRspParams = - (tAniGetRoamRssiRsp *)vos_mem_malloc(sizeof(tAniGetRoamRssiRsp)); - if(NULL == pGetRoamRssiRspParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pGetRoamRssiParams); - vos_mem_free(pWdaParams); - return VOS_STATUS_E_NOMEM; - } - pGetRoamRssiRspParams->staId = pGetRoamRssiParams->staId; - pGetRoamRssiRspParams->rc = eSIR_FAILURE; - pGetRoamRssiRspParams->rssi = 0; - pGetRoamRssiRspParams->rssiReq = pGetRoamRssiParams; - WDA_SendMsg(pWDA, WDA_GET_ROAM_RSSI_RSP, - (void *)pGetRoamRssiRspParams, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status); -} -#endif - - -/* - * FUNCTION: WDA_UpdateEDCAParamCallback - * call back function for Update EDCA params from WDI - */ -void WDA_UpdateEDCAParamCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tEdcaParams *pEdcaParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - vos_mem_free(pEdcaParams); - return ; -} -/* - * FUNCTION: WDA_ProcessUpdateEDCAParamReq - * Request to WDI to Update the EDCA params. - */ -VOS_STATUS WDA_ProcessUpdateEDCAParamReq(tWDA_CbContext *pWDA, - tEdcaParams *pEdcaParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_UpdateEDCAParamsType *wdiEdcaParam = - (WDI_UpdateEDCAParamsType *)vos_mem_malloc( - sizeof(WDI_UpdateEDCAParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiEdcaParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pEdcaParams); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiEdcaParam); - vos_mem_free(pEdcaParams); - return VOS_STATUS_E_NOMEM; - } - wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx; - /* - Since firmware is not using highperformance flag, we have removed - this flag from wdiEDCAInfo structure to match sizeof the structure - between host and firmware.In future if we are planning to use - highperformance flag then Please define this flag in wdiEDCAInfo - structure, update it here and send it to firmware. i.e. - Following is the original line which we removed as part of the fix - wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = - pEdcaParams->highPerformance; - */ - WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo, - &pEdcaParams->acbe); - WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBKInfo, - &pEdcaParams->acbk); - WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVIInfo, - &pEdcaParams->acvi); - WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo, - &pEdcaParams->acvo); - wdiEdcaParam->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - /* Store remove key pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pEdcaParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ; - status = WDI_UpdateEDCAParams(wdiEdcaParam, - (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Update EDCA Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - vos_mem_free(pEdcaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_AddBAReqCallback - * send ADD BA RSP back to PE - */ -void WDA_AddBAReqCallback(WDI_AddBARspinfoType *pAddBARspParams, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tAddBAParams *pAddBAReqParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - pAddBAReqParams->status = pAddBARspParams->wdiStatus ; - WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessAddBAReq - * Request to WDI to Update the ADDBA REQ params. - */ -VOS_STATUS WDA_ProcessAddBAReq(tWDA_CbContext *pWDA, VOS_STATUS status, - tANI_U16 baSessionID, tANI_U8 staIdx, tAddBAParams *pAddBAReqParams) -{ - WDI_Status wstatus; - WDI_AddBAReqParamsType *wdiAddBAReqParam = - (WDI_AddBAReqParamsType *)vos_mem_malloc( - sizeof(WDI_AddBAReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiAddBAReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiAddBAReqParam); - return VOS_STATUS_E_NOMEM; - } - do - { - WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ; - wdiAddBaInfo->ucSTAIdx = staIdx ; - wdiAddBaInfo->ucBaSessionID = baSessionID ; - wdiAddBaInfo->ucWinSize = WDA_BA_MAX_WINSIZE ; - } while(0) ; - wdiAddBAReqParam->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ; - pWdaParams->wdaMsgParam = pAddBAReqParams; - wstatus = WDI_AddBAReq(wdiAddBAReqParam, - (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in ADD BA REQ Params WDI API, free all the memory" ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - pAddBAReqParams->status = eSIR_FAILURE; - WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ; - } - return status; -} -/* - * FUNCTION: WDA_AddBASessionReqCallback - * send ADD BA SESSION RSP back to PE/(or TL) - */ -void WDA_AddBASessionReqCallback( - WDI_AddBASessionRspParamsType *wdiAddBaSession, void* pUserData) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS ; - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tAddBAParams *pAddBAReqParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam; - if( NULL == pAddBAReqParams ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pAddBAReqParams received NULL " ,__func__); - VOS_ASSERT( 0 ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - return ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - /* - * if WDA in update TL state, update TL with BA session parama and send - * another request to HAL(/WDI) (ADD_BA_REQ) - */ - - if((VOS_STATUS_SUCCESS == - CONVERT_WDI2VOS_STATUS(wdiAddBaSession->wdiStatus)) && - (WDA_BA_UPDATE_TL_STATE == pWDA->wdaState)) - { - /* Update TL with BA info received from HAL/WDI */ - status = WDA_TL_BA_SESSION_ADD(pWDA->pVosContext, - wdiAddBaSession->usBaSessionID, - wdiAddBaSession->ucSTAIdx, - wdiAddBaSession->ucBaTID, - wdiAddBaSession->ucBaBufferSize, - wdiAddBaSession->ucWinSize, - wdiAddBaSession->usBaSSN ); - WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID, - wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ; - } - else - { - pAddBAReqParams->status = - CONVERT_WDI2SIR_STATUS(wdiAddBaSession->wdiStatus) ; - - /* Setting Flag to indicate that Set BA is success */ - if(WDI_STATUS_SUCCESS == wdiAddBaSession->wdiStatus) - { - tANI_U16 curSta = wdiAddBaSession->ucSTAIdx; - tANI_U8 tid = wdiAddBaSession->ucBaTID; - WDA_SET_BA_TXFLAG(pWDA, curSta, tid) ; - } - WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ; - } - /*Reset the WDA state to READY */ - pWDA->wdaState = WDA_READY_STATE; - return ; -} - -/* - * FUNCTION: WDA_ProcessAddBASessionReq - * Request to WDI to Update the ADDBA REQ params. - */ -VOS_STATUS WDA_ProcessAddBASessionReq(tWDA_CbContext *pWDA, - tAddBAParams *pAddBAReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_AddBASessionReqParamsType *wdiAddBASessionReqParam = - (WDI_AddBASessionReqParamsType *)vos_mem_malloc( - sizeof(WDI_AddBASessionReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - WLANTL_STAStateType tlSTAState = 0; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiAddBASessionReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiAddBASessionReqParam); - return VOS_STATUS_E_NOMEM; - } - /* - * Populate ADD BA parameters and pass these paarmeters to WDI. - * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes - * the state to track if these is BA recipient case or BA initiator - * case. - */ - do - { - WDI_AddBASessionReqinfoType *wdiBAInfoType = - &wdiAddBASessionReqParam->wdiBASessionInfoType ; - /* vos_mem_copy(wdiBAInfoType->macBSSID, - pAddBAReqParams->bssId, sizeof(tSirMacAddr));*/ - wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx; - vos_mem_copy(wdiBAInfoType->macPeerAddr, - pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr)); - wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID; - wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy; - wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize; - wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout; - wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN; - wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection; - /* check the BA direction and update state accordingly */ - (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection) - ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE) - : (pWDA->wdaState = WDA_BA_UPDATE_LIM_STATE); - - }while(0) ; - wdiAddBASessionReqParam->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - /* Store ADD BA pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ; - - /* In TDLS case, there is a possibility that TL hasn't registered peer yet, but - the peer thinks that we already setup TDLS link, and send us ADDBA request packet - */ - if((VOS_STATUS_SUCCESS != WDA_TL_GET_STA_STATE(pWDA->pVosContext, pAddBAReqParams->staIdx, &tlSTAState)) || - ((WLANTL_STA_CONNECTED != tlSTAState) && (WLANTL_STA_AUTHENTICATED != tlSTAState))) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Peer staIdx %d hasn't established yet(%d). Send ADD BA failure to PE.", pAddBAReqParams->staIdx, tlSTAState ); - status = WDI_STATUS_E_NOT_ALLOWED; - pAddBAReqParams->status = - CONVERT_WDI2SIR_STATUS(status) ; - WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ; - /*Reset the WDA state to READY */ - pWDA->wdaState = WDA_READY_STATE; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - - return CONVERT_WDI2VOS_STATUS(status) ; - } - - status = WDI_AddBASessionReq(wdiAddBASessionReqParam, - (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in ADD BA Session REQ Params WDI API, free all the memory =%d", status); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Send ADD BA failure response to PE"); - pAddBAReqParams->status = - CONVERT_WDI2SIR_STATUS(status) ; - WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ; - /*Reset the WDA state to READY */ - pWDA->wdaState = WDA_READY_STATE; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_DelBANotifyTL - * send DEL BA IND to TL - */ -void WDA_DelBANotifyTL(tWDA_CbContext *pWDA, - tDelBAParams *pDelBAReqParams) -{ - tpDelBAInd pDelBAInd = (tpDelBAInd)vos_mem_malloc(sizeof( tDelBAInd )); - //tSirMsgQ msg; - vos_msg_t vosMsg; - VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; - if(NULL == pDelBAInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0) ; - return; - } - pDelBAInd->mesgType = WDA_DELETEBA_IND; - pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx; - pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID; - pDelBAInd->mesgLen = sizeof( tDelBAInd ); - - - vosMsg.type = WDA_DELETEBA_IND; - vosMsg.bodyptr = pDelBAInd; - vosStatus = vos_mq_post_message(VOS_MQ_ID_TL, &vosMsg); - if ( !VOS_IS_STATUS_SUCCESS(vosStatus) ) - { - vosStatus = VOS_STATUS_E_BADMSG; - } -} -/* - * FUNCTION: WDA_DelBAReqCallback - * send DEL BA RSP back to PE - */ -void WDA_DelBAReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tDelBAParams *pDelBAReqParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ; - /* Notify TL about DEL BA in case of recipinet */ - if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) && - (eBA_RECIPIENT == pDelBAReqParams->baDirection)) - { - WDA_DelBANotifyTL(pWDA, pDelBAReqParams); - } - /* - * No respone required for WDA_DELBA_IND so just free the request - * param here - */ - vos_mem_free(pDelBAReqParams); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; -} - -/* - * FUNCTION: WDA_ProcessDelBAReq - * Request to WDI to Update the DELBA REQ params. - */ -VOS_STATUS WDA_ProcessDelBAReq(tWDA_CbContext *pWDA, - tDelBAParams *pDelBAReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_DelBAReqParamsType *wdiDelBAReqParam = - (WDI_DelBAReqParamsType *)vos_mem_malloc( - sizeof(WDI_DelBAReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - tANI_U16 staIdx = 0; - tANI_U8 tid = 0; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiDelBAReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiDelBAReqParam); - return VOS_STATUS_E_NOMEM; - } - wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx; - wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID; - wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection; - wdiDelBAReqParam->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - /* Store DEL BA pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ; - /* if BA exchange over the air is failed, clear this tid in BaBitmap - * maintained in WDA, so that WDA can retry for another BA session - */ - staIdx = pDelBAReqParams->staIdx; - tid = pDelBAReqParams->baTID; - WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid); - status = WDI_DelBAReq(wdiDelBAReqParam, - (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in DEL BA REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_AddTSReqCallback - * send ADD TS RSP back to PE - */ -void WDA_AddTSReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tAddTsParams *pAddTsReqParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext; - pAddTsReqParams = (tAddTsParams *)pWdaParams->wdaMsgParam ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - - pAddTsReqParams->status = status ; - WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ; - return ; -} - -/* - * FUNCTION: WDA_ProcessAddTSReq - * Request to WDI to Update the ADD TS REQ params. - */ -VOS_STATUS WDA_ProcessAddTSReq(tWDA_CbContext *pWDA, - tAddTsParams *pAddTsReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_AddTSReqParamsType *wdiAddTSReqParam = - (WDI_AddTSReqParamsType *)vos_mem_malloc( - sizeof(WDI_AddTSReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiAddTSReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiAddTSReqParam); - return VOS_STATUS_E_NOMEM; - } - wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx; - wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx; - //TS IE - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength = - pAddTsReqParams->tspec.length; - - //TS IE : TS INFO : TRAFFIC - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.ackPolicy = - pAddTsReqParams->tspec.tsinfo.traffic.ackPolicy; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio = - pAddTsReqParams->tspec.tsinfo.traffic.userPrio; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb = - pAddTsReqParams->tspec.tsinfo.traffic.psb; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation = - pAddTsReqParams->tspec.tsinfo.traffic.aggregation; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy = - pAddTsReqParams->tspec.tsinfo.traffic.accessPolicy; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction = - pAddTsReqParams->tspec.tsinfo.traffic.direction; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid = - pAddTsReqParams->tspec.tsinfo.traffic.tsid; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType = - pAddTsReqParams->tspec.tsinfo.traffic.trafficType; - - //TS IE : TS INFO : SCHEDULE - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule = - pAddTsReqParams->tspec.tsinfo.schedule.schedule; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd = - pAddTsReqParams->tspec.tsinfo.schedule.rsvd; - //TS IE - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz = - pAddTsReqParams->tspec.nomMsduSz; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMaxMsduSz = - pAddTsReqParams->tspec.maxMsduSz; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinSvcInterval = - pAddTsReqParams->tspec.minSvcInterval; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxSvcInterval = - pAddTsReqParams->tspec.maxSvcInterval; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uInactInterval = - pAddTsReqParams->tspec.inactInterval; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSuspendInterval = - pAddTsReqParams->tspec.suspendInterval; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSvcStartTime = - pAddTsReqParams->tspec.svcStartTime; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinDataRate = - pAddTsReqParams->tspec.minDataRate; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMeanDataRate = - pAddTsReqParams->tspec.meanDataRate; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uPeakDataRate = - pAddTsReqParams->tspec.peakDataRate; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxBurstSz = - pAddTsReqParams->tspec.maxBurstSz; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uDelayBound = - pAddTsReqParams->tspec.delayBound; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinPhyRate = - pAddTsReqParams->tspec.minPhyRate; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usSurplusBw = - pAddTsReqParams->tspec.surplusBw; - wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime = - pAddTsReqParams->tspec.mediumTime; - /* TODO: tAddTsParams doesn't have the following fields */ -#if 0 - wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags = - wdiAddTSReqParam->wdiTsInfo.ucServiceInterval = - wdiAddTSReqParam->wdiTsInfo.ucSuspendInterval = - wdiAddTSReqParam->wdiTsInfo.ucDelayedInterval = -#endif - wdiAddTSReqParam->wdiReqStatusCB = NULL ; - - pWdaParams->pWdaContext = pWDA; - /* Store ADD TS pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ; - status = WDI_AddTSReq(wdiAddTSReqParam, - (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in ADD TS REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - pAddTsReqParams->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} - -/* - * FUNCTION: WDA_DelTSReqCallback - * send DEL TS RSP back to PE - */ -void WDA_DelTSReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams); - /* - * No respone required for WDA_DEL_TS_REQ so just free the request - * param here - */ - return ; -} - -/* - * FUNCTION: WDA_ProcessDelTSReq - * Request to WDI to Update the DELTS REQ params. - */ -VOS_STATUS WDA_ProcessDelTSReq(tWDA_CbContext *pWDA, - tDelTsParams *pDelTSReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_DelTSReqParamsType *wdiDelTSReqParam = - (WDI_DelTSReqParamsType *)vos_mem_malloc( - sizeof(WDI_DelTSReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiDelTSReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiDelTSReqParam); - return VOS_STATUS_E_NOMEM; - } - vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID, - pDelTSReqParams->bssId, sizeof(tSirMacAddr)); - wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx; - wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx; - wdiDelTSReqParam->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - /* Store DEL TS pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ; - status = WDI_DelTSReq(wdiDelTSReqParam, - (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in DEL TS REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_UpdateBeaconParamsCallback - * Free the memory. No need to send any response to PE in this case - */ -void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams); - /* - * No respone required for WDA_UPDATE_BEACON_IND so just free the request - * param here - */ - return ; -} -/* - * FUNCTION: WDA_ProcessUpdateBeaconParams - * Request to WDI to send the beacon parameters to HAL to update the Hardware - */ -VOS_STATUS WDA_ProcessUpdateBeaconParams(tWDA_CbContext *pWDA, - tUpdateBeaconParams *pUpdateBeaconParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_UpdateBeaconParamsType *wdiUpdateBeaconParams = - (WDI_UpdateBeaconParamsType *)vos_mem_malloc( - sizeof(WDI_UpdateBeaconParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiUpdateBeaconParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiUpdateBeaconParams); - return VOS_STATUS_E_NOMEM; - } - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx = - pUpdateBeaconParams->bssIdx; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble = - pUpdateBeaconParams->fShortPreamble; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime = - pUpdateBeaconParams->fShortSlotTime; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval = - pUpdateBeaconParams->beaconInterval; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist = - pUpdateBeaconParams->llaCoexist; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist = - pUpdateBeaconParams->llbCoexist; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist = - pUpdateBeaconParams->llgCoexist; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist= - pUpdateBeaconParams->ht20MhzCoexist; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist = - pUpdateBeaconParams->llnNonGFCoexist; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport = - pUpdateBeaconParams->fLsigTXOPProtectionFullSupport; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode = - pUpdateBeaconParams->fRIFSMode; - wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap = - pUpdateBeaconParams->paramChangeBitmap; - wdiUpdateBeaconParams->wdiReqStatusCB = NULL ; - - pWdaParams->pWdaContext = pWDA; - /* Store UpdateBeacon Req pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ; - status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams, - (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in UPDATE BEACON REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#ifdef FEATURE_WLAN_ESE -/* - * FUNCTION: WDA_TSMStatsReqCallback - * send TSM Stats RSP back to PE - */ -void WDA_TSMStatsReqCallback(WDI_TSMStatsRspParamsType *pwdiTSMStatsRspParams, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA = NULL; - tpAniGetTsmStatsRsp pTsmRspParams = NULL; - tpAniGetTsmStatsReq pGetTsmStatsReqParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ Entering: %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext; - pGetTsmStatsReqParams = (tAniGetTsmStatsReq *)pWdaParams->wdaMsgParam; - if(NULL == pGetTsmStatsReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pGetTsmStatsReqParams received NULL", __func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return; - } - pTsmRspParams = - (tAniGetTsmStatsRsp *)vos_mem_malloc(sizeof(tAniGetTsmStatsRsp)); - if( NULL == pTsmRspParams ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pTsmRspParams received NULL " ,__func__); - VOS_ASSERT( 0 ); - return ; - } - - vos_mem_set(pTsmRspParams, sizeof(tAniGetTsmStatsRsp), 0); - pTsmRspParams->rc = pwdiTSMStatsRspParams->wdiStatus; - pTsmRspParams->staId = pGetTsmStatsReqParams->staId; - - pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly; - vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist, - pwdiTSMStatsRspParams->UplinkPktQueueDlyHist, - sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist)/ - sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist[0])); - pTsmRspParams->tsmMetrics.UplinkPktTxDly = pwdiTSMStatsRspParams->UplinkPktTxDly; - pTsmRspParams->tsmMetrics.UplinkPktLoss = pwdiTSMStatsRspParams->UplinkPktLoss; - pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount; - pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount; - pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly; - - /* Assign get tsm stats req req (backup) in to the response */ - pTsmRspParams->tsmStatsReq = pGetTsmStatsReqParams; - /* free WDI command buffer */ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - - WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ; - return ; -} - - -/* - * FUNCTION: WDA_ProcessTsmStatsReq - * Request to WDI to get the TSM Stats params. - */ -VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA, - tpAniGetTsmStatsReq pTsmStats) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL; - tWDA_ReqParams *pWdaParams = NULL; - tAniGetTsmStatsRsp *pGetTsmStatsRspParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> Entering: %s " ,__func__); - wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc( - sizeof(WDI_TSMStatsReqParamsType)); - if(NULL == wdiTSMReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiTSMReqParam); - return VOS_STATUS_E_NOMEM; - } - wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid; - vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid, - pTsmStats->bssId, - sizeof(wpt_macAddr)); - wdiTSMReqParam->wdiReqStatusCB = NULL ; - - pWdaParams->pWdaContext = pWDA; - /* Store TSM Stats pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pTsmStats ; - pWdaParams->wdaWdiApiMsgParam = NULL ; - status = WDI_TSMStatsReq(wdiTSMReqParam, - (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in TSM STATS REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams); - pGetTsmStatsRspParams = - (tAniGetTsmStatsRsp *)vos_mem_malloc(sizeof(tAniGetTsmStatsRsp)); - if(NULL == pGetTsmStatsRspParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pTsmStats); - return VOS_STATUS_E_NOMEM; - } - pGetTsmStatsRspParams->staId = pTsmStats->staId; - pGetTsmStatsRspParams->rc = eSIR_FAILURE; - pGetTsmStatsRspParams->tsmStatsReq = pTsmStats; - WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void*)pGetTsmStatsRspParams, 0); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif -/* - * FUNCTION: WDA_SendBeaconParamsCallback - * No need to send any response to PE in this case - */ -void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData) -{ - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - return ; -} -/* - * FUNCTION: WDA_ProcessSendBeacon - * Request to WDI to send the beacon template to HAL to update the TPE memory and - * start beacon trasmission - */ -VOS_STATUS WDA_ProcessSendBeacon(tWDA_CbContext *pWDA, - tSendbeaconParams *pSendbeaconParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SendBeaconParamsType wdiSendBeaconReqParam; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID, - pSendbeaconParams->bssId, sizeof(tSirMacAddr)); - wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength = - pSendbeaconParams->beaconLength; - wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.timIeOffset = - pSendbeaconParams->timIeOffset; - /* p2pIeOffset should be atleast greater than timIeOffset */ - if ((pSendbeaconParams->p2pIeOffset != 0) && - (pSendbeaconParams->p2pIeOffset < - pSendbeaconParams->timIeOffset)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Invalid p2pIeOffset = %hu ", pSendbeaconParams->p2pIeOffset); - VOS_ASSERT( 0 ); - return WDI_STATUS_E_FAILURE; - } - wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset = - pSendbeaconParams->p2pIeOffset; - /* Copy the beacon template to local buffer */ - vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon, - pSendbeaconParams->beacon, pSendbeaconParams->beaconLength); - wdiSendBeaconReqParam.wdiReqStatusCB = NULL ; - - status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam, - (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in SEND BEACON REQ Params WDI API" ); - } - vos_mem_free(pSendbeaconParams); - return CONVERT_WDI2VOS_STATUS(status); -} -/* - * FUNCTION: WDA_UpdateProbeRspParamsCallback - * No need to send any response to PE in this case - */ -void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData) -{ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - return ; -} - -/* - * FUNCTION: WDA_ProcessUpdateProbeRspTemplate - * Request to WDI to send the probe response template to HAL to update the TPE memory and - * send probe response - */ -VOS_STATUS WDA_ProcessUpdateProbeRspTemplate(tWDA_CbContext *pWDA, - tSendProbeRespParams *pSendProbeRspParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_UpdateProbeRspTemplateParamsType *wdiSendProbeRspParam = - vos_mem_malloc(sizeof(WDI_UpdateProbeRspTemplateParamsType)); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - - if (!wdiSendProbeRspParam) - return CONVERT_WDI2VOS_STATUS(WDI_STATUS_MEM_FAILURE); - - /*Copy update probe response parameters*/ - vos_mem_copy(wdiSendProbeRspParam->wdiProbeRspTemplateInfo.macBSSID, - pSendProbeRspParams->bssId, sizeof(tSirMacAddr)); - wdiSendProbeRspParam->wdiProbeRspTemplateInfo.uProbeRespTemplateLen = - pSendProbeRspParams->probeRespTemplateLen; - /* Copy the Probe Response template to local buffer */ - vos_mem_copy( - wdiSendProbeRspParam->wdiProbeRspTemplateInfo.pProbeRespTemplate, - pSendProbeRspParams->pProbeRespTemplate, - pSendProbeRspParams->probeRespTemplateLen); - vos_mem_copy( - wdiSendProbeRspParam->wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap, - pSendProbeRspParams->ucProxyProbeReqValidIEBmap, - WDI_PROBE_REQ_BITMAP_IE_LEN); - - wdiSendProbeRspParam->wdiReqStatusCB = NULL ; - - status = WDI_UpdateProbeRspTemplateReq(wdiSendProbeRspParam, - (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in SEND Probe RSP Params WDI API" ); - } - vos_mem_free(pSendProbeRspParams); - vos_mem_free(wdiSendProbeRspParam); - return CONVERT_WDI2VOS_STATUS(status); -} -#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_ESE) -/* - * FUNCTION: WDA_SetMaxTxPowerCallBack - * send the response to PE with power value received from WDI - */ -void WDA_SetMaxTxPowerCallBack(WDI_SetMaxTxPowerRspMsg * pwdiSetMaxTxPowerRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA = NULL; - tMaxTxPowerParams *pMaxTxPowerParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext; - pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ; - if( NULL == pMaxTxPowerParams ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pMaxTxPowerParams received NULL " ,__func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; - } - - - /*need to free memory for the pointers used in the - WDA Process.Set Max Tx Power Req function*/ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower; - - - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ; - - return; -} -/* - * FUNCTION: WDA_ProcessSetMaxTxPowerReq - * Request to WDI to send set Max Tx Power Request - */ - VOS_STATUS WDA_ProcessSetMaxTxPowerReq(tWDA_CbContext *pWDA, - tMaxTxPowerParams *MaxTxPowerParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL; - tWDA_ReqParams *pWdaParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - - wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc( - sizeof(WDI_SetMaxTxPowerParamsType)); - if(NULL == wdiSetMaxTxPowerParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(wdiSetMaxTxPowerParams); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - /* Copy.Max.Tx.Power Params to WDI structure */ - vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId, - MaxTxPowerParams->bssId, - sizeof(tSirMacAddr)); - vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr, - MaxTxPowerParams->selfStaMacAddr, - sizeof(tSirMacAddr)); - wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower = - MaxTxPowerParams->power; - wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ; - status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams, - (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in SET MAX TX Power REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, MaxTxPowerParams , 0) ; - } - return CONVERT_WDI2VOS_STATUS(status); - -} -#endif - -/* - * FUNCTION: WDA_SetMaxTxPowerPerBandCallBack - * send the response to PE with power value received from WDI - */ -void WDA_SetMaxTxPowerPerBandCallBack(WDI_SetMaxTxPowerPerBandRspMsg - *pwdiSetMaxTxPowerPerBandRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA = NULL; - tMaxTxPowerPerBandParams *pMxTxPwrPerBandParams = NULL; - - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s ", __func__); - if (NULL == pWdaParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return ; - } - pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext; - pMxTxPwrPerBandParams = (tMaxTxPowerPerBandParams*)pWdaParams->wdaMsgParam; - if ( NULL == pMxTxPwrPerBandParams ) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pMxTxPwrPerBandParams received NULL ", __func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return; - } - - /*need to free memory for the pointers used in the - WDA Process.Set Max Tx Power Req function*/ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - pMxTxPwrPerBandParams->power = pwdiSetMaxTxPowerPerBandRsp->ucPower; - - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_PER_BAND_RSP, - pMxTxPwrPerBandParams, 0); - - return; -} - -/* - * FUNCTION: WDA_ProcessSetMaxTxPowerPerBandReq - * Request to WDI to send set Max Tx Power Per band Request - */ - VOS_STATUS WDA_ProcessSetMaxTxPowerPerBandReq(tWDA_CbContext *pWDA, - tMaxTxPowerPerBandParams - *MaxTxPowerPerBandParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_SetMaxTxPowerPerBandParamsType *wdiSetMxTxPwrPerBandParams = NULL; - tWDA_ReqParams *pWdaParams = NULL; - - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s ", __func__); - - wdiSetMxTxPwrPerBandParams = vos_mem_malloc( - sizeof(WDI_SetMaxTxPowerPerBandParamsType)); - - if (NULL == wdiSetMxTxPwrPerBandParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)); - if (NULL == pWdaParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(wdiSetMxTxPwrPerBandParams); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - /* Copy.Max.Tx.Power.Per.Band Params to WDI structure */ - wdiSetMxTxPwrPerBandParams->wdiMaxTxPowerPerBandInfo.bandInfo = \ - MaxTxPowerPerBandParams->bandInfo; - wdiSetMxTxPwrPerBandParams->wdiMaxTxPowerPerBandInfo.ucPower = \ - MaxTxPowerPerBandParams->power; - wdiSetMxTxPwrPerBandParams->wdiReqStatusCB = NULL; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = (void *)MaxTxPowerPerBandParams; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMxTxPwrPerBandParams; - status = WDI_SetMaxTxPowerPerBandReq(wdiSetMxTxPwrPerBandParams, - WDA_SetMaxTxPowerPerBandCallBack, - pWdaParams); - if (IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in SET MAX TX Power REQ Params WDI API," - " free all the memory"); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - /* send response to UMAC*/ - WDA_SendMsg(pWDA, - WDA_SET_MAX_TX_POWER_PER_BAND_RSP, - MaxTxPowerPerBandParams, 0); - } - return CONVERT_WDI2VOS_STATUS(status); -} - -/* - * FUNCTION: WDA_SetTxPowerCallBack - * send the response to PE with power value received from WDI - */ -void WDA_SetTxPowerCallBack(WDI_SetTxPowerRspMsg * pwdiSetMaxTxPowerRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA = NULL; - tSirSetTxPowerReq *pTxPowerParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s ", __func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pTxPowerParams = (tSirSetTxPowerReq *)pWdaParams->wdaMsgParam; - if(NULL == pTxPowerParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pTxPowerParams received NULL " ,__func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; - } - - /*need to free memory for the pointers used in the - WDA Process.Set Max Tx Power Req function*/ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_SET_TX_POWER_RSP, pTxPowerParams , 0) ; - return; -} - -/* - * FUNCTION: WDA_ProcessSetTxPowerReq - * Request to WDI to send set Tx Power Request - */ - VOS_STATUS WDA_ProcessSetTxPowerReq(tWDA_CbContext *pWDA, - tSirSetTxPowerReq *txPowerParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_SetTxPowerParamsType *wdiSetTxPowerParams = NULL; - tWDA_ReqParams *pWdaParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s ", __func__); - - wdiSetTxPowerParams = (WDI_SetTxPowerParamsType *)vos_mem_malloc( - sizeof(WDI_SetTxPowerParamsType)); - if(NULL == wdiSetTxPowerParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(wdiSetTxPowerParams); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - wdiSetTxPowerParams->wdiTxPowerInfo.bssIdx = - txPowerParams->bssIdx; - wdiSetTxPowerParams->wdiTxPowerInfo.ucPower = - txPowerParams->mwPower; - wdiSetTxPowerParams->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = (void *)txPowerParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetTxPowerParams ; - status = WDI_SetTxPowerReq(wdiSetTxPowerParams, - (WDA_SetTxPowerRspCb)WDA_SetTxPowerCallBack, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in SET TX Power REQ Params WDI API, free all the memory "); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_SET_TX_POWER_RSP, txPowerParams , 0) ; - } - return CONVERT_WDI2VOS_STATUS(status); -} - -/* - * FUNCTION: WDA_SetP2PGONOAReqParamsCallback - * Free the memory. No need to send any response to PE in this case - */ -void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams); - - /* - * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ - * so just free the request param here - */ - return ; -} - -/* - * FUNCTION: WDA_ProcessSetP2PGONOAReq - * Request to WDI to set the P2P Group Owner Notice of Absence Req - */ -VOS_STATUS WDA_ProcessSetP2PGONOAReq(tWDA_CbContext *pWDA, - tP2pPsParams *pP2pPsConfigParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam = - (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetP2PGONOAReqParamsType)) ; - tWDA_ReqParams *pWdaParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiSetP2PGONOAReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(pP2pPsConfigParams); - vos_mem_free(wdiSetP2PGONOAReqParam); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps = - pP2pPsConfigParams->opp_ps; - wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow = - pP2pPsConfigParams->ctWindow; - wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucCount = - pP2pPsConfigParams->count; - wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uDuration = - pP2pPsConfigParams->duration; - wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uInterval = - pP2pPsConfigParams->interval; - wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uSingle_noa_duration = - pP2pPsConfigParams->single_noa_duration; - wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection = - pP2pPsConfigParams->psSelection; - - wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ; - /* Store msg pointer from PE, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pP2pPsConfigParams ; - - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ; - pWdaParams->pWdaContext = pWDA; - - status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam, - (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set P2P GO NOA Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status); - -} - -#ifdef FEATURE_WLAN_TDLS -/* - * FUNCTION: WDA_SetP2PGONOAReqParamsCallback - * Free the memory. No need to send any response to PE in this case - */ -void WDA_SetTDLSLinkEstablishReqParamsCallback(WDI_SetTdlsLinkEstablishReqResp *wdiSetTdlsLinkEstablishReqRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA = NULL; - tTdlsLinkEstablishParams *pTdlsLinkEstablishParams; - - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext; - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pTdlsLinkEstablishParams = (tTdlsLinkEstablishParams *)pWdaParams->wdaMsgParam ; - if( NULL == pTdlsLinkEstablishParams ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pTdlsLinkEstablishParams " - "received NULL " ,__func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - return ; - } - pTdlsLinkEstablishParams->status = CONVERT_WDI2SIR_STATUS( - wdiSetTdlsLinkEstablishReqRsp->wdiStatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - /* send response to UMAC*/ - WDA_SendMsg(pWDA, WDA_SET_TDLS_LINK_ESTABLISH_REQ_RSP, pTdlsLinkEstablishParams, 0) ; - - return ; -} - -VOS_STATUS WDA_ProcessSetTdlsLinkEstablishReq(tWDA_CbContext *pWDA, - tTdlsLinkEstablishParams *pTdlsLinkEstablishParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_SetTDLSLinkEstablishReqParamsType *wdiSetTDLSLinkEstablishReqParam = - (WDI_SetTDLSLinkEstablishReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetTDLSLinkEstablishReqParamsType)) ; - tWDA_ReqParams *pWdaParams = NULL; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiSetTDLSLinkEstablishReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(pTdlsLinkEstablishParams); - vos_mem_free(wdiSetTDLSLinkEstablishReqParam); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uStaIdx = - pTdlsLinkEstablishParams->staIdx; - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uIsResponder = - pTdlsLinkEstablishParams->isResponder; - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uUapsdQueues = - pTdlsLinkEstablishParams->uapsdQueues; - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uMaxSp = - pTdlsLinkEstablishParams->maxSp; - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uIsBufSta = - pTdlsLinkEstablishParams->isBufsta; - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uIsOffChannelSupported = - pTdlsLinkEstablishParams->isOffChannelSupported; - - vos_mem_copy(wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.validChannels, - pTdlsLinkEstablishParams->validChannels, - pTdlsLinkEstablishParams->validChannelsLen); - - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.validChannelsLen = - pTdlsLinkEstablishParams->validChannelsLen; - - vos_mem_copy(wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.validOperClasses, - pTdlsLinkEstablishParams->validOperClasses, - pTdlsLinkEstablishParams->validOperClassesLen); - wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.validOperClassesLen = - pTdlsLinkEstablishParams->validOperClassesLen; - - wdiSetTDLSLinkEstablishReqParam->wdiReqStatusCB = NULL ; - /* Store msg pointer from PE, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pTdlsLinkEstablishParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetTDLSLinkEstablishReqParam ; - pWdaParams->pWdaContext = pWDA; - - status = WDI_SetTDLSLinkEstablishReq(wdiSetTDLSLinkEstablishReqParam, - (WDI_SetTDLSLinkEstablishReqParamsRspCb) - WDA_SetTDLSLinkEstablishReqParamsCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set P2P GO NOA Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status); -} -#endif - - -#ifdef WLAN_FEATURE_VOWIFI_11R -/* - * FUNCTION: WDA_AggrAddTSReqCallback - * send ADD AGGREGATED TS RSP back to PE - */ -void WDA_AggrAddTSReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - tWDA_CbContext *pWDA; - tAggrAddTsParams *pAggrAddTsReqParams; - int i; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pWDA = pWdaParams->pWdaContext; - pAggrAddTsReqParams = (tAggrAddTsParams *)pWdaParams->wdaMsgParam ; - - for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ ) - { - pAggrAddTsReqParams->status[i] = (status) ; - } - WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ; - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - return ; -}/* WLAN_FEATURE_VOWIFI_11R */ -/* - * FUNCTION: WDA_ProcessAddTSReq - * Request to WDI to send an update with AGGREGATED ADD TS REQ params. - */ -VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA, - tAggrAddTsParams *pAggrAddTsReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - int i; - WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam; - tWDA_ReqParams *pWdaParams = NULL; - - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - wdiAggrAddTSReqParam = (WDI_AggrAddTSReqParamsType *)vos_mem_malloc( - sizeof(WDI_AggrAddTSReqParamsType)) ; - if(NULL == wdiAggrAddTSReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(pAggrAddTsReqParams); - vos_mem_free(wdiAggrAddTSReqParam); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx; - wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx = - pAggrAddTsReqParams->tspecIdx; - for( i = 0; i < WDI_MAX_NO_AC; i++ ) - { - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength = - pAggrAddTsReqParams->tspec[i].length; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.userPrio; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.psb = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.psb; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.aggregation = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.aggregation; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.accessPolicy = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.accessPolicy; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.direction = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.direction; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.tsid = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType = - pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule = - pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz = - pAggrAddTsReqParams->tspec[i].nomMsduSz; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz = - pAggrAddTsReqParams->tspec[i].maxMsduSz; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval = - pAggrAddTsReqParams->tspec[i].minSvcInterval; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval = - pAggrAddTsReqParams->tspec[i].maxSvcInterval; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval = - pAggrAddTsReqParams->tspec[i].inactInterval; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval = - pAggrAddTsReqParams->tspec[i].suspendInterval; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime = - pAggrAddTsReqParams->tspec[i].svcStartTime; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate = - pAggrAddTsReqParams->tspec[i].minDataRate; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate = - pAggrAddTsReqParams->tspec[i].meanDataRate; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate = - pAggrAddTsReqParams->tspec[i].peakDataRate; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz = - pAggrAddTsReqParams->tspec[i].maxBurstSz; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound = - pAggrAddTsReqParams->tspec[i].delayBound; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate = - pAggrAddTsReqParams->tspec[i].minPhyRate; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw = - pAggrAddTsReqParams->tspec[i].surplusBw; - wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime = - pAggrAddTsReqParams->tspec[i].mediumTime; - } - - /* TODO: tAggrAddTsParams doesn't have the following fields */ -#if 0 - wdiAggrAddTSReqParam->wdiTsInfo.ucUapsdFlags = - wdiAggrAddTSReqParam->wdiTsInfo.ucServiceInterval = - wdiAggrAddTSReqParam->wdiTsInfo.ucSuspendInterval = - wdiAggrAddTSReqParam->wdiTsInfo.ucDelayedInterval = -#endif - wdiAggrAddTSReqParam->wdiReqStatusCB = NULL ; - - /* Store ADD TS pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pAggrAddTsReqParams ; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ; - - pWdaParams->pWdaContext = pWDA; - - status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam, - (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in ADD TS REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - - /* send the failure response back to PE*/ - for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ ) - { - pAggrAddTsReqParams->status[i] = eHAL_STATUS_FAILURE ; - } - - WDA_SendMsg(pWdaParams->pWdaContext, WDA_AGGR_QOS_RSP, - (void *)pAggrAddTsReqParams , 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif -/* - * FUNCTION: WDA_EnterImpsReqCallback - * send Enter IMPS RSP back to PE - */ -void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , status) ; - return ; -} -/* - * FUNCTION: WDA_ProcessEnterImpsReq - * Request to WDI to Enter IMPS power state. - */ -VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Enter IMPS REQ WDI API, free all the memory " ); - WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_ExitImpsReqCallback - * send Exit IMPS RSP back to PE - */ -void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , (status)) ; - return ; -} -/* - * FUNCTION: WDA_ProcessExitImpsReq - * Request to WDI to Exit IMPS power state. - */ -VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Exit IMPS REQ WDI API, free all the memory " ); - WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_EnterBmpsRespCallback - * send Enter BMPS RSP back to PE - */ -void WDA_EnterBmpsRespCallback(WDI_EnterBmpsRspParamsType *pwdiEnterBmpsRsp, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tEnterBmpsParams *pEnterBmpsRspParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pEnterBmpsRspParams = (tEnterBmpsParams *)pWdaParams->wdaMsgParam; - - pEnterBmpsRspParams->bssIdx = pwdiEnterBmpsRsp->bssIdx; - pEnterBmpsRspParams->status = (pwdiEnterBmpsRsp->wdiStatus); - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams) ; - WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, (void *)pEnterBmpsRspParams , 0); - - return ; -} -/* - * FUNCTION: WDA_EnterBmpsReqCallback - * Free memory and send Enter BMPS RSP back to PE. - * Invoked when Enter BMPS REQ failed in WDI and no RSP callback is generated. - */ -void WDA_EnterBmpsReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tEnterBmpsParams *pEnterBmpsRspParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pEnterBmpsRspParams = (tEnterBmpsParams *)pWdaParams->wdaMsgParam; - pEnterBmpsRspParams->status = wdiStatus; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, (void *)pEnterBmpsRspParams, 0); - } - - return; -} -/* - * FUNCTION: WDA_ProcessEnterBmpsReq - * Request to WDI to Enter BMPS power state. - */ -VOS_STATUS WDA_ProcessEnterBmpsReq(tWDA_CbContext *pWDA, - tEnterBmpsParams *pEnterBmpsReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams; - tWDA_ReqParams *pWdaParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: invalid param", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType)); - if (NULL == wdiEnterBmpsReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , - CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ; - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)); - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiEnterBmpsReqParams); - WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , - CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ; - return VOS_STATUS_E_NOMEM; - } - wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx; - wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount; - wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod; - wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt; - // For ESE and 11R Roaming - wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod; - wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage; - wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable; - wdiEnterBmpsReqParams->wdiReqStatusCB = WDA_EnterBmpsReqCallback; - wdiEnterBmpsReqParams->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams; - pWdaParams->wdaMsgParam = pEnterBmpsReqParams; - pWdaParams->pWdaContext = pWDA; - status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams, - (WDI_EnterBmpsRspCb)WDA_EnterBmpsRespCallback, pWdaParams); - if (IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Enter BMPS REQ WDI API, free all the memory" ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ; - } - return CONVERT_WDI2VOS_STATUS(status); -} - - -static void WDA_SendExitBmpsRsp(tWDA_CbContext *pWDA, - WDI_Status wdiStatus, - tExitBmpsParams *pExitBmpsReqParams) -{ - pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ; - - WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ; -} - - -/* - * FUNCTION: WDA_ExitBmpsRespCallback - * send Exit BMPS RSP back to PE - */ -void WDA_ExitBmpsRespCallback(WDI_ExitBmpsRspParamsType *pwdiExitBmpsRsp, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tExitBmpsParams *pExitBmpsRspParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pExitBmpsRspParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam; - - pExitBmpsRspParams->bssIdx = pwdiExitBmpsRsp->bssIdx; - pExitBmpsRspParams->status = (pwdiExitBmpsRsp->wdiStatus); - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsRspParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_ExitBmpsReqCallback - * Free memory and send Exit BMPS RSP back to PE. - * Invoked when Exit BMPS REQ failed in WDI and no RSP callback is generated. - */ -void WDA_ExitBmpsReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tExitBmpsParams *pExitBmpsRspParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pExitBmpsRspParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam; - pExitBmpsRspParams->status = wdiStatus; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsRspParams, 0); - } - - return; -} -/* - * FUNCTION: WDA_ProcessExitBmpsReq - * Request to WDI to Exit BMPS power state. - */ -VOS_STATUS WDA_ProcessExitBmpsReq(tWDA_CbContext *pWDA, - tExitBmpsParams *pExitBmpsReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_ExitBmpsReqParamsType *wdiExitBmpsReqParams = - (WDI_ExitBmpsReqParamsType *)vos_mem_malloc( - sizeof(WDI_ExitBmpsReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiExitBmpsReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - WDA_SendExitBmpsRsp(pWDA, WDI_STATUS_MEM_FAILURE, pExitBmpsReqParams); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiExitBmpsReqParams); - return VOS_STATUS_E_NOMEM; - } - wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull; - - wdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx = pExitBmpsReqParams->bssIdx; - - wdiExitBmpsReqParams->wdiReqStatusCB = WDA_ExitBmpsReqCallback; - wdiExitBmpsReqParams->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pExitBmpsReqParams; - status = WDI_ExitBmpsReq(wdiExitBmpsReqParams, - (WDI_ExitBmpsRspCb)WDA_ExitBmpsRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Exit BMPS REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - WDA_SendExitBmpsRsp(pWDA, status, pExitBmpsReqParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_EnterUapsdRespCallback - * send Enter UAPSD RSP back to PE - */ -void WDA_EnterUapsdRespCallback( WDI_EnterUapsdRspParamsType *pwdiEnterUapsdRspParams, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tUapsdParams *pEnterUapsdRsqParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pEnterUapsdRsqParams = (tUapsdParams *)pWdaParams->wdaMsgParam; - - pEnterUapsdRsqParams->bssIdx = pwdiEnterUapsdRspParams->bssIdx; - pEnterUapsdRsqParams->status = (pwdiEnterUapsdRspParams->wdiStatus); - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdRsqParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_EnterUapsdReqCallback - * Free memory and send Enter UAPSD RSP back to PE. - * Invoked when Enter UAPSD REQ failed in WDI and no RSP callback is generated. - */ -void WDA_EnterUapsdReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tUapsdParams *pEnterUapsdRsqParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pEnterUapsdRsqParams = (tUapsdParams *)pWdaParams->wdaMsgParam; - pEnterUapsdRsqParams->status = wdiStatus; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdRsqParams, 0); - } - - return; -} -/* - * FUNCTION: WDA_ProcessEnterUapsdReq - * Request to WDI to Enter UAPSD power state. - */ -VOS_STATUS WDA_ProcessEnterUapsdReq(tWDA_CbContext *pWDA, - tUapsdParams *pEnterUapsdReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_EnterUapsdReqParamsType *wdiEnterUapsdReqParams = - (WDI_EnterUapsdReqParamsType *)vos_mem_malloc( - sizeof(WDI_EnterUapsdReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiEnterUapsdReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiEnterUapsdReqParams); - return VOS_STATUS_E_NOMEM; - } - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled = - pEnterUapsdReqParams->beDeliveryEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled = - pEnterUapsdReqParams->beTriggerEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkDeliveryEnabled = - pEnterUapsdReqParams->bkDeliveryEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkTriggerEnabled = - pEnterUapsdReqParams->bkTriggerEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViDeliveryEnabled = - pEnterUapsdReqParams->viDeliveryEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled = - pEnterUapsdReqParams->viTriggerEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled = - pEnterUapsdReqParams->voDeliveryEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled = - pEnterUapsdReqParams->voTriggerEnabled; - wdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx = pEnterUapsdReqParams->bssIdx; - - wdiEnterUapsdReqParams->wdiReqStatusCB = WDA_EnterUapsdReqCallback; - wdiEnterUapsdReqParams->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pEnterUapsdReqParams; - status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams, - (WDI_EnterUapsdRspCb)WDA_EnterUapsdRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Enter UAPSD REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_ExitUapsdRespCallback - * send Exit UAPSD RSP back to PE - */ -void WDA_ExitUapsdRespCallback(WDI_ExitUapsdRspParamsType *pwdiExitRspParam, void* pUserData) -{ - - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tExitUapsdParams *pExitUapsdRspParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pExitUapsdRspParams = (tExitUapsdParams *)pWdaParams->wdaMsgParam; - - pExitUapsdRspParams->bssIdx = pwdiExitRspParam->bssIdx; - pExitUapsdRspParams->status = (pwdiExitRspParam->wdiStatus); - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, (void *)pExitUapsdRspParams, 0) ; - return ; -} -/* - * FUNCTION: WDA_ExitUapsdReqCallback - * Free memory and send Exit UAPSD RSP back to PE. - * Invoked when Exit UAPSD REQ failed in WDI and no RSP callback is generated. - */ -void WDA_ExitUapsdReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tExitUapsdParams *pExitUapsdRspParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pExitUapsdRspParams = (tExitUapsdParams *)pWdaParams->wdaMsgParam; - pExitUapsdRspParams->status = wdiStatus; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, (void *)pExitUapsdRspParams, 0); - } - - return; -} -/* - * FUNCTION: WDA_ProcessExitUapsdReq - * Request to WDI to Exit UAPSD power state. - */ -VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA, - tExitUapsdParams *pExitUapsdParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - tWDA_ReqParams *pWdaParams ; - WDI_ExitUapsdReqParamsType *wdiExitUapsdReqParams = - (WDI_ExitUapsdReqParamsType *)vos_mem_malloc( - sizeof(WDI_ExitUapsdReqParamsType)) ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - - if(NULL == wdiExitUapsdReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiExitUapsdReqParams); - return VOS_STATUS_E_NOMEM; - } - - wdiExitUapsdReqParams->wdiExitUapsdInfo.bssIdx = pExitUapsdParams->bssIdx; - wdiExitUapsdReqParams->wdiReqStatusCB = WDA_ExitUapsdReqCallback; - wdiExitUapsdReqParams->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiExitUapsdReqParams; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pExitUapsdParams; - - status = WDI_ExitUapsdReq(wdiExitUapsdReqParams, (WDI_ExitUapsdRspCb)WDA_ExitUapsdRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Exit UAPSD REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - } - return CONVERT_WDI2VOS_STATUS(status) ; -} - -/* - * FUNCTION: WDA_SetPwrSaveCfgReqCallback - * - */ -void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - if( pWdaParams != NULL ) - { - if( pWdaParams->wdaWdiApiMsgParam != NULL ) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - } - if( pWdaParams->wdaMsgParam != NULL ) - { - vos_mem_free(pWdaParams->wdaMsgParam) ; - } - vos_mem_free(pWdaParams) ; - } - return ; -} -/* - * FUNCTION: WDA_ProcessSetPwrSaveCfgReq - * Request to WDI to set the power save params at start. - */ -VOS_STATUS WDA_ProcessSetPwrSaveCfgReq(tWDA_CbContext *pWDA, - tSirPowerSaveCfg *pPowerSaveCfg) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - tHalCfg *tlvStruct = NULL ; - tANI_U8 *tlvStructStart = NULL ; - v_PVOID_t *configParam; - tANI_U32 configParamSize; - tANI_U32 *configDataValue; - WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg; - tWDA_ReqParams *pWdaParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if ((NULL == pWDA) || (NULL == pPowerSaveCfg)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: invalid param", __func__); - VOS_ASSERT(0); - vos_mem_free(pPowerSaveCfg); - return VOS_STATUS_E_FAILURE; - } - wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType)); - if (NULL == wdiPowerSaveCfg) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pPowerSaveCfg); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiPowerSaveCfg); - vos_mem_free(pPowerSaveCfg); - return VOS_STATUS_E_NOMEM; - } - configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG; - configParam = vos_mem_malloc(configParamSize); - if(NULL == configParam) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams); - vos_mem_free(wdiPowerSaveCfg); - vos_mem_free(pPowerSaveCfg); - return VOS_STATUS_E_NOMEM; - } - vos_mem_set(configParam, configParamSize, 0); - wdiPowerSaveCfg->pConfigBuffer = configParam; - tlvStruct = (tHalCfg *)configParam; - tlvStructStart = (tANI_U8 *)configParam; - /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */ - tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */ - tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */ - tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */ - tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */ - tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */ - tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */ - tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */ - tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */ - tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */ - tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */ - tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD; - tlvStruct->length = sizeof(tANI_U32); - configDataValue = (tANI_U32 *)(tlvStruct + 1); - *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod; - tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct - + sizeof(tHalCfg) + tlvStruct->length)) ; - wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ; - wdiPowerSaveCfg->wdiReqStatusCB = NULL; - /* store Params pass it to WDI */ - pWdaParams->wdaMsgParam = configParam; - pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg; - pWdaParams->pWdaContext = pWDA; - status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg, - (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set Pwr Save CFG REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - } - vos_mem_free(pPowerSaveCfg); - return CONVERT_WDI2VOS_STATUS(status); -} -/* - * FUNCTION: WDA_SetUapsdAcParamsRespCallback - * - */ -void WDA_SetUapsdAcParamsRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - - return ; -} -/* - * FUNCTION: WDA_SetUapsdAcParamsReqCallback - * Free memory. - * Invoked when SetUAPSDACParams REQ failed in WDI and no RSP callback is generated. - */ -void WDA_SetUapsdAcParamsReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_SetUapsdAcParamsReq - * Request to WDI to set the UAPSD params for an ac (sta mode). - */ -VOS_STATUS WDA_SetUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, - tUapsdInfo *pUapsdInfo) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - tWDA_CbContext *pWDA = NULL ; - WDI_SetUapsdAcParamsReqParamsType *wdiUapsdParams = - (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetUapsdAcParamsReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiUapsdParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiUapsdParams); - return VOS_STATUS_E_NOMEM; - } - wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac; - wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval; - wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval; - wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx; - wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval; - wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up; - wdiUapsdParams->wdiReqStatusCB = WDA_SetUapsdAcParamsReqCallback; - wdiUapsdParams->pUserData = pWdaParams; - - pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext ); - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pUapsdInfo; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams; - status = WDI_SetUapsdAcParamsReq(wdiUapsdParams, - (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set UAPSD params REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - } - if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status)) - return VOS_STATUS_SUCCESS; - else - return VOS_STATUS_E_FAILURE; - -} -/* - * FUNCTION: WDA_ClearUapsdAcParamsReq - * Currently the WDA API is a NOP. It has been added for symmetry & Also it was - * decided that the if the UPASD parameters change, FW would get a exit UAPSD - * and again enter the UPASD with the modified params. Hence the disable - * function was kept empty. - * - */ -VOS_STATUS WDA_ClearUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, wpt_uint8 ac) -{ - /* do nothing */ - return VOS_STATUS_SUCCESS; -} -/* - * FUNCTION: WDA_UpdateUapsdParamsRespCallback - * - */ -void WDA_UpdateUapsdParamsRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_UpdateUapsdParamsRespCallback invoked " ); - return ; -} -/* - * FUNCTION: WDA_UpdateUapsdParamsReqCallback - * Free memory. - * Invoked when UpdateUAPSDParams REQ failed in WDI and no RSP callback is generated. - */ -void WDA_UpdateUapsdParamsReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_UpdateUapsdParamsReq - * Request to WDI to update UAPSD params (in softAP mode) for a station. - */ -VOS_STATUS WDA_UpdateUapsdParamsReq(tWDA_CbContext *pWDA, - tUpdateUapsdParams* pUpdateUapsdInfo) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams = - (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc( - sizeof(WDI_UpdateUapsdReqParamsType)) ; - tWDA_ReqParams *pWdaParams = NULL; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiUpdateUapsdParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen; - wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx; - wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask; - wdiUpdateUapsdParams->wdiReqStatusCB = WDA_UpdateUapsdParamsReqCallback; - wdiUpdateUapsdParams->pUserData = pWdaParams; - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pUpdateUapsdInfo); - vos_mem_free(wdiUpdateUapsdParams); - return VOS_STATUS_E_NOMEM; - } - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pUpdateUapsdInfo; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams; - pWdaParams->pWdaContext = pWDA; - - wstatus = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams, - (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsRespCallback, - pWdaParams); - - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set UAPSD params REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return status; -} -/* - * FUNCTION: WDA_ConfigureRxpFilterRespCallback - * - */ -void WDA_ConfigureRxpFilterRespCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(WDI_STATUS_SUCCESS != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: RXP config filter failure", __func__ ); - } - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - return ; -} -/* - * FUNCTION: WDA_ConfigureRxpFilterReqCallback - * Free memory. - * Invoked when ConfigureRXPFilter REQ failed in WDI and no RSP callback is generated. - */ -void WDA_ConfigureRxpFilterReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessConfigureRxpFilterReq - * - */ -VOS_STATUS WDA_ProcessConfigureRxpFilterReq(tWDA_CbContext *pWDA, - tSirWlanSetRxpFilters *pWlanSuspendParam) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_ConfigureRxpFilterReqParamsType *wdiRxpFilterParams = - (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc( - sizeof(WDI_ConfigureRxpFilterReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiRxpFilterParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pWlanSuspendParam); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiRxpFilterParams); - vos_mem_free(pWlanSuspendParam); - return VOS_STATUS_E_NOMEM; - } - wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter = - pWlanSuspendParam->setMcstBcstFilter; - wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting = - pWlanSuspendParam->configuredMcstBcstFilterSetting; - - wdiRxpFilterParams->wdiReqStatusCB = WDA_ConfigureRxpFilterReqCallback; - wdiRxpFilterParams->pUserData = pWdaParams; - - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pWlanSuspendParam; - pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams; - wstatus = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams, - (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in configure RXP filter REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return status; -} -/* - * FUNCTION: WDA_WdiIndicationCallback - * - */ -void WDA_WdiIndicationCallback( WDI_Status wdiStatus, - void* pUserData) -{ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); -} -/* - * FUNCTION: WDA_ProcessWlanSuspendInd - * - */ -VOS_STATUS WDA_ProcessWlanSuspendInd(tWDA_CbContext *pWDA, - tSirWlanSuspendParam *pWlanSuspendParam) -{ - WDI_Status wdiStatus; - WDI_SuspendParamsType wdiSuspendParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting = - pWlanSuspendParam->configuredMcstBcstFilterSetting; - wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback; - wdiSuspendParams.pUserData = pWDA; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__func__, pWlanSuspendParam->configuredMcstBcstFilterSetting); - wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams); - if(WDI_STATUS_PENDING == wdiStatus) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Pending received for %s:%d ",__func__,__LINE__ ); - } - else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in %s:%d ",__func__,__LINE__ ); - } - vos_mem_free(pWlanSuspendParam); - return CONVERT_WDI2VOS_STATUS(wdiStatus) ; -} - -#ifdef WLAN_FEATURE_11W -/* - * FUNCTION: WDA_ProcessExcludeUnecryptInd - * - */ -VOS_STATUS WDA_ProcessExcludeUnecryptInd(tWDA_CbContext *pWDA, - tSirWlanExcludeUnencryptParam *pExclUnencryptParam) -{ - WDI_Status wdiStatus; - WDI_ExcludeUnencryptIndType wdiExclUnencryptParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s ", __func__); - - wdiExclUnencryptParams.bExcludeUnencrypt = pExclUnencryptParam->excludeUnencrypt; - vos_mem_copy(wdiExclUnencryptParams.bssid, pExclUnencryptParam->bssId, - sizeof(tSirMacAddr)); - - wdiExclUnencryptParams.wdiReqStatusCB = NULL; - wdiExclUnencryptParams.pUserData = pWDA; - - wdiStatus = WDI_ExcludeUnencryptedInd(&wdiExclUnencryptParams); - if(WDI_STATUS_PENDING == wdiStatus) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Pending received for %s:%d ", __func__, __LINE__ ); - } - else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in %s:%d ", __func__, __LINE__ ); - } - vos_mem_free(pExclUnencryptParam); - return CONVERT_WDI2VOS_STATUS(wdiStatus) ; -} -#endif - -/* - * FUNCTION: WDA_ProcessWlanResumeCallback - * - */ -void WDA_ProcessWlanResumeCallback( - WDI_SuspendResumeRspParamsType *resumeRspParams, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Process Wlan Resume failure", __func__ ); - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - return ; -} -/* - * FUNCTION: WDA_ProcessWlanResumeReq - * - */ -VOS_STATUS WDA_ProcessWlanResumeReq(tWDA_CbContext *pWDA, - tSirWlanResumeParam *pWlanResumeParam) -{ - WDI_Status wdiStatus; - WDI_ResumeParamsType *wdiResumeParams = - (WDI_ResumeParamsType *)vos_mem_malloc( - sizeof(WDI_ResumeParamsType) ) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiResumeParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiResumeParams); - return VOS_STATUS_E_NOMEM; - } - wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting = - pWlanResumeParam->configuredMcstBcstFilterSetting; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__func__, pWlanResumeParam->configuredMcstBcstFilterSetting); - wdiResumeParams->wdiReqStatusCB = NULL; - pWdaParams->wdaMsgParam = pWlanResumeParam; - pWdaParams->wdaWdiApiMsgParam = wdiResumeParams; - pWdaParams->pWdaContext = pWDA; - wdiStatus = WDI_HostResumeReq(wdiResumeParams, - (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Host Resume REQ WDI API, free all the memory " ); - VOS_ASSERT(0); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(wdiStatus) ; -} - -/* - * FUNCTION: WDA_SetBeaconFilterRespCallback - * - */ -void WDA_SetBeaconFilterRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /* - * No respone required for SetBeaconFilter req so just free the request - * param here - */ - - return ; -} -/* - * FUNCTION: WDA_SetBeaconFilterReqCallback - * Free memory. - * Invoked when SetBeaconFilter REQ failed in WDI and no RSP callback is generated. - */ -void WDA_SetBeaconFilterReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_SetBeaconFilterReq - * Request to WDI to send the beacon filtering related information. - */ -VOS_STATUS WDA_SetBeaconFilterReq(tWDA_CbContext *pWDA, - tBeaconFilterMsg* pBeaconFilterInfo) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - tANI_U8 *dstPtr, *srcPtr; - tANI_U8 filterLength; - WDI_BeaconFilterReqParamsType *wdiBeaconFilterInfo = - (WDI_BeaconFilterReqParamsType *)vos_mem_malloc( - sizeof(WDI_BeaconFilterReqParamsType) ) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiBeaconFilterInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiBeaconFilterInfo); - return VOS_STATUS_E_NOMEM; - } - wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval = - pBeaconFilterInfo->beaconInterval; - wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo = - pBeaconFilterInfo->capabilityInfo; - wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask = - pBeaconFilterInfo->capabilityMask; - wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum; - - //Fill the BssIdx - wdiBeaconFilterInfo->wdiBeaconFilterInfo.bssIdx = pBeaconFilterInfo->bssIdx; - - //Fill structure with info contained in the beaconFilterTable - dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType); - srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg); - filterLength = wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe); - if(WDI_BEACON_FILTER_LEN < filterLength) - { - filterLength = WDI_BEACON_FILTER_LEN; - } - vos_mem_copy(dstPtr, srcPtr, filterLength); - wdiBeaconFilterInfo->wdiReqStatusCB = WDA_SetBeaconFilterReqCallback; - wdiBeaconFilterInfo->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiBeaconFilterInfo; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pBeaconFilterInfo; - - status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo, - (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set Beacon Filter REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_RemBeaconFilterRespCallback - * - */ -void WDA_RemBeaconFilterRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_RemBeaconFilterRespCallback invoked " ); - return ; -} -/* - * FUNCTION: WDA_RemBeaconFilterReqCallback - * Free memory. - * Invoked when RemBeaconFilter REQ failed in WDI and no RSP callback is generated. - */ -void WDA_RemBeaconFilterReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} - // TODO: PE does not have this feature for now implemented, - // but the support for removing beacon filter exists between - // HAL and FW. This function can be called whenever PE defines - // a new message for beacon filter removal -/* - * FUNCTION: WDA_RemBeaconFilterReq - * Request to WDI to send the removal of beacon filtering related information. - */ -VOS_STATUS WDA_RemBeaconFilterReq(tWDA_CbContext *pWDA, - tRemBeaconFilterMsg* pBeaconFilterInfo) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo = - (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc( - sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ; - tWDA_ReqParams *pWdaParams ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiBeaconFilterInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiBeaconFilterInfo); - vos_mem_free(pBeaconFilterInfo); - return VOS_STATUS_E_NOMEM; - } - - wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount = - pBeaconFilterInfo->ucIeCount; - //Fill structure with info contained in the ucRemIeId - vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId, - pBeaconFilterInfo->ucRemIeId, - wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount); - wdiBeaconFilterInfo->wdiReqStatusCB = WDA_RemBeaconFilterReqCallback; - wdiBeaconFilterInfo->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pBeaconFilterInfo; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo; - - pWdaParams->pWdaContext = pWDA; - - wstatus = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo, - (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Remove Beacon Filter REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return status; -} -/* - * FUNCTION: WDA_SetRSSIThresholdsRespCallback - * - */ -void WDA_SetRSSIThresholdsRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - return ; -} -/* - * FUNCTION: WDA_SetRSSIThresholdsReqCallback - * Free memory. - * Invoked when SetRSSIThresholds REQ failed in WDI and no RSP callback is generated. - */ -void WDA_SetRSSIThresholdsReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_SetRSSIThresholdsReq - * Request to WDI to set the RSSI thresholds (sta mode). - */ -VOS_STATUS WDA_SetRSSIThresholdsReq(tpAniSirGlobal pMac, tSirRSSIThresholds *pBmpsThresholds) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - tWDA_CbContext *pWDA = NULL ; - v_PVOID_t pVosContext = NULL; - WDI_SetRSSIThresholdsReqParamsType *wdiRSSIThresholdsInfo = - (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetRSSIThresholdsReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiRSSIThresholdsInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiRSSIThresholdsInfo); - return VOS_STATUS_E_NOMEM; - } - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify; - wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify; - wdiRSSIThresholdsInfo->wdiReqStatusCB = WDA_SetRSSIThresholdsReqCallback; - wdiRSSIThresholdsInfo->pUserData = pWdaParams; - pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac); - pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext ); - - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pBmpsThresholds; - wstatus = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo, - (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set RSSI thresholds REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - return status; - -}/*WDA_SetRSSIThresholdsReq*/ -/* - * FUNCTION: WDA_HostOffloadRespCallback - * - */ -void WDA_HostOffloadRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams) ; - - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_HostOffloadRespCallback invoked " ); - return ; -} -/* - * FUNCTION: WDA_HostOffloadReqCallback - * Free memory. - * Invoked when HostOffload REQ failed in WDI and no RSP callback is generated. - */ -void WDA_HostOffloadReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid pWdaParams pointer", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessHostOffloadReq - * Request to WDI to set the filter to minimize unnecessary host wakeup due - * to broadcast traffic (sta mode). - */ -VOS_STATUS WDA_ProcessHostOffloadReq(tWDA_CbContext *pWDA, - tSirHostOffloadReq *pHostOffloadParams) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_HostOffloadReqParamsType *wdiHostOffloadInfo = - (WDI_HostOffloadReqParamsType *)vos_mem_malloc( - sizeof(WDI_HostOffloadReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s: offloadType=%x" ,__func__, pHostOffloadParams->offloadType); - - if(NULL == wdiHostOffloadInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiHostOffloadInfo); - vos_mem_free(pHostOffloadParams); - return VOS_STATUS_E_NOMEM; - } - - wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType = - pHostOffloadParams->offloadType; - wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable = - pHostOffloadParams->enableOrDisable; - - vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.bssId, - pHostOffloadParams->bssId, sizeof(wpt_macAddr)); - - switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType) - { - case SIR_IPV4_ARP_REPLY_OFFLOAD: - vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv4Addr, - pHostOffloadParams->params.hostIpv4Addr, - 4); - break; - case SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD: - vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr, - pHostOffloadParams->params.hostIpv6Addr, - 16); - break; - case SIR_IPV6_NS_OFFLOAD: - vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr, - pHostOffloadParams->params.hostIpv6Addr, - 16); - -#ifdef WLAN_NS_OFFLOAD - if(pHostOffloadParams->nsOffloadInfo.srcIPv6AddrValid) - { - vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6Addr, - pHostOffloadParams->nsOffloadInfo.srcIPv6Addr, - 16); - wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 1; - } - else - { - wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 0; - } - - vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfIPv6Addr, - pHostOffloadParams->nsOffloadInfo.selfIPv6Addr, - 16); - vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfMacAddr, - pHostOffloadParams->nsOffloadInfo.selfMacAddr, - 6); - - //Only two are supported so let's go through them without a loop - if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[0]) - { - vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1, - pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[0], - 16); - wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 1; - } - else - { - wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 0; - } - - if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[1]) - { - vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2, - pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[1], - 16); - wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 1; - } - else - { - wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 0; - } - wdiHostOffloadInfo->wdiNsOffloadParams.slotIdx = - pHostOffloadParams->nsOffloadInfo.slotIdx; - break; -#endif //WLAN_NS_OFFLOAD - default: - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "No Handling for Offload Type %x in WDA " - , wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType); - //WDA_VOS_ASSERT(0) ; - } - } - wdiHostOffloadInfo->wdiReqStatusCB = WDA_HostOffloadReqCallback; - wdiHostOffloadInfo->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pHostOffloadParams; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo; - pWdaParams->pWdaContext = pWDA; - - - wstatus = WDI_HostOffloadReq(wdiHostOffloadInfo, - (WDI_HostOffloadCb)WDA_HostOffloadRespCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in host offload REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams) ; - } - return status; - -}/*WDA_HostOffloadReq*/ -/* - * FUNCTION: WDA_KeepAliveRespCallback - * - */ -void WDA_KeepAliveRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_KeepAliveRespCallback invoked " ); - return ; -} -/* - * FUNCTION: WDA_KeepAliveReqCallback - * Free memory. - * Invoked when KeepAlive REQ failed in WDI and no RSP callback is generated. - */ -void WDA_KeepAliveReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessKeepAliveReq - * Request to WDI to send Keep Alive packets to minimize unnecessary host - * wakeup due to broadcast traffic (sta mode). - */ -VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA, - tSirKeepAliveReq *pKeepAliveParams) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_KeepAliveReqParamsType *wdiKeepAliveInfo = - (WDI_KeepAliveReqParamsType *)vos_mem_malloc( - sizeof(WDI_KeepAliveReqParamsType)) ; - tWDA_ReqParams *pWdaParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiKeepAliveInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pKeepAliveParams); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiKeepAliveInfo); - vos_mem_free(pKeepAliveParams); - return VOS_STATUS_E_NOMEM; - } - - wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType = - pKeepAliveParams->packetType; - wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod = - pKeepAliveParams->timePeriod; - - vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.bssId, - pKeepAliveParams->bssId, - sizeof(wpt_macAddr)); - - if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP) - { - vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr, - pKeepAliveParams->hostIpv4Addr, - SIR_IPV4_ADDR_LEN); - vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr, - pKeepAliveParams->destIpv4Addr, - SIR_IPV4_ADDR_LEN); - vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr, - pKeepAliveParams->destMacAddr, - SIR_MAC_ADDR_LEN); - } - else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT) - { - vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr, - SIR_IPV4_ADDR_LEN, - 0); - vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr, - SIR_IPV4_ADDR_LEN, - 0); - vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr, - SIR_MAC_ADDR_LEN, - 0); - } - wdiKeepAliveInfo->wdiReqStatusCB = WDA_KeepAliveReqCallback; - wdiKeepAliveInfo->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pKeepAliveParams; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo; - pWdaParams->pWdaContext = pWDA; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d", - wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0], - wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1], - wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2], - wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d", - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA DMAC : %d:%d:%d:%d:%d:%d", - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4], - wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "TimePeriod %d PacketType %d", - wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod, - wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType); - wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo, - (WDI_KeepAliveCb)WDA_KeepAliveRespCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Keep Alive REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return status; - -}/*WDA_KeepAliveReq*/ -/* - * FUNCTION: WDA_WowlAddBcPtrnRespCallback - * - */ -void WDA_WowlAddBcPtrnRespCallback( - WDI_WowlAddBcPtrnRspParamsType *pWdiWowlAddBcstPtrRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams) ; - return ; -} -/* - * FUNCTION: WDA_WowlAddBcPtrnReqCallback - * Free memory. - * Invoked when WOWLAddBCPTRN REQ failed in WDI and no RSP callback is generated. - */ -void WDA_WowlAddBcPtrnReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} - -/* - * FUNCTION: WDA_ProcessWowlAddBcPtrnReq - * Request to WDI to add WOWL Bcast pattern - */ -VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA, - tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo = - (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc( - sizeof(WDI_WowlAddBcPtrnReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiWowlAddBcPtrnInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiWowlAddBcPtrnInfo); - return VOS_STATUS_E_NOMEM; - } - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId = - pWowlAddBcPtrnParams->ucPatternId; - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset = - pWowlAddBcPtrnParams->ucPatternByteOffset; - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize = - pWowlAddBcPtrnParams->ucPatternMaskSize; - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize = - pWowlAddBcPtrnParams->ucPatternSize; - if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE) - { - vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern, - pWowlAddBcPtrnParams->ucPattern, - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize); - vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask, - pWowlAddBcPtrnParams->ucPatternMask, - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize); - } - else - { - vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern, - pWowlAddBcPtrnParams->ucPattern, - WDI_WOWL_BCAST_PATTERN_MAX_SIZE); - vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask, - pWowlAddBcPtrnParams->ucPatternMask, - WDI_WOWL_BCAST_PATTERN_MAX_SIZE); - - vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt, - pWowlAddBcPtrnParams->ucPatternExt, - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE); - vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt, - pWowlAddBcPtrnParams->ucPatternMaskExt, - wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE); - } - - vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.bssId, - pWowlAddBcPtrnParams->bssId, sizeof(wpt_macAddr)); - - wdiWowlAddBcPtrnInfo->wdiReqStatusCB = WDA_WowlAddBcPtrnReqCallback; - wdiWowlAddBcPtrnInfo->pUserData = pWdaParams; - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams; - wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo, - (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - return status; - -}/*WDA_ProcessWowlAddBcPtrnReq*/ -/* - * FUNCTION: WDA_WowlDelBcPtrnRespCallback - * - */ -void WDA_WowlDelBcPtrnRespCallback( - WDI_WowlDelBcPtrnRspParamsType *pWdiWowlDelBcstPtrRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams) ; - return ; -} -/* - * FUNCTION: WDA_WowlDelBcPtrnReqCallback - * Free memory. - * Invoked when WOWLDelBCPTRN REQ failed in WDI and no RSP callback is generated. - */ -void WDA_WowlDelBcPtrnReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessWowlDelBcPtrnReq - * Request to WDI to delete WOWL Bcast pattern - */ -VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA, - tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo = - (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc( - sizeof(WDI_WowlDelBcPtrnReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiWowlDelBcPtrnInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiWowlDelBcPtrnInfo); - return VOS_STATUS_E_NOMEM; - } - wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId = - pWowlDelBcPtrnParams->ucPatternId; - - vos_mem_copy(wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.bssId, - pWowlDelBcPtrnParams->bssId, sizeof(wpt_macAddr)); - - wdiWowlDelBcPtrnInfo->wdiReqStatusCB = WDA_WowlDelBcPtrnReqCallback; - wdiWowlDelBcPtrnInfo->pUserData = pWdaParams; - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams; - wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo, - (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - return status; - -}/*WDA_ProcessWowlDelBcPtrnReq*/ -/* - * FUNCTION: WDA_WowlEnterRespCallback - * - */ -void WDA_WowlEnterRespCallback(WDI_WowlEnterRspParamsType *pwdiWowlEnterRspParam, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSirHalWowlEnterParams *pWowlEnterParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ; - pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ; - - pWowlEnterParams->bssIdx = pwdiWowlEnterRspParam->bssIdx; - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - pWowlEnterParams->status = - (pwdiWowlEnterRspParam->status); - WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ; - return ; -} -/* - * FUNCTION: WDA_WowlEnterReqCallback - * Free memory and send WOWL Enter RSP back to PE. - * Invoked when WOWL Enter REQ failed in WDI and no RSP callback is generated. - */ -void WDA_WowlEnterReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSirHalWowlEnterParams *pWowlEnterParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam; - pWowlEnterParams->status = wdiStatus; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0); - } - - return; -} -/* - * FUNCTION: WDA_ProcessWowlEnterReq - * Request to WDI to enter WOWL - */ -VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA, - tSirHalWowlEnterParams *pWowlEnterParams) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_WowlEnterReqParamsType *wdiWowlEnterInfo = - (WDI_WowlEnterReqParamsType *)vos_mem_malloc( - sizeof(WDI_WowlEnterReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiWowlEnterInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiWowlEnterInfo); - return VOS_STATUS_E_NOMEM; - } - - vos_mem_zero(pWdaParams, sizeof(tWDA_ReqParams)); - - vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn, - pWowlEnterParams->magicPtrn, - sizeof(tSirMacAddr)); - wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable = - pWowlEnterParams->ucMagicPktEnable; - wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable = - pWowlEnterParams->ucPatternFilteringEnable; - wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable = - pWowlEnterParams->ucUcastPatternFilteringEnable; - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv = - pWowlEnterParams->ucWowChnlSwitchRcv; - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv = - pWowlEnterParams->ucWowDeauthRcv; - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv = - pWowlEnterParams->ucWowDisassocRcv; - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons = - pWowlEnterParams->ucWowMaxMissedBeacons; - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec = - pWowlEnterParams->ucWowMaxSleepUsec; -#ifdef WLAN_WAKEUP_EVENTS - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable = - pWowlEnterParams->ucWoWEAPIDRequestEnable; - - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable = - pWowlEnterParams->ucWoWEAPOL4WayEnable; - - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch = - pWowlEnterParams->ucWowNetScanOffloadMatch; - - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError = - pWowlEnterParams->ucWowGTKRekeyError; - - wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss = - pWowlEnterParams->ucWoWBSSConnLoss; -#endif // WLAN_WAKEUP_EVENTS - - wdiWowlEnterInfo->wdiWowlEnterInfo.bssIdx = - pWowlEnterParams->bssIdx; - - wdiWowlEnterInfo->wdiReqStatusCB = WDA_WowlEnterReqCallback; - wdiWowlEnterInfo->pUserData = pWdaParams; - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pWowlEnterParams; - wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo, - (WDI_WowlEnterReqCb)WDA_WowlEnterRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Wowl enter REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - return status; - -}/*WDA_ProcessWowlEnterReq*/ -/* - * FUNCTION: WDA_WowlExitRespCallback - * - */ -void WDA_WowlExitRespCallback( WDI_WowlExitRspParamsType *pwdiWowlExitRsp, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSirHalWowlExitParams *pWowlExitParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ; - pWowlExitParams = (tSirHalWowlExitParams *)pWdaParams->wdaMsgParam ; - - pWowlExitParams->bssIdx = pwdiWowlExitRsp->bssIdx; - pWowlExitParams->status = (pwdiWowlExitRsp->status); - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, (void *)pWowlExitParams, 0) ; - return ; -} -/* - * FUNCTION: WDA_WowlExitReqCallback - * Free memory and send WOWL Exit RSP back to PE. - * Invoked when WOWL Exit REQ failed in WDI and no RSP callback is generated. - */ -void WDA_WowlExitReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tSirHalWowlExitParams *pWowlExitParams; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - pWowlExitParams = (tSirHalWowlExitParams *)pWdaParams->wdaMsgParam; - pWowlExitParams->status = wdiStatus; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, (void *)pWowlExitParams, 0); - } - - return; -} -/* - * FUNCTION: WDA_ProcessWowlExitReq - * Request to WDI to add WOWL Bcast pattern - */ -VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA, - tSirHalWowlExitParams *pWowlExitParams) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_WowlExitReqParamsType *wdiWowlExitInfo = - (WDI_WowlExitReqParamsType *)vos_mem_malloc( - sizeof(WDI_WowlExitReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiWowlExitInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiWowlExitInfo); - return VOS_STATUS_E_NOMEM; - } - - wdiWowlExitInfo->wdiWowlExitInfo.bssIdx = - pWowlExitParams->bssIdx; - - wdiWowlExitInfo->wdiReqStatusCB = WDA_WowlExitReqCallback; - wdiWowlExitInfo->pUserData = pWdaParams; - - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiWowlExitInfo; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pWowlExitParams; - - wstatus = WDI_WowlExitReq(wdiWowlExitInfo, - (WDI_WowlExitReqCb)WDA_WowlExitRespCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Wowl exit REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams) ; - } - return status; -}/*WDA_ProcessWowlExitReq*/ -/* - * FUNCTION: WDA_IsHwFrameTxTranslationCapable - * Request to WDI to determine whether a given station is capable of - * using HW-based frame translation - */ -v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx, - tANI_U8 staIdx) -{ - return WDI_IsHwFrameTxTranslationCapable(staIdx); -} -/* - * FUNCTION: WDA_NvDownloadReqCallback - * send NV Download RSP back to PE - */ -void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams, - void* pUserData) -{ - - tWDA_ReqParams *pWdaParams= ( tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pWDA = pWdaParams->pWdaContext; - - /*Cleaning */ - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - - vos_WDAComplete_cback(pWDA->pVosContext); - return ; -} -/* - * FUNCTION: WDA_ProcessNvDownloadReq - * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory. - */ -VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext) -{ - /* Initialize the local Variables*/ - tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - v_VOID_t *pNvBuffer=NULL; - v_SIZE_t bufferSize = 0; - WDI_Status status = WDI_STATUS_E_FAILURE; - WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL; - tWDA_ReqParams *pWdaParams ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - - /* Get the NV structure base address and size from VOS */ - vos_nv_getNVEncodedBuffer(&pNvBuffer,&bufferSize); - - wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc( - sizeof(WDI_NvDownloadReqParamsType)) ; - if(NULL == wdiNvDownloadReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - /* Copy Params to wdiNvDownloadReqParam*/ - wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer; - wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize; - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiNvDownloadReqParam); - return VOS_STATUS_E_NOMEM; - } - - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ; - pWdaParams->wdaMsgParam = NULL; - pWdaParams->pWdaContext = pWDA; - - - wdiNvDownloadReqParam->wdiReqStatusCB = NULL ; - - status = WDI_NvDownloadReq(wdiNvDownloadReqParam, - (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in NV Download REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_FlushAcReqCallback - * send Flush AC RSP back to TL - */ -void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData) -{ - vos_msg_t wdaMsg = {0} ; - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tFlushACReq *pFlushACReqParams; - tFlushACRsp *pFlushACRspParams; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam; - pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp)); - if(NULL == pFlushACRspParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pWdaParams); - return ; - } - vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp)); - pFlushACRspParams->mesgLen = sizeof(tFlushACRsp); - pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP; - pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId; - pFlushACRspParams->ucTid = pFlushACReqParams->ucTid; - pFlushACRspParams->status = (status) ; - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - wdaMsg.type = WDA_TL_FLUSH_AC_RSP ; - wdaMsg.bodyptr = (void *)pFlushACRspParams; - // POST message to TL - vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg); - - return ; -} -/* - * FUNCTION: WDA_ProcessFlushAcReq - * Request to WDI to Update the DELBA REQ params. - */ -VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA, - tFlushACReq *pFlushAcReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_FlushAcReqParamsType *wdiFlushAcReqParam = - (WDI_FlushAcReqParamsType *)vos_mem_malloc( - sizeof(WDI_FlushAcReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - if(NULL == wdiFlushAcReqParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiFlushAcReqParam); - return VOS_STATUS_E_NOMEM; - } - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId; - wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid; - wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen; - wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType; - /* Store Flush AC pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pFlushAcReqParams; - pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam; - status = WDI_FlushAcReq(wdiFlushAcReqParam, - (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Flush AC REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - //TODO: respond to TL with failure - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_BtAmpEventRespCallback - * - */ -void WDA_BtAmpEventRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - WDI_BtAmpEventParamsType *wdiBtAmpEventParam; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam; - if(BTAMP_EVENT_CONNECTION_TERMINATED == - wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType) - { - pWDA->wdaAmpSessionOn = VOS_FALSE; - } - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /* - * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request - * param here - */ - return ; -} -/* - * FUNCTION: WDA_BtAmpEventReqCallback - * Free memory. - * Invoked when BTAMPEvent REQ failed in WDI and no RSP callback is generated. - */ -void WDA_BtAmpEventReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - WDI_BtAmpEventParamsType *wdiBtAmpEventParam; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam; - - if(BTAMP_EVENT_CONNECTION_TERMINATED == - wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType) - { - pWDA->wdaAmpSessionOn = VOS_FALSE; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessBtAmpEventReq - * Request to WDI to Update with BT AMP events. - */ -VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA, - tSmeBtAmpEvent *pBtAmpEventParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_BtAmpEventParamsType *wdiBtAmpEventParam = - (WDI_BtAmpEventParamsType *)vos_mem_malloc( - sizeof(WDI_BtAmpEventParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiBtAmpEventParam) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiBtAmpEventParam); - return VOS_STATUS_E_NOMEM; - } - wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType = - pBtAmpEventParams->btAmpEventType; - wdiBtAmpEventParam->wdiReqStatusCB = WDA_BtAmpEventReqCallback; - wdiBtAmpEventParam->pUserData = pWdaParams; - /* Store BT AMP event pointer, as this will be used for response */ - /* store Params pass it to WDI */ - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pBtAmpEventParams; - pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam; - status = WDI_BtAmpEventReq(wdiBtAmpEventParam, - (WDI_BtAmpEventRspCb)WDA_BtAmpEventRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in BT AMP event REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType) - { - pWDA->wdaAmpSessionOn = VOS_TRUE; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} - -/* - * FUNCTION: WDA_FTMCommandReqCallback - * Handle FTM CMD response came from HAL - * Route responce to HDD FTM - */ -void WDA_FTMCommandReqCallback(void *ftmCmdRspData, - void *usrData) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ; - if((NULL == pWDA) || (NULL == ftmCmdRspData)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s, invalid input %p, %p",__func__, pWDA, ftmCmdRspData); - return; - } - /* Release Current FTM Command Request */ - vos_mem_free(pWDA->wdaFTMCmdReq); - pWDA->wdaFTMCmdReq = NULL; - /* Post FTM Responce to HDD FTM */ - wlan_sys_ftm(ftmCmdRspData); - return; -} -/* - * FUNCTION: WDA_ProcessFTMCommand - * Send FTM command to WDI - */ -VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA, - tPttMsgbuffer *pPTTFtmCmd) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_FTMCommandReqType *ftmCMDReq = NULL; - ftmCMDReq = (WDI_FTMCommandReqType *) - vos_mem_malloc(sizeof(WDI_FTMCommandReqType)); - if(NULL == ftmCMDReq) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA FTM Command buffer alloc fail"); - return VOS_STATUS_E_NOMEM; - } - ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength; - ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd; - pWDA->wdaFTMCmdReq = (void *)ftmCMDReq; - /* Send command to WDI */ - status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA); - return status; -} -#ifdef FEATURE_OEM_DATA_SUPPORT -/* - * FUNCTION: WDA_StartOemDataReqCallback - * - */ -void WDA_StartOemDataReqCallback( - WDI_oemDataRspParamsType *wdiOemDataRspParams, - void* pUserData) -{ - VOS_STATUS status = VOS_STATUS_E_FAILURE; - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tStartOemDataRsp *pOemDataRspParams = NULL ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - - if(NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL", __func__); - VOS_ASSERT(0); - return ; - } - - /* - * Allocate memory for response params sent to PE - */ - pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp)); - - // Check if memory is allocated for OemdataMeasRsp Params. - if(NULL == pOemDataRspParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "OEM DATA WDA callback alloc fail"); - VOS_ASSERT(0) ; - return; - } - - // Free the memory allocated during request. - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams) ; - - /* - * Now go ahead and copy other stuff for PE in incase of success only - * Also, here success always means that we have atleast one BSSID. - */ - vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE); - - //enable Tx - status = WDA_ResumeDataTx(pWDA); - if(status != VOS_STATUS_SUCCESS) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail"); - } - WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP, (void *)pOemDataRspParams, 0) ; - return ; -} -/* - * FUNCTION: WDA_ProcessStartOemDataReq - * Send Start Oem Data Req to WDI - */ -VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA, - tStartOemDataReq *pOemDataReqParams) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_oemDataReqParamsType *wdiOemDataReqParams = NULL; - tWDA_ReqParams *pWdaParams ; - - wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ; - - if(NULL == wdiOemDataReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, - pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr)); - vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, - pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE); - - wdiOemDataReqParams->wdiReqStatusCB = NULL; - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(wdiOemDataReqParams); - vos_mem_free(pOemDataReqParams); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams->pWdaContext = (void*)pWDA; - pWdaParams->wdaMsgParam = (void*)pOemDataReqParams; - pWdaParams->wdaWdiApiMsgParam = (void*)wdiOemDataReqParams; - - status = WDI_StartOemDataReq(wdiOemDataReqParams, - (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Start OEM DATA REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif /* FEATURE_OEM_DATA_SUPPORT */ -/* - * FUNCTION: WDA_SetTxPerTrackingRespCallback - * - */ -void WDA_SetTxPerTrackingRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - return ; -} -/* - * FUNCTION: WDA_SetTxPerTrackingReqCallback - * Free memory. - * Invoked when SetTXPerTracking REQ failed in WDI and no RSP callback is generated. - */ -void WDA_SetTxPerTrackingReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -#ifdef WLAN_FEATURE_GTK_OFFLOAD -/* - * FUNCTION: WDA_GTKOffloadRespCallback - * - */ -void WDA_GTKOffloadRespCallback( WDI_GtkOffloadRspParams *pwdiGtkOffloadRsparams, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_GTKOffloadRespCallback invoked " ); - - return ; -} -/* - * FUNCTION: WDA_GTKOffloadReqCallback - * Free memory. - * Invoked when GTKOffload REQ failed in WDI and no RSP callback is generated. - */ -void WDA_GTKOffloadReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessGTKOffloadReq - * Request to WDI to set the filter to minimize unnecessary host wakeup due - * to broadcast traffic (sta mode). - */ -VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA, - tpSirGtkOffloadParams pGtkOffloadParams) -{ - WDI_Status status = WDI_STATUS_E_FAILURE; - WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg = - (WDI_GtkOffloadReqMsg *)vos_mem_malloc( - sizeof(WDI_GtkOffloadReqMsg)) ; - tWDA_ReqParams *pWdaParams ; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - - if(NULL == wdiGtkOffloadReqMsg) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiGtkOffloadReqMsg); - return VOS_STATUS_E_NOMEM; - } - - // - // Fill wdiGtkOffloadInfo from pGtkOffloadParams - // - - vos_mem_copy(wdiGtkOffloadReqMsg->gtkOffloadReqParams.bssId, - pGtkOffloadParams->bssId, sizeof (wpt_macAddr)); - - wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags; - // Copy KCK - vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16); - // Copy KEK - vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16); - // Copy KeyReplayCounter - vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter), - &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t)); - - wdiGtkOffloadReqMsg->wdiReqStatusCB = WDA_GTKOffloadReqCallback; - wdiGtkOffloadReqMsg->pUserData = pWdaParams; - - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pGtkOffloadParams; - - status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadRespCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return CONVERT_WDI2VOS_STATUS(status) ; -} - -/* - * FUNCTION: WDA_GtkOffloadGetInfoRespCallback - * - */ -void WDA_GtkOffloadGetInfoRespCallback( WDI_GtkOffloadGetInfoRspParams *pwdiGtkOffloadGetInfoRsparams, - void * pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq; - tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tSirGtkOffloadGetInfoRspParams)) ; - vos_msg_t vosMsg; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ; - pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam; - - // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams - vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams)); - - /* Message Header */ - pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP; - pGtkOffloadGetInfoRsp->mesgLen = sizeof(tSirGtkOffloadGetInfoRspParams); - - pGtkOffloadGetInfoRsp->ulStatus = pwdiGtkOffloadGetInfoRsparams->ulStatus; - pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pwdiGtkOffloadGetInfoRsparams->ullKeyReplayCounter; - pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulTotalRekeyCount; - pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulGTKRekeyCount; - pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulIGTKRekeyCount; - - vos_mem_copy( pGtkOffloadGetInfoRsp->bssId, - pwdiGtkOffloadGetInfoRsparams->bssId, - sizeof (wpt_macAddr)); - /* VOS message wrapper */ - vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP; - vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp; - vosMsg.bodyval = 0; - - if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - /* free the mem and return */ - vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp); - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - return; -} -/* - * FUNCTION: WDA_GtkOffloadGetInfoReqCallback - * Free memory and send RSP back to SME. - * Invoked when GTKOffloadGetInfo REQ failed in WDI and no RSP callback is generated. - */ -void WDA_GtkOffloadGetInfoReqCallback(WDI_Status wdiStatus, void * pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - vos_msg_t vosMsg; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - /* VOS message wrapper */ - vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP; - vosMsg.bodyptr = NULL; - vosMsg.bodyval = 0; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg); - } - - return; -} -#endif - -/* - * FUNCTION: WDA_ProcessSetTxPerTrackingReq - * Request to WDI to set Tx Per Tracking configurations - */ -VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - WDI_Status wstatus; - WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams = - (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc( - sizeof(WDI_SetTxPerTrackingReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pwdiSetTxPerTrackingReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(pTxPerTrackingParams); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(pwdiSetTxPerTrackingReqParams); - vos_mem_free(pTxPerTrackingParams); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable = - pTxPerTrackingParams->ucTxPerTrackingEnable; - pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod = - pTxPerTrackingParams->ucTxPerTrackingPeriod; - pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio = - pTxPerTrackingParams->ucTxPerTrackingRatio; - pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark = - pTxPerTrackingParams->uTxPerTrackingWatermark; - pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = WDA_SetTxPerTrackingReqCallback; - pwdiSetTxPerTrackingReqParams->pUserData = pWdaParams; - /* Store param pointer as passed in by caller */ - /* store Params pass it to WDI - Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */ - pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pTxPerTrackingParams; - wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams, - (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(wstatus)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set Tx PER REQ WDI API, free all the memory " ); - status = CONVERT_WDI2VOS_STATUS(wstatus); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - return status; - -}/*WDA_ProcessSetTxPerTrackingReq*/ -/* - * FUNCTION: WDA_HALDumpCmdCallback - * Send the VOS complete . - */ -void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams, - void* pUserData) -{ - tANI_U8 *buffer = NULL; - tWDA_CbContext *pWDA = NULL; - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - pWDA = pWdaParams->pWdaContext; - buffer = (tANI_U8 *)pWdaParams->wdaMsgParam; - if(wdiRspParams->usBufferLen > 0) - { - /*Copy the Resp data to UMAC supplied buffer*/ - vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen); - } - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams); - - /* Indicate VOSS about the start complete */ - vos_WDAComplete_cback(pWDA->pVosContext); - return ; -} - -/* - * FUNCTION: WDA_ProcessHALDumpCmdReq - * Send Dump command to WDI - */ -VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd, - tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, - tANI_U32 arg4, tANI_U8 *pBuffer) -{ - WDI_Status status = WDI_STATUS_SUCCESS; - WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL; - WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ; - tWDA_ReqParams *pWdaParams ; - pVosContextType pVosContext = NULL; - VOS_STATUS vStatus; - pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE, - (void *)pMac); - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - return VOS_STATUS_E_NOMEM; - } - /* Allocate memory WDI request structure*/ - wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *) - vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType)); - if(NULL == wdiHALDumpCmdReqParam) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA HAL DUMP Command buffer alloc fail"); - vos_mem_free(pWdaParams); - return WDI_STATUS_E_FAILURE; - } - wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType; - /* Extract the arguments */ - wdiHalDumpCmdInfo->command = cmd; - wdiHalDumpCmdInfo->argument1 = arg1; - wdiHalDumpCmdInfo->argument2 = arg2; - wdiHalDumpCmdInfo->argument3 = arg3; - wdiHalDumpCmdInfo->argument4 = arg4; - wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ; - pWdaParams->pWdaContext = pVosContext->pWDAContext; - - /* Response message will be passed through the buffer */ - pWdaParams->wdaMsgParam = (void *)pBuffer; - - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ; - /* Send command to WDI */ - status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams); - vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), WDA_DUMPCMD_WAIT_TIMEOUT ); - if ( vStatus != VOS_STATUS_SUCCESS ) - { - if ( vStatus == VOS_STATUS_E_TIMEOUT ) - { - VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, - "%s: Timeout occurred before WDA_HALDUMP complete",__func__); - } - else - { - VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, - "%s: WDA_HALDUMP reporting other error",__func__); - } - VOS_ASSERT(0); - } - return status; -} -#ifdef WLAN_FEATURE_GTK_OFFLOAD -/* - * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq - * Request to WDI to get GTK Offload Information - */ -VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA, - tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp) -{ - WDI_Status status = WDI_STATUS_E_FAILURE; - WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg = - (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg)); - tWDA_ReqParams *pWdaParams ; - - if(NULL == pwdiGtkOffloadGetInfoReqMsg) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiGtkOffloadGetInfoReqMsg); - return VOS_STATUS_E_NOMEM; - } - - pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = WDA_GtkOffloadGetInfoReqCallback; - pwdiGtkOffloadGetInfoReqMsg->pUserData = pWdaParams; - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp; - - vos_mem_copy(pwdiGtkOffloadGetInfoReqMsg->WDI_GtkOffloadGetInfoReqParams.bssId, - pGtkOffloadGetInfoRsp->bssId, sizeof (wpt_macAddr)); - - status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoRespCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - /* failure returned by WDI API */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ; - } - - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif // WLAN_FEATURE_GTK_OFFLOAD - -/* - * FUNCTION: WDA_ProcessAddPeriodicTxPtrnInd - * - */ -VOS_STATUS WDA_ProcessAddPeriodicTxPtrnInd(tWDA_CbContext *pWDA, - tSirAddPeriodicTxPtrn *pAddPeriodicTxPtrnParams) -{ - WDI_Status wdiStatus; - WDI_AddPeriodicTxPtrnParamsType *addPeriodicTxPtrnParams; - - addPeriodicTxPtrnParams = - vos_mem_malloc(sizeof(WDI_AddPeriodicTxPtrnParamsType)); - - if (NULL == addPeriodicTxPtrnParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Not able to allocate memory for addPeriodicTxPtrnParams!", - __func__); - - return VOS_STATUS_E_NOMEM; - } - - vos_mem_copy(&(addPeriodicTxPtrnParams->wdiAddPeriodicTxPtrnParams), - pAddPeriodicTxPtrnParams, sizeof(tSirAddPeriodicTxPtrn)); - - addPeriodicTxPtrnParams->wdiReqStatusCB = WDA_WdiIndicationCallback; - addPeriodicTxPtrnParams->pUserData = pWDA; - - wdiStatus = WDI_AddPeriodicTxPtrnInd(addPeriodicTxPtrnParams); - - if (WDI_STATUS_PENDING == wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Pending received for %s:%d", __func__, __LINE__ ); - } - else if (WDI_STATUS_SUCCESS_SYNC != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in %s:%d", __func__, __LINE__ ); - } - - vos_mem_free(addPeriodicTxPtrnParams); - - return CONVERT_WDI2VOS_STATUS(wdiStatus); -} - -/* - * FUNCTION: WDA_ProcessDelPeriodicTxPtrnInd - * - */ -VOS_STATUS WDA_ProcessDelPeriodicTxPtrnInd(tWDA_CbContext *pWDA, - tSirDelPeriodicTxPtrn *pDelPeriodicTxPtrnParams) -{ - WDI_Status wdiStatus; - WDI_DelPeriodicTxPtrnParamsType *delPeriodicTxPtrnParams; - - delPeriodicTxPtrnParams = - vos_mem_malloc(sizeof(WDI_DelPeriodicTxPtrnParamsType)); - - if (NULL == delPeriodicTxPtrnParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Not able to allocate memory for delPeriodicTxPtrnParams!", - __func__); - - return VOS_STATUS_E_NOMEM; - } - - vos_mem_copy(&(delPeriodicTxPtrnParams->wdiDelPeriodicTxPtrnParams), - pDelPeriodicTxPtrnParams, sizeof(tSirDelPeriodicTxPtrn)); - - delPeriodicTxPtrnParams->wdiReqStatusCB = WDA_WdiIndicationCallback; - delPeriodicTxPtrnParams->pUserData = pWDA; - - wdiStatus = WDI_DelPeriodicTxPtrnInd(delPeriodicTxPtrnParams); - - if (WDI_STATUS_PENDING == wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Pending received for %s:%d", __func__, __LINE__ ); - } - else if (WDI_STATUS_SUCCESS_SYNC != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in %s:%d", __func__, __LINE__ ); - } - - vos_mem_free(delPeriodicTxPtrnParams); - - return CONVERT_WDI2VOS_STATUS(wdiStatus); -} - -/* - * FUNCTION: WDA_ProcessRateUpdateInd - * - */ -VOS_STATUS WDA_ProcessRateUpdateInd(tWDA_CbContext *pWDA, - tSirRateUpdateInd *pRateUpdateParams) -{ - WDI_Status wdiStatus; - WDI_RateUpdateIndParams rateUpdateParams; - - vos_mem_copy(rateUpdateParams.bssid, - pRateUpdateParams->bssid, sizeof(tSirMacAddr)); - - rateUpdateParams.ucastDataRateTxFlag = - pRateUpdateParams->ucastDataRateTxFlag; - rateUpdateParams.reliableMcastDataRateTxFlag = - pRateUpdateParams->reliableMcastDataRateTxFlag; - rateUpdateParams.mcastDataRate24GHzTxFlag = - pRateUpdateParams->mcastDataRate24GHzTxFlag; - rateUpdateParams.mcastDataRate5GHzTxFlag = - pRateUpdateParams->mcastDataRate5GHzTxFlag; - - rateUpdateParams.ucastDataRate = pRateUpdateParams->ucastDataRate; - rateUpdateParams.reliableMcastDataRate = - pRateUpdateParams->reliableMcastDataRate; - rateUpdateParams.mcastDataRate24GHz = pRateUpdateParams->mcastDataRate24GHz; - rateUpdateParams.mcastDataRate5GHz = pRateUpdateParams->mcastDataRate5GHz; - - rateUpdateParams.wdiReqStatusCB = WDA_WdiIndicationCallback; - rateUpdateParams.pUserData = pWDA; - - wdiStatus = WDI_RateUpdateInd(&rateUpdateParams); - - if (WDI_STATUS_PENDING == wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Pending received for %s:%d", __func__, __LINE__ ); - } - else if (WDI_STATUS_SUCCESS_SYNC != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in %s:%d", __func__, __LINE__ ); - } - - vos_mem_free(pRateUpdateParams); - - return CONVERT_WDI2VOS_STATUS(wdiStatus); -} - - -#ifdef FEATURE_WLAN_BATCH_SCAN -/* - * FUNCTION: WDA_ProcessStopBatchScanInd - * - * DESCRIPTION: This function sends stop batch scan inidcation message to WDI - * - * PARAM: - * pWDA: pointer to WDA context - * pReq: pointer to stop batch scan request - */ -VOS_STATUS WDA_ProcessStopBatchScanInd(tWDA_CbContext *pWDA, - tSirStopBatchScanInd *pReq) -{ - WDI_Status wdiStatus; - WDI_StopBatchScanIndType wdiReq; - - wdiReq.param = pReq->param; - - wdiStatus = WDI_StopBatchScanInd(&wdiReq); - - if (WDI_STATUS_SUCCESS_SYNC != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Stop batch scan ind failed %s:%d", __func__, wdiStatus); - } - - vos_mem_free(pReq); - - return CONVERT_WDI2VOS_STATUS(wdiStatus); -} -/*========================================================================== - FUNCTION WDA_ProcessTriggerBatchScanResultInd - - DESCRIPTION - API to pull batch scan result from FW - - PARAMETERS - pWDA: Pointer to WDA context - pGetBatchScanReq: Pointer to get batch scan result indication - - RETURN VALUE - NONE - -===========================================================================*/ -VOS_STATUS WDA_ProcessTriggerBatchScanResultInd(tWDA_CbContext *pWDA, - tSirTriggerBatchScanResultInd *pReq) -{ - WDI_Status wdiStatus; - WDI_TriggerBatchScanResultIndType wdiReq; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "------> %s " ,__func__); - - wdiReq.param = pReq->param; - - wdiStatus = WDI_TriggerBatchScanResultInd(&wdiReq); - - if (WDI_STATUS_SUCCESS_SYNC != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Trigger batch scan result ind failed %s:%d", - __func__, wdiStatus); - } - - vos_mem_free(pReq); - - return CONVERT_WDI2VOS_STATUS(wdiStatus); -} - -/*========================================================================== - FUNCTION WDA_SetBatchScanRespCallback - - DESCRIPTION - API to process set batch scan response from FW - - PARAMETERS - pRsp: Pointer to set batch scan response - pUserData: Pointer to user data - - RETURN VALUE - NONE - -===========================================================================*/ -void WDA_SetBatchScanRespCallback -( - WDI_SetBatchScanRspType *pRsp, - void* pUserData -) -{ - tSirSetBatchScanRsp *pHddSetBatchScanRsp; - tpAniSirGlobal pMac; - void *pCallbackContext; - tWDA_CbContext *pWDA = NULL ; - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "<------ %s " ,__func__); - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - /*extract WDA context*/ - pWDA = pWdaParams->pWdaContext; - if (NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL can't invole HDD callback", - __func__); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - VOS_ASSERT(0); - return; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - if (NULL == pMac) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pMac is NULL", __func__); - VOS_ASSERT(0); - return; - } - - pHddSetBatchScanRsp = - (tSirSetBatchScanRsp *)vos_mem_malloc(sizeof(tSirSetBatchScanRsp)); - if (NULL == pHddSetBatchScanRsp) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure can't invoke HDD callback", __func__); - VOS_ASSERT(0); - return; - } - - pHddSetBatchScanRsp->nScansToBatch = pRsp->nScansToBatch; - - pCallbackContext = pMac->pmc.setBatchScanReqCallbackContext; - /*call hdd callback with set batch scan response data*/ - if(pMac->pmc.setBatchScanReqCallback) - { - pMac->pmc.setBatchScanReqCallback(pCallbackContext, pHddSetBatchScanRsp); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:HDD callback is null", __func__); - VOS_ASSERT(0); - } - - vos_mem_free(pHddSetBatchScanRsp); - return ; -} - -/*========================================================================== - FUNCTION WDA_ProcessSetBatchScanReq - - DESCRIPTION - API to send set batch scan request to WDI - - PARAMETERS - pWDA: Pointer to WDA context - pSetBatchScanReq: Pointer to set batch scan req - - RETURN VALUE - NONE - -===========================================================================*/ -VOS_STATUS WDA_ProcessSetBatchScanReq(tWDA_CbContext *pWDA, - tSirSetBatchScanReq *pSetBatchScanReq) -{ - WDI_Status status; - tWDA_ReqParams *pWdaParams ; - WDI_SetBatchScanReqType *pWdiSetBatchScanReq; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "------> %s " ,__func__); - - pWdiSetBatchScanReq = - (WDI_SetBatchScanReqType *)vos_mem_malloc(sizeof(WDI_SetBatchScanReqType)); - if (NULL == pWdiSetBatchScanReq) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(pSetBatchScanReq); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)); - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pSetBatchScanReq); - vos_mem_free(pWdiSetBatchScanReq); - return VOS_STATUS_E_NOMEM; - } - - pWdiSetBatchScanReq->scanFrequency = pSetBatchScanReq->scanFrequency; - pWdiSetBatchScanReq->numberOfScansToBatch = - pSetBatchScanReq->numberOfScansToBatch; - pWdiSetBatchScanReq->bestNetwork = pSetBatchScanReq->bestNetwork; - pWdiSetBatchScanReq->rfBand = pSetBatchScanReq->rfBand; - pWdiSetBatchScanReq->rtt = pSetBatchScanReq->rtt; - - pWdaParams->wdaWdiApiMsgParam = pWdiSetBatchScanReq; - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = pSetBatchScanReq; - - status = WDI_SetBatchScanReq(pWdiSetBatchScanReq, pWdaParams, - (WDI_SetBatchScanCb)WDA_SetBatchScanRespCallback); - if (IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set Batch Scan REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status); -} - -#endif - -/* - * ------------------------------------------------------------------------- - * DATA interface with WDI for Mgmt Frames - * ------------------------------------------------------------------------- - */ -/* - * FUNCTION: WDA_TxComplete - * Callback function for the WDA_TxPacket - */ -VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData, - VOS_STATUS status ) -{ - - tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ; - tANI_U32 uUserData; - - if(NULL == wdaContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL", - __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - - /*Check if frame was timed out or not*/ - vos_pkt_get_user_data_ptr( pData, VOS_PKT_USER_DATA_ID_WDA, - (v_PVOID_t)&uUserData); - - if ( WDA_TL_TX_MGMT_TIMED_OUT == uUserData ) - { - /*Discard frame - no further processing is needed*/ - vos_pkt_return_packet(pData); - return VOS_STATUS_SUCCESS; - } - - /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/ - if( NULL!=wdaContext->pTxCbFunc) - { - /*check if packet is freed already*/ - if(vos_atomic_set((uintptr_t*)&wdaContext->VosPacketToFree, (uintptr_t)WDA_TX_PACKET_FREED) == (uintptr_t)pData) - { - wdaContext->pTxCbFunc(pMac, pData, 1); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, - "%s:packet (%p) is already freed", - __func__, pData); - //Return from here since we reaching here because the packet already timeout - return status; - } - } - - /* - * Trigger the event to bring the HAL TL Tx complete function to come - * out of wait - * Let the coe above to complete the packet first. When this event is set, - * the thread waiting for the event may run and set Vospacket_freed causing the original - * packet not being freed. - */ - status = vos_event_set(&wdaContext->txFrameEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "NEW VOS Event Set failed - status = %d", status); - } - return status; -} -/* - * FUNCTION: WDA_TxPacket - * Forward TX management frame to WDI - */ -VOS_STATUS WDA_TxPacket(void *pWDA_handle, - void *pFrmBuf, - tANI_U16 frmLen, - eFrameType frmType, - eFrameTxDir txDir, - tANI_U8 tid, - pWDATxRxCompFunc pCompFunc, - void *pData, - pWDAAckFnTxComp pAckTxComp, - tANI_U8 txFlag, - tANI_U8 sessionId ) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)(pWDA_handle); - VOS_STATUS status = VOS_STATUS_SUCCESS ; - tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData; - tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType; - tANI_U8 eventIdx = 0; - tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE; - tpAniSirGlobal pMac; - if((NULL == pWDA)||(NULL == pFrmBuf)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA %p or pFrmBuf %p is NULL", - __func__,pWDA,pFrmBuf); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "Tx Mgmt Frame Subtype: %d alloc(%p)", pFc->subType, pFrmBuf); - pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - if(NULL == pMac) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pMac is NULL", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - - - - /* store the call back function in WDA context */ - pWDA->pTxCbFunc = pCompFunc; - /* store the call back for the function of ackTxComplete */ - if( pAckTxComp ) - { - if( NULL != pWDA->pAckTxCbFunc ) - { - /* Already TxComp is active no need to active again */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "There is already one request pending for tx complete"); - pWDA->pAckTxCbFunc( pMac, 0); - pWDA->pAckTxCbFunc = NULL; - - if( VOS_STATUS_SUCCESS != - WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Tx Complete timeout Timer Stop Failed "); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Tx Complete timeout Timer Stop Success "); - } - } - - txFlag |= HAL_TXCOMP_REQUESTED_MASK; - pWDA->pAckTxCbFunc = pAckTxComp; - if( VOS_STATUS_SUCCESS != - WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Tx Complete Timer Start Failed "); - pWDA->pAckTxCbFunc = NULL; - return eHAL_STATUS_FAILURE; - } - } - /* Reset the event to be not signalled */ - status = vos_event_reset(&pWDA->txFrameEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event reset failed - status = %d",status); - pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf, 1); - if( pAckTxComp ) - { - pWDA->pAckTxCbFunc = NULL; - if( VOS_STATUS_SUCCESS != - WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Tx Complete timeout Timer Stop Failed "); - } - } - return VOS_STATUS_E_FAILURE; - } - - /* If Peer Sta mask is set don't overwrite to self sta */ - if(txFlag & HAL_USE_PEER_STA_REQUESTED_MASK) - { - txFlag &= ~HAL_USE_PEER_STA_REQUESTED_MASK; - } - else - { - /* Get system role, use the self station if in unknown role or STA role */ - systemRole = wdaGetGlobalSystemRole(pMac); - if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) || - (( eSYSTEM_STA_ROLE == systemRole ) -#if defined FEATURE_WLAN_ESE || defined FEATURE_WLAN_TDLS - && frmType == HAL_TXRX_FRM_802_11_MGMT -#endif - )) - { - txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK; - } - } - - /* Divert Disassoc/Deauth frames thru self station, as by the time unicast - disassoc frame reaches the HW, HAL has already deleted the peer station */ - if ((pFc->type == SIR_MAC_MGMT_FRAME)) - { - if ((pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) || - (pFc->subType == SIR_MAC_MGMT_PROBE_REQ)) - { - /*Send Probe request frames on self sta idx*/ - txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK; - } - /* Since we donot want probe responses to be retried, send probe responses - through the NO_ACK queues */ - if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP) - { - //probe response is sent out using self station and no retries options. - txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK); - } - if(VOS_TRUE == pWDA->wdaAmpSessionOn) - { - txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME; - } - } - vos_atomic_set((uintptr_t*)&pWDA->VosPacketToFree, (uintptr_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/ - - /*Set frame tag to 0 - We will use the WDA user data in order to tag a frame as expired*/ - vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA, - (v_PVOID_t)0); - - - if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf, - frmLen, ucTypeSubType, tid, - WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Sending Mgmt Frame failed - status = %d", status); - pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf, 1); - vos_atomic_set((uintptr_t*)&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/ - if( pAckTxComp ) - { - pWDA->pAckTxCbFunc = NULL; - if( VOS_STATUS_SUCCESS != - WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Tx Complete timeout Timer Stop Failed "); - } - } - return VOS_STATUS_E_FAILURE; - } - /* - * Wait for the event to be set by the TL, to get the response of TX - * complete, this event should be set by the Callback function called by TL - */ - status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT, - &eventIdx); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Status %d when waiting for TX Frame Event", - __func__, status); - pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again , - after the packet gets completed(packet freed once)*/ - - /* TX MGMT fail with COMP timeout, try to detect DXE stall */ - WDA_TransportChannelDebug(pMac, 1, 0); - - /*Tag Frame as timed out for later deletion*/ - vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA, - (v_PVOID_t)WDA_TL_TX_MGMT_TIMED_OUT); - - /* check whether the packet was freed already,so need not free again when - * TL calls the WDA_Txcomplete routine - */ - vos_atomic_set((uintptr_t*)&pWDA->VosPacketToFree, (uintptr_t)WDA_TX_PACKET_FREED); - /*if(vos_atomic_set(uintptr_t *)&pWDA->VosPacketToFree, (uintptr_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf) - { - pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf); - } */ - - if( pAckTxComp ) - { - pWDA->pAckTxCbFunc = NULL; - if( VOS_STATUS_SUCCESS != - WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Tx Complete timeout Timer Stop Failed "); - } - } - status = VOS_STATUS_E_FAILURE; - } -#ifdef WLAN_DUMP_MGMTFRAMES - if (VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s() TX packet : SubType %d", __func__,pFc->subType); - VOS_TRACE_HEX_DUMP( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - pData, frmLen); - } -#endif - - return status; -} -/* - * FUNCTION: WDA_ProcessDHCPStartInd - * Forward DHCP Start to WDI - */ -static VOS_STATUS WDA_ProcessDHCPStartInd (tWDA_CbContext *pWDA, - tAniDHCPInd *dhcpStartInd) -{ - WDI_Status status; - WDI_DHCPInd *wdiDHCPInd = (WDI_DHCPInd*)vos_mem_malloc(sizeof(WDI_DHCPInd)) ; - if (NULL == wdiDHCPInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(dhcpStartInd); - return VOS_STATUS_E_NOMEM; - } - - wdiDHCPInd->device_mode = dhcpStartInd->device_mode; - vos_mem_copy(wdiDHCPInd->adapterMacAddr, dhcpStartInd->adapterMacAddr, - sizeof(tSirMacAddr)); - vos_mem_copy(wdiDHCPInd->peerMacAddr, dhcpStartInd->peerMacAddr, - sizeof(tSirMacAddr)); - - status = WDI_dhcpStartInd(wdiDHCPInd); - - if (IS_WDI_STATUS_FAILURE(status)) - { - vos_mem_free(wdiDHCPInd); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "DHCP Start Indication failed"); - } - vos_mem_free(dhcpStartInd); - return CONVERT_WDI2VOS_STATUS(status) ; -} - - /* - * FUNCTION: WDA_ProcessDHCPStopInd - * Forward DHCP Stop to WDI - */ - static VOS_STATUS WDA_ProcessDHCPStopInd (tWDA_CbContext *pWDA, - tAniDHCPInd *dhcpStopInd) - { - WDI_Status status; - WDI_DHCPInd *wdiDHCPInd = (WDI_DHCPInd*)vos_mem_malloc(sizeof(WDI_DHCPInd)) ; - if (NULL == wdiDHCPInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(dhcpStopInd); - return VOS_STATUS_E_NOMEM; - } - wdiDHCPInd->device_mode = dhcpStopInd->device_mode; - vos_mem_copy(wdiDHCPInd->adapterMacAddr, dhcpStopInd->adapterMacAddr, sizeof(tSirMacAddr)); - vos_mem_copy(wdiDHCPInd->peerMacAddr, dhcpStopInd->peerMacAddr, sizeof(tSirMacAddr)); - status = WDI_dhcpStopInd(wdiDHCPInd); - if (IS_WDI_STATUS_FAILURE(status)) - { - vos_mem_free(wdiDHCPInd); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "DHCP Start Indication failed"); - } - vos_mem_free(dhcpStopInd); - return CONVERT_WDI2VOS_STATUS(status) ; - } - -/* - * FUNCTION: WDA_McProcessMsg - * Trigger DAL-AL to start CFG download - */ -VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg ) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS; - tWDA_CbContext *pWDA = NULL ; - if(NULL == pMsg) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pMsg is NULL", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW, - "=========> %s msgType: %x " ,__func__, pMsg->type); - - pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext ); - if(NULL == pWDA ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL", __func__); - VOS_ASSERT(0); - vos_mem_free(pMsg->bodyptr); - return VOS_STATUS_E_FAILURE; - } - /* Process all the WDA messages.. */ - switch( pMsg->type ) - { - case WNI_CFG_DNLD_REQ: - { - status = WDA_WniCfgDnld(pWDA); - /* call WDA complete event if config download success */ - if( VOS_IS_STATUS_SUCCESS(status) ) - { - vos_WDAComplete_cback(pVosContext); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA Config Download failure" ); - } - break ; - } - /* - * Init SCAN request from PE, convert it into DAL format - * and send it to DAL - */ - case WDA_INIT_SCAN_REQ: - { - WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ; - break ; - } - /* start SCAN request from PE */ - case WDA_START_SCAN_REQ: - { - WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ; - break ; - } - /* end SCAN request from PE */ - case WDA_END_SCAN_REQ: - { - WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ; - break ; - } - /* end SCAN request from PE */ - case WDA_FINISH_SCAN_REQ: - { - WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ; - break ; - } - /* join request from PE */ - case WDA_CHNL_SWITCH_REQ: - { - if(WDA_PRE_ASSOC_STATE == pWDA->wdaState) - { - WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ; - } - else - { - WDA_ProcessChannelSwitchReq(pWDA, - (tSwitchChannelParams*)pMsg->bodyptr) ; - } - break ; - } - /* ADD BSS request from PE */ - case WDA_ADD_BSS_REQ: - { - WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ; - break ; - } - case WDA_ADD_STA_REQ: - { - WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ; - break ; - } - case WDA_DELETE_BSS_REQ: - { - WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ; - break ; - } - case WDA_DELETE_STA_REQ: - { - WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ; - break ; - } - case WDA_CONFIG_PARAM_UPDATE_REQ: - { - WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ; - break ; - } - case WDA_SET_BSSKEY_REQ: - { - WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr); - break ; - } - case WDA_SET_STAKEY_REQ: - { - WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr); - break ; - } - case WDA_SET_STA_BCASTKEY_REQ: - { - WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr); - break ; - } - case WDA_REMOVE_BSSKEY_REQ: - { - WDA_ProcessRemoveBssKeyReq(pWDA, - (tRemoveBssKeyParams *)pMsg->bodyptr); - break ; - } - case WDA_REMOVE_STAKEY_REQ: - { - WDA_ProcessRemoveStaKeyReq(pWDA, - (tRemoveStaKeyParams *)pMsg->bodyptr); - break ; - } - case WDA_REMOVE_STA_BCASTKEY_REQ: - { - /* TODO: currently UMAC is not sending this request, Add the code for - handling this request when UMAC supports */ - break; - } -#ifdef FEATURE_WLAN_ESE - case WDA_TSM_STATS_REQ: - { - WDA_ProcessTsmStatsReq(pWDA, (tpAniGetTsmStatsReq)pMsg->bodyptr); - break; - } -#endif - case WDA_UPDATE_EDCA_PROFILE_IND: - { - WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr); - break; - } - case WDA_ADD_TS_REQ: - { - WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr); - break; - } - case WDA_DEL_TS_REQ: - { - WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr); - break; - } - case WDA_ADDBA_REQ: - { - WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr); - break; - } - case WDA_DELBA_IND: - { - WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr); - break; - } - case WDA_SET_LINK_STATE: - { - WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr); - break; - } - case WDA_GET_STATISTICS_REQ: - { - WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr); - break; - } -#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_ESE || defined(FEATURE_WLAN_LFR) - case WDA_GET_ROAM_RSSI_REQ: - { - WDA_ProcessGetRoamRssiReq(pWDA, (tAniGetRssiReq *)pMsg->bodyptr); - break; - } -#endif - case WDA_PWR_SAVE_CFG: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr); - } - else - { - if(NULL != pMsg->bodyptr) - { - vos_mem_free(pMsg->bodyptr); - } - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_ENTER_IMPS_REQ: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_ProcessEnterImpsReq(pWDA); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_EXIT_IMPS_REQ: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_ProcessExitImpsReq(pWDA); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_ENTER_BMPS_REQ: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_EXIT_BMPS_REQ: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_ENTER_UAPSD_REQ: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_EXIT_UAPSD_REQ: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_ProcessExitUapsdReq(pWDA, (tExitUapsdParams *)pMsg->bodyptr); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_UPDATE_UAPSD_IND: - { - if(pWDA->wdaState == WDA_READY_STATE) - { - WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState ); - } - break; - } - case WDA_REGISTER_PE_CALLBACK : - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "Handling msg type WDA_REGISTER_PE_CALLBACK " ); - /*TODO: store the PE callback */ - /* Do Nothing? MSG Body should be freed at here */ - if(NULL != pMsg->bodyptr) - { - vos_mem_free(pMsg->bodyptr); - } - break; - } - case WDA_SYS_READY_IND : - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "Handling msg type WDA_SYS_READY_IND " ); - pWDA->wdaState = WDA_READY_STATE; - if(NULL != pMsg->bodyptr) - { - vos_mem_free(pMsg->bodyptr); - } - break; - } - case WDA_BEACON_FILTER_IND : - { - WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr); - break; - } - case WDA_BTC_SET_CFG: - { - /*TODO: handle this while dealing with BTC */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "Handling msg type WDA_BTC_SET_CFG " ); - /* Do Nothing? MSG Body should be freed at here */ - if(NULL != pMsg->bodyptr) - { - vos_mem_free(pMsg->bodyptr); - } - break; - } - case WDA_SIGNAL_BT_EVENT: - { - /*TODO: handle this while dealing with BTC */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "Handling msg type WDA_SIGNAL_BT_EVENT " ); - /* Do Nothing? MSG Body should be freed at here */ - if(NULL != pMsg->bodyptr) - { - vos_mem_free(pMsg->bodyptr); - } - break; - } - case WDA_CFG_RXP_FILTER_REQ: - { - WDA_ProcessConfigureRxpFilterReq(pWDA, - (tSirWlanSetRxpFilters *)pMsg->bodyptr); - break; - } - case WDA_SET_HOST_OFFLOAD: - { - WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr); - break; - } - case WDA_SET_KEEP_ALIVE: - { - WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr); - break; - } -#ifdef WLAN_NS_OFFLOAD - case WDA_SET_NS_OFFLOAD: - { - WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr); - break; - } -#endif //WLAN_NS_OFFLOAD - case WDA_ADD_STA_SELF_REQ: - { - WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr); - break; - } - case WDA_DEL_STA_SELF_REQ: - { - WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr); - break; - } - case WDA_WOWL_ADD_BCAST_PTRN: - { - WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr); - break; - } - case WDA_WOWL_DEL_BCAST_PTRN: - { - WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr); - break; - } - case WDA_WOWL_ENTER_REQ: - { - WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr); - break; - } - case WDA_WOWL_EXIT_REQ: - { - WDA_ProcessWowlExitReq(pWDA, (tSirHalWowlExitParams *)pMsg->bodyptr); - break; - } - case WDA_TL_FLUSH_AC_REQ: - { - WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr); - break; - } - case WDA_SIGNAL_BTAMP_EVENT: - { - WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr); - break; - } -#ifdef WDA_UT - case WDA_WDI_EVENT_MSG: - { - WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval); - break ; - } -#endif - case WDA_UPDATE_BEACON_IND: - { - WDA_ProcessUpdateBeaconParams(pWDA, - (tUpdateBeaconParams *)pMsg->bodyptr); - break; - } - case WDA_SEND_BEACON_REQ: - { - WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr); - break; - } - case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND: - { - WDA_ProcessUpdateProbeRspTemplate(pWDA, - (tSendProbeRespParams *)pMsg->bodyptr); - break; - } -#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_ESE) - case WDA_SET_MAX_TX_POWER_REQ: - { - WDA_ProcessSetMaxTxPowerReq(pWDA, - (tMaxTxPowerParams *)pMsg->bodyptr); - break; - } -#endif - case WDA_SET_MAX_TX_POWER_PER_BAND_REQ: - { - WDA_ProcessSetMaxTxPowerPerBandReq(pWDA, (tMaxTxPowerPerBandParams *) - pMsg->bodyptr); - break; - } - case WDA_SET_TX_POWER_REQ: - { - WDA_ProcessSetTxPowerReq(pWDA, - (tSirSetTxPowerReq *)pMsg->bodyptr); - break; - } - case WDA_SET_P2P_GO_NOA_REQ: - { - WDA_ProcessSetP2PGONOAReq(pWDA, - (tP2pPsParams *)pMsg->bodyptr); - break; - } - /* timer related messages */ - case WDA_TIMER_BA_ACTIVITY_REQ: - { - WDA_BaCheckActivity(pWDA) ; - break ; - } - - /* timer related messages */ - case WDA_TIMER_TRAFFIC_STATS_IND: - { - WDA_TimerTrafficStatsInd(pWDA); - break; - } -#ifdef WLAN_FEATURE_VOWIFI_11R - case WDA_AGGR_QOS_REQ: - { - WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr); - break; - } -#endif /* WLAN_FEATURE_VOWIFI_11R */ - case WDA_FTM_CMD_REQ: - { - WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ; - break ; - } -#ifdef FEATURE_OEM_DATA_SUPPORT - case WDA_START_OEM_DATA_REQ: - { - WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ; - break; - } -#endif /* FEATURE_OEM_DATA_SUPPORT */ - /* Tx Complete Time out Indication */ - case WDA_TX_COMPLETE_TIMEOUT_IND: - { - WDA_ProcessTxCompleteTimeOutInd(pWDA); - break; - } - case WDA_WLAN_SUSPEND_IND: - { - WDA_ProcessWlanSuspendInd(pWDA, - (tSirWlanSuspendParam *)pMsg->bodyptr) ; - break; - } - case WDA_WLAN_RESUME_REQ: - { - WDA_ProcessWlanResumeReq(pWDA, - (tSirWlanResumeParam *)pMsg->bodyptr) ; - break; - } - - case WDA_UPDATE_CF_IND: - { - vos_mem_free((v_VOID_t*)pMsg->bodyptr); - pMsg->bodyptr = NULL; - break; - } -#ifdef FEATURE_WLAN_SCAN_PNO - case WDA_SET_PNO_REQ: - { - WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr); - break; - } - case WDA_UPDATE_SCAN_PARAMS_REQ: - { - WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr); - break; - } - case WDA_SET_RSSI_FILTER_REQ: - { - WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr); - break; - } -#endif // FEATURE_WLAN_SCAN_PNO -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD - case WDA_ROAM_SCAN_OFFLOAD_REQ: - { - WDA_ProcessRoamScanOffloadReq(pWDA, (tSirRoamOffloadScanReq *)pMsg->bodyptr); - break; - } -#endif - case WDA_SET_TX_PER_TRACKING_REQ: - { - WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr); - break; - } - -#ifdef WLAN_FEATURE_PACKET_FILTERING - case WDA_8023_MULTICAST_LIST_REQ: - { - WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr); - break; - } - case WDA_RECEIVE_FILTER_SET_FILTER_REQ: - { - WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr); - break; - } - case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ: - { - WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr); - break; - } - case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ: - { - WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr); - break; - } -#endif // WLAN_FEATURE_PACKET_FILTERING - - - case WDA_TRANSMISSION_CONTROL_IND: - { - WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr); - break; - } - case WDA_SET_POWER_PARAMS_REQ: - { - WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr); - break; - } -#ifdef WLAN_FEATURE_GTK_OFFLOAD - case WDA_GTK_OFFLOAD_REQ: - { - WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr); - break; - } - - case WDA_GTK_OFFLOAD_GETINFO_REQ: - { - WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr); - break; - } -#endif //WLAN_FEATURE_GTK_OFFLOAD - - case WDA_SET_TM_LEVEL_REQ: - { - WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr); - break; - } -#ifdef WLAN_FEATURE_11AC - case WDA_UPDATE_OP_MODE: - { - if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC)) - { - if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE)) - WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr); - else - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - " VHT OpMode Feature is Not Supported"); - } - else - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - " 11AC Feature is Not Supported"); - break; - } -#endif -#ifdef WLAN_FEATURE_11W - case WDA_EXCLUDE_UNENCRYPTED_IND: - { - WDA_ProcessExcludeUnecryptInd(pWDA, (tSirWlanExcludeUnencryptParam *)pMsg->bodyptr); - break; - } -#endif -#ifdef FEATURE_WLAN_TDLS - case WDA_SET_TDLS_LINK_ESTABLISH_REQ: - { - WDA_ProcessSetTdlsLinkEstablishReq(pWDA, (tTdlsLinkEstablishParams *)pMsg->bodyptr); - break; - } -#endif - case WDA_DHCP_START_IND: - { - WDA_ProcessDHCPStartInd(pWDA, (tAniDHCPInd *)pMsg->bodyptr); - break; - } - case WDA_DHCP_STOP_IND: - { - WDA_ProcessDHCPStopInd(pWDA, (tAniDHCPInd *)pMsg->bodyptr); - break; - } -#ifdef FEATURE_WLAN_LPHB - case WDA_LPHB_CONF_REQ: - { - WDA_ProcessLPHBConfReq(pWDA, (tSirLPHBReq *)pMsg->bodyptr); - break; - } -#endif - case WDA_ADD_PERIODIC_TX_PTRN_IND: - { - WDA_ProcessAddPeriodicTxPtrnInd(pWDA, - (tSirAddPeriodicTxPtrn *)pMsg->bodyptr); - break; - } - case WDA_DEL_PERIODIC_TX_PTRN_IND: - { - WDA_ProcessDelPeriodicTxPtrnInd(pWDA, - (tSirDelPeriodicTxPtrn *)pMsg->bodyptr); - break; - } - case WDA_RATE_UPDATE_IND: - { - WDA_ProcessRateUpdateInd(pWDA, (tSirRateUpdateInd *)pMsg->bodyptr); - break; - } - -#ifdef FEATURE_WLAN_BATCH_SCAN - case WDA_SET_BATCH_SCAN_REQ: - { - WDA_ProcessSetBatchScanReq(pWDA, - (tSirSetBatchScanReq *)pMsg->bodyptr); - break; - } - case WDA_TRIGGER_BATCH_SCAN_RESULT_IND: - { - WDA_ProcessTriggerBatchScanResultInd(pWDA, - (tSirTriggerBatchScanResultInd *)pMsg->bodyptr); - break; - } - case WDA_STOP_BATCH_SCAN_IND: - { - WDA_ProcessStopBatchScanInd(pWDA, - (tSirStopBatchScanInd *)pMsg->bodyptr); - break; - } -#endif - - default: - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "No Handling for msg type %x in WDA " - ,pMsg->type); - /* Do Nothing? MSG Body should be freed at here */ - if(NULL != pMsg->bodyptr) - { - vos_mem_free(pMsg->bodyptr); - } - //WDA_VOS_ASSERT(0) ; - } - } - return status ; -} - -/* - * FUNCTION: WDA_LowLevelIndCallback - * IND API callback from WDI, send Ind to PE - */ -void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd, - void* pUserData ) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData; -#if defined WLAN_FEATURE_NEIGHBOR_ROAMING - tSirRSSINotification rssiNotification; -#endif - if(NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL", __func__); - VOS_ASSERT(0); - return ; - } - - switch(wdiLowLevelInd->wdiIndicationType) - { - case WDI_RSSI_NOTIFICATION_IND: - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI "); -#if defined WLAN_FEATURE_NEIGHBOR_ROAMING - rssiNotification.bReserved = - wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved; - rssiNotification.bRssiThres1NegCross = - wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross; - rssiNotification.bRssiThres1PosCross = - wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross; - rssiNotification.bRssiThres2NegCross = - wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross; - rssiNotification.bRssiThres2PosCross = - wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross; - rssiNotification.bRssiThres3NegCross = - wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross; - rssiNotification.bRssiThres3PosCross = - wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross; - rssiNotification.avgRssi = (v_S7_t) - ((-1)*wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.avgRssi); - WLANTL_BMPSRSSIRegionChangedNotification( - pWDA->pVosContext, - &rssiNotification); -#endif - break ; - } - case WDI_MISSED_BEACON_IND: - { - tpSirSmeMissedBeaconInd pMissBeacInd = - (tpSirSmeMissedBeaconInd)vos_mem_malloc(sizeof(tSirSmeMissedBeaconInd)); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_MISSED_BEACON_IND from WDI "); - /* send IND to PE */ - if(NULL == pMissBeacInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - break; - } - pMissBeacInd->messageType = WDA_MISSED_BEACON_IND; - pMissBeacInd->length = sizeof(tSirSmeMissedBeaconInd); - pMissBeacInd->bssIdx = - wdiLowLevelInd->wdiIndicationData.wdiMissedBeaconInd.bssIdx; - WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, (void *)pMissBeacInd , 0) ; - break ; - } - case WDI_UNKNOWN_ADDR2_FRAME_RX_IND: - { - /* TODO: Decode Ind and send Ind to PE */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI "); - break ; - } - - case WDI_MIC_FAILURE_IND: - { - tpSirSmeMicFailureInd pMicInd = - (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd)); - - if(NULL == pMicInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - break; - } - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_MIC_FAILURE_IND from WDI "); - pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND; - pMicInd->length = sizeof(tSirSmeMicFailureInd); - vos_mem_copy(pMicInd->bssId, - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId, - sizeof(tSirMacAddr)); - vos_mem_copy(pMicInd->info.srcMacAddr, - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr, - sizeof(tSirMacAddr)); - vos_mem_copy(pMicInd->info.taMacAddr, - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr, - sizeof(tSirMacAddr)); - vos_mem_copy(pMicInd->info.dstMacAddr, - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr, - sizeof(tSirMacAddr)); - vos_mem_copy(pMicInd->info.rxMacAddr, - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr, - sizeof(tSirMacAddr)); - pMicInd->info.multicast = - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast; - pMicInd->info.keyId= - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId; - pMicInd->info.IV1= - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1; - vos_mem_copy(pMicInd->info.TSC, - wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE); - WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND, - (void *)pMicInd , 0) ; - break ; - } - case WDI_FATAL_ERROR_IND: - { - pWDA->wdiFailed = true; - /* TODO: Decode Ind and send Ind to PE */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_FATAL_ERROR_IND from WDI "); - break ; - } - case WDI_DEL_STA_IND: - { - tpDeleteStaContext pDelSTACtx = - (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext)); - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_DEL_STA_IND from WDI "); - if(NULL == pDelSTACtx) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - break; - } - vos_mem_copy(pDelSTACtx->addr2, - wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2, - sizeof(tSirMacAddr)); - vos_mem_copy(pDelSTACtx->bssId, - wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID, - sizeof(tSirMacAddr)); - pDelSTACtx->assocId = - wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId; - pDelSTACtx->reasonCode = - wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode; - pDelSTACtx->staId = - wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx; - WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND, - (void *)pDelSTACtx , 0) ; - break ; - } - case WDI_COEX_IND: - { - tANI_U32 index; - vos_msg_t vosMsg; - tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd)); - if(NULL == pSmeCoexInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure-pSmeCoexInd", __func__); - break; - } - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_COEX_IND from WDI "); - /* Message Header */ - pSmeCoexInd->mesgType = eWNI_SME_COEX_IND; - pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd); - /* Info from WDI Indication */ - pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType; - for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++) - { - pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index]; - } - /* VOS message wrapper */ - vosMsg.type = eWNI_SME_COEX_IND; - vosMsg.bodyptr = (void *)pSmeCoexInd; - vosMsg.bodyval = 0; - /* Send message to SME */ - if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - /* free the mem and return */ - vos_mem_free((v_VOID_t *)pSmeCoexInd); - } - else - { - /* DEBUG */ - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)", - pSmeCoexInd->coexIndType, - pSmeCoexInd->coexIndData[0], - pSmeCoexInd->coexIndData[1], - pSmeCoexInd->coexIndData[2], - pSmeCoexInd->coexIndData[3]); - } - break; - } - case WDI_TX_COMPLETE_IND: - { - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ; - /* Calling TxCompleteAck Indication from wda context*/ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Complete Indication received from HAL"); - if( pWDA->pAckTxCbFunc ) - { - if( VOS_STATUS_SUCCESS != - WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Tx Complete timeout Timer Stop Failed "); - } - pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status); - pWDA->pAckTxCbFunc = NULL; - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Tx Complete Indication is received after timeout "); - } - break; - } - case WDI_P2P_NOA_START_IND : - { - tSirP2PNoaStart *pP2pNoaStart = - (tSirP2PNoaStart *)vos_mem_malloc(sizeof(tSirP2PNoaStart)); - - if (NULL == pP2pNoaStart) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Memory allocation failure, " - "WDI_P2P_NOA_START_IND not forwarded"); - break; - } - pP2pNoaStart->status = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaStartInfo.status; - pP2pNoaStart->bssIdx = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaStartInfo.bssIdx; - WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_START_IND, - (void *)pP2pNoaStart , 0) ; - break; - } - -#ifdef FEATURE_WLAN_TDLS - case WDI_TDLS_IND : - { - tSirTdlsInd *pTdlsInd = - (tSirTdlsInd *)vos_mem_malloc(sizeof(tSirTdlsInd)); - - if (NULL == pTdlsInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Memory allocation failure, " - "WDI_TDLS_IND not forwarded"); - break; - } - pTdlsInd->status = - wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.status; - pTdlsInd->assocId = - wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.assocId; - pTdlsInd->staIdx = - wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.staIdx; - pTdlsInd->reasonCode = - wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.reasonCode; - WDA_SendMsg(pWDA, SIR_HAL_TDLS_IND, - (void *)pTdlsInd , 0) ; - break; - } -#endif - case WDI_P2P_NOA_ATTR_IND : - { - tSirP2PNoaAttr *pP2pNoaAttr = - (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr)); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_P2P_NOA_ATTR_IND from WDI"); - if (NULL == pP2pNoaAttr) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Memory allocation failure, " - "WDI_P2P_NOA_ATTR_IND not forwarded"); - break; - } - pP2pNoaAttr->index = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex; - pP2pNoaAttr->oppPsFlag = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag; - pP2pNoaAttr->ctWin = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin; - - pP2pNoaAttr->uNoa1IntervalCnt = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt; - pP2pNoaAttr->uNoa1Duration = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration; - pP2pNoaAttr->uNoa1Interval = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval; - pP2pNoaAttr->uNoa1StartTime = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime; - pP2pNoaAttr->uNoa2IntervalCnt = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt; - pP2pNoaAttr->uNoa2Duration = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration; - pP2pNoaAttr->uNoa2Interval = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval; - pP2pNoaAttr->uNoa2StartTime = - wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime; - WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND, - (void *)pP2pNoaAttr , 0) ; - break; - } -#ifdef FEATURE_WLAN_SCAN_PNO - case WDI_PREF_NETWORK_FOUND_IND: - { - vos_msg_t vosMsg; - v_U32_t size = sizeof(tSirPrefNetworkFoundInd) + - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.frameLength; - tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = - (tSirPrefNetworkFoundInd *)vos_mem_malloc(size); - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Received WDI_PREF_NETWORK_FOUND_IND from WDI"); - if (NULL == pPrefNetworkFoundInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Memory allocation failure, " - "WDI_PREF_NETWORK_FOUND_IND not forwarded"); - if (NULL != - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.pData) - { - wpalMemoryFree( - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.pData - ); - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.pData = NULL; - } - break; - } - /* Message Header */ - pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND; - pPrefNetworkFoundInd->mesgLen = size; - - /* Info from WDI Indication */ - pPrefNetworkFoundInd->ssId.length = - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength; - vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0); - vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId, - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID, - pPrefNetworkFoundInd->ssId.length); - if (NULL != - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.pData) - { - pPrefNetworkFoundInd->frameLength = - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.frameLength; - vos_mem_copy( pPrefNetworkFoundInd->data, - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.pData, - pPrefNetworkFoundInd->frameLength); - wpalMemoryFree(wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.pData); - wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.pData = NULL; - } - else - { - pPrefNetworkFoundInd->frameLength = 0; - } - pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi; - /* VOS message wrapper */ - vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND; - vosMsg.bodyptr = (void *) pPrefNetworkFoundInd; - vosMsg.bodyval = 0; - /* Send message to SME */ - if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - /* free the mem and return */ - vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd); - } - break; - } -#endif // FEATURE_WLAN_SCAN_PNO - -#ifdef WLAN_WAKEUP_EVENTS - case WDI_WAKE_REASON_IND: - { - vos_msg_t vosMsg; - tANI_U32 allocSize = sizeof(tSirWakeReasonInd) - + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1); - tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize); - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)", - wdiLowLevelInd->wdiIndicationType, - wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason, - wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg, - wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen); - - if (NULL == pWakeReasonInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Memory allocation failure, " - "WDI_WAKE_REASON_IND not forwarded"); - break; - } - - vos_mem_zero(pWakeReasonInd, allocSize); - - /* Message Header */ - pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND; - pWakeReasonInd->mesgLen = allocSize; - - /* Info from WDI Indication */ - // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd - pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason; - pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg; - pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen; - pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen; - vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]), - &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]), - wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen); - - /* VOS message wrapper */ - vosMsg.type = eWNI_SME_WAKE_REASON_IND; - vosMsg.bodyptr = (void *) pWakeReasonInd; - vosMsg.bodyval = 0; - - /* Send message to SME */ - if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - /* free the mem and return */ - vos_mem_free((v_VOID_t *) pWakeReasonInd); - } - - break; - } -#endif // WLAN_WAKEUP_EVENTS - - case WDI_TX_PER_HIT_IND: - { - vos_msg_t vosMsg; - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND"); - /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/ - /* VOS message wrapper */ - vosMsg.type = eWNI_SME_TX_PER_HIT_IND; - vosMsg.bodyptr = NULL; - vosMsg.bodyval = 0; - /* Send message to SME */ - if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed"); - } - break; - } -#ifdef FEATURE_WLAN_LPHB - case WDI_LPHB_IND: - { - vos_msg_t vosMsg; - tSirLPHBInd *lphbInd; - - lphbInd = - (tSirLPHBInd *)vos_mem_malloc(sizeof(tSirLPHBInd)); - if (NULL == lphbInd) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: LPHB IND buffer alloc Fail", __func__); - return ; - } - - lphbInd->sessionIdx = - wdiLowLevelInd->wdiIndicationData.wdiLPHBTimeoutInd.sessionIdx; - lphbInd->protocolType = - wdiLowLevelInd->wdiIndicationData.wdiLPHBTimeoutInd.protocolType; - lphbInd->eventReason = - wdiLowLevelInd->wdiIndicationData.wdiLPHBTimeoutInd.eventReason; - - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Get WDI_LPHB_IND bssIdx %d", - wdiLowLevelInd->wdiIndicationData.wdiLPHBTimeoutInd.bssIdx); - - vosMsg.type = eWNI_SME_LPHB_IND; - vosMsg.bodyptr = lphbInd; - vosMsg.bodyval = 0; - /* Send message to SME */ - if (VOS_STATUS_SUCCESS != - vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, - "post WDI_LPHB_WAIT_TIMEOUT_IND to SME Failed"); - vos_mem_free(lphbInd); - } - break; - } -#endif /* FEATURE_WLAN_LPHB */ - case WDI_PERIODIC_TX_PTRN_FW_IND: - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: WDI_PERIODIC_TX_PTRN_FW_IND received, bssIdx: %d, " - "selfStaIdx: %d, status: %d, patternIdBitmap: %d", __func__, - (int)wdiLowLevelInd->wdiIndicationData.wdiPeriodicTxPtrnFwInd.bssIdx, - (int)wdiLowLevelInd->wdiIndicationData.wdiPeriodicTxPtrnFwInd.selfStaIdx, - (int)wdiLowLevelInd->wdiIndicationData.wdiPeriodicTxPtrnFwInd.status, - (int)wdiLowLevelInd->wdiIndicationData.wdiPeriodicTxPtrnFwInd.patternIdBitmap); - - break; - } - - case WDI_IBSS_PEER_INACTIVITY_IND: - { - tSirIbssPeerInactivityInd *pIbssInd = - (tSirIbssPeerInactivityInd *) - vos_mem_malloc(sizeof(tSirIbssPeerInactivityInd)); - - if (NULL == pIbssInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Memory allocation failure, " - "WDI_IBSS_PEER_INACTIVITY_IND not forwarded"); - break; - } - - pIbssInd->bssIdx = - wdiLowLevelInd->wdiIndicationData.wdiIbssPeerInactivityInd.bssIdx; - pIbssInd->staIdx = - wdiLowLevelInd->wdiIndicationData.wdiIbssPeerInactivityInd.staIdx; - vos_mem_copy(pIbssInd->peerAddr, - wdiLowLevelInd->wdiIndicationData.wdiIbssPeerInactivityInd.staMacAddr, - sizeof(tSirMacAddr)); - WDA_SendMsg(pWDA, WDA_IBSS_PEER_INACTIVITY_IND, (void *)pIbssInd, 0) ; - break; - } - -#ifdef FEATURE_WLAN_BATCH_SCAN - case WDI_BATCH_SCAN_RESULT_IND: - { - void *pBatchScanResult; - void *pCallbackContext; - tpAniSirGlobal pMac; - - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH, - "Received WDI_BATCHSCAN_RESULT_IND from FW"); - - /*sanity check*/ - if(NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL", __func__); - VOS_ASSERT(0); - return; - } - - pBatchScanResult = - (void *)wdiLowLevelInd->wdiIndicationData.pBatchScanResult; - if (NULL == pBatchScanResult) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:Batch scan result from FW is null can't invoke HDD callback", - __func__); - VOS_ASSERT(0); - return; - } - - pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - if (NULL == pMac) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pMac is NULL", __func__); - VOS_ASSERT(0); - return; - } - - pCallbackContext = pMac->pmc.batchScanResultCallbackContext; - /*call hdd callback with set batch scan response data*/ - if(pMac->pmc.batchScanResultCallback) - { - pMac->pmc.batchScanResultCallback(pCallbackContext, - pBatchScanResult); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:HDD callback is null", __func__); - VOS_ASSERT(0); - } - break; - } -#endif - - default: - { - /* TODO error */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Received UNKNOWN Indication from WDI "); - } - } - return ; -} - -/* - * BA related processing in WDA. - */ -void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext; - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus) - { - tANI_U8 i = 0 ; - tBaActivityInd *baActivityInd = NULL ; - tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ; - tANI_U8 allocSize = sizeof(tBaActivityInd) - + sizeof(tAddBaCandidate) * (baCandidateCount) ; - WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ; - tAddBaCandidate *baCandidate = NULL ; - baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ; - if(NULL == baActivityInd) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0) ; - return; - } - vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID, - sizeof(tSirMacAddr)) ; - baActivityInd->baCandidateCnt = baCandidateCount ; - - wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ; - baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ; - - for(i = 0 ; i < baCandidateCount ; i++) - { - tANI_U8 tid = 0 ; - vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA, - sizeof(tSirMacAddr)) ; - for(tid = 0 ; tid < STACFG_MAX_TC; tid++) - { - baCandidate->baInfo[tid].fBaEnable = - wdiBaCandidate->wdiBAInfo[tid].fBaEnable ; - baCandidate->baInfo[tid].startingSeqNum = - wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ; - } - wdiBaCandidate++ ; - baCandidate++ ; - } - WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ; - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "BA Trigger RSP with Failure received "); - } - return ; -} - - -/* - * API to activate/deactivate Traffic Stats timer. Traffic stats timer is only needed - * during MCC - */ -void WDA_TrafficStatsTimerActivate(wpt_boolean activate) -{ - wpt_uint32 enabled; - v_VOID_t * pVosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL); - tWDA_CbContext *pWDA = vos_get_context(VOS_MODULE_ID_WDA, pVosContext); - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pVosContext); - - if (NULL == pMac ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid MAC context ", __func__ ); - VOS_ASSERT(0); - return; - } - - if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, &enabled) - != eSIR_SUCCESS) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED"); - return; - } - - if(!enabled) - { - return; - } - - if(NULL == pWDA) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:WDA context is NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(activate) - { - if( VOS_STATUS_SUCCESS != - WDA_START_TIMER(&pWDA->wdaTimers.trafficStatsTimer)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Traffic Stats Timer Start Failed "); - return; - } - WDI_DS_ActivateTrafficStats(); - } - else - { - WDI_DS_DeactivateTrafficStats(); - WDI_DS_ClearTrafficStats(); - - if( VOS_STATUS_SUCCESS != - WDA_STOP_TIMER(&pWDA->wdaTimers.trafficStatsTimer)) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Traffic Stats Timer Stop Failed "); - return; - } - } -} - -/* - * Traffic Stats Timer handler - */ -void WDA_TimerTrafficStatsInd(tWDA_CbContext *pWDA) -{ - WDI_Status wdiStatus; - WDI_TrafficStatsType *pWdiTrafficStats = NULL; - WDI_TrafficStatsIndType trafficStatsIndParams; - wpt_uint32 length, enabled; - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - - if (NULL == pMac ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid MAC context ", __func__ ); - VOS_ASSERT(0); - return; - } - - if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, &enabled) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED"); - return; - } - - if(!enabled) - { - WDI_DS_DeactivateTrafficStats(); - return; - } - - WDI_DS_GetTrafficStats(&pWdiTrafficStats, &length); - - if(pWdiTrafficStats != NULL) - { - trafficStatsIndParams.pTrafficStats = pWdiTrafficStats; - trafficStatsIndParams.length = length; - trafficStatsIndParams.duration = - pWDA->wdaTimers.trafficStatsTimer.initScheduleTimeInMsecs; - trafficStatsIndParams.wdiReqStatusCB = WDA_WdiIndicationCallback; - trafficStatsIndParams.pUserData = pWDA; - - wdiStatus = WDI_TrafficStatsInd(&trafficStatsIndParams); - - if(WDI_STATUS_PENDING == wdiStatus) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Pending received for %s:%d ",__func__,__LINE__ ); - } - else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in %s:%d ",__func__,__LINE__ ); - } - - WDI_DS_ClearTrafficStats(); - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, - "pWdiTrafficStats is Null"); - } - - if( VOS_STATUS_SUCCESS != - WDA_START_TIMER(&pWDA->wdaTimers.trafficStatsTimer)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, - "Traffic Stats Timer Start Failed "); - return; - } -} - -/* - * BA Activity check timer handler - */ -void WDA_BaCheckActivity(tWDA_CbContext *pWDA) -{ - tANI_U8 curSta = 0 ; - tANI_U8 tid = 0 ; - tANI_U8 size = 0 ; - tANI_U8 baCandidateCount = 0 ; - tANI_U8 newBaCandidate = 0 ; - WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ; - - if(NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:pWDA is NULL", __func__); - VOS_ASSERT(0); - return ; - } - if(WDA_MAX_STA < pWDA->wdaMaxSta) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Inconsistent STA entries in WDA"); - VOS_ASSERT(0) ; - } - /* walk through all STA entries and find out TX packet count */ - for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++) - { -#ifdef WLAN_SOFTAP_VSTA_FEATURE - // We can only do BA on "hard" STAs. - if (!(IS_HWSTA_IDX(curSta))) - { - continue; - } -#endif //WLAN_SOFTAP_VSTA_FEATURE - for(tid = 0 ; tid < STACFG_MAX_TC ; tid++) - { - WLANTL_STAStateType tlSTAState ; - tANI_U32 txPktCount = 0 ; - tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ; - if((WDA_VALID_STA_INDEX == validStaIndex) && - (VOS_STATUS_SUCCESS == WDA_TL_GET_STA_STATE( pWDA->pVosContext, - curSta, &tlSTAState)) && - (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext, - curSta, tid, &txPktCount))) - { -#if 0 - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW, - "************* %d:%d, %d ",curSta, txPktCount, - pWDA->wdaStaInfo[curSta].framesTxed[tid]); -#endif - if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid) - && (WLANTL_STA_AUTHENTICATED == tlSTAState) - && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA, - curSta, tid))) - { - /* get prepare for sending message to HAL */ - //baCandidate[baCandidateCount].staIdx = curSta ; - baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ; - newBaCandidate = WDA_ENABLE_BA ; - } - pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ; - } - } - /* fill the entry for all the sta with given TID's */ - if(WDA_ENABLE_BA == newBaCandidate) - { - /* move to next BA candidate */ - baCandidate[baCandidateCount].ucSTAIdx = curSta ; - size += sizeof(WDI_TriggerBAReqCandidateType) ; - baCandidateCount++ ; - newBaCandidate = WDA_DISABLE_BA ; - } - } - /* prepare and send message to hal */ - if( 0 < baCandidateCount) - { - WDI_Status status = WDI_STATUS_SUCCESS ; - WDI_TriggerBAReqParamsType *wdiTriggerBaReq; - tWDA_ReqParams *pWdaParams = - (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0) ; - return; - } - wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *) - vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ; - if(NULL == wdiTriggerBaReq) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0) ; - vos_mem_free(pWdaParams); - return; - } - do - { - WDI_TriggerBAReqinfoType *triggerBaInfo = - &wdiTriggerBaReq->wdiTriggerBAInfoType ; - triggerBaInfo->usBACandidateCnt = baCandidateCount ; - /* TEMP_FIX: Need to see if WDI need check for assoc session for - * for each request */ - triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ; - triggerBaInfo->ucBASessionID = 0; - vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ; - } while(0) ; - wdiTriggerBaReq->wdiReqStatusCB = NULL ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ; - pWdaParams->wdaMsgParam = NULL; - status = WDI_TriggerBAReq(wdiTriggerBaReq, - WDA_TriggerBaReqCallback, pWdaParams) ; - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Trigger BA REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW, - "There is no TID for initiating BA"); - } - if( VOS_STATUS_SUCCESS != - WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "BA Activity Timer Stop Failed "); - return ; - } - if( VOS_STATUS_SUCCESS != - WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "BA Activity Timer Start Failed "); - return; - } - return ; -} -/* - * WDA common routine to create timer used by WDA. - */ -static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS ; - tANI_U32 val = 0 ; - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext); - - if(NULL == pMac) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:MAC context is NULL", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val ) - != eSIR_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA"); - return VOS_STATUS_E_FAILURE; - } - val = SYS_MS_TO_TICKS(val) ; - - /* BA activity check timer */ - status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr, - "BA Activity Check timer", WDA_TimerHandler, - WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ; - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to create BA activity timer"); - return VOS_STATUS_E_FAILURE ; - } - val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ; - /* Tx Complete Timeout timer */ - status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer, - "Tx Complete Check timer", WDA_TimerHandler, - WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ; - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to create Tx Complete Timeout timer"); - /* Destroy timer of BA activity check timer */ - status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr); - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to Destroy BA activity timer"); - return VOS_STATUS_E_FAILURE ; - } - return VOS_STATUS_E_FAILURE ; - } - - val = SYS_MS_TO_TICKS( WDA_TRAFFIC_STATS_TIME_OUT_VALUE ); - - /* Traffic Stats timer */ - status = WDA_CREATE_TIMER(&pWDA->wdaTimers.trafficStatsTimer, - "Traffic Stats timer", WDA_TimerHandler, - WDA_TIMER_TRAFFIC_STATS_IND, val, val, TX_NO_ACTIVATE) ; - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to create traffic stats timer"); - /* Destroy timer of BA activity check timer */ - status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr); - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to Destroy BA activity timer"); - } - /* Destroy timer of tx complete timer */ - status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer); - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to Tx complete timer"); - } - return VOS_STATUS_E_FAILURE ; - } - return VOS_STATUS_SUCCESS ; -} -/* - * WDA common routine to destroy timer used by WDA. - */ -static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA) -{ - VOS_STATUS status = VOS_STATUS_SUCCESS ; - status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer); - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to Destroy Tx Complete Timeout timer"); - return eSIR_FAILURE ; - } - status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr); - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to Destroy BA activity timer"); - return eSIR_FAILURE ; - } - status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.trafficStatsTimer); - if(status != TX_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Unable to Destroy traffic stats timer"); - return eSIR_FAILURE ; - } - return eSIR_SUCCESS ; -} -/* - * WDA timer handler. - */ -void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo) -{ - VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; - vos_msg_t wdaMsg = {0} ; - /* - * trigger CFG download in WDA by sending WDA_CFG_DNLD message - */ - wdaMsg.type = timerInfo ; - wdaMsg.bodyptr = NULL; - wdaMsg.bodyval = 0; - /* post the message.. */ - vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg ); - if ( !VOS_IS_STATUS_SUCCESS(vosStatus) ) - { - vosStatus = VOS_STATUS_E_BADMSG; - } -} -/* - * WDA Tx Complete timeout Indication. - */ -void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA) -{ - tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ; - if( pWDA->pAckTxCbFunc ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "TxComplete timer expired"); - pWDA->pAckTxCbFunc( pMac, 0); - pWDA->pAckTxCbFunc = NULL; - } - else - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "There is no request pending for TxComplete and wait timer expired"); - } -} -/* - * WDA Set REG Domain to VOS NV - */ -eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId, - tAniBool sendRegHint) -{ - if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId, sendRegHint)) - { - return eHAL_STATUS_INVALID_PARAMETER; - } - return eHAL_STATUS_SUCCESS; -} - -#ifdef FEATURE_WLAN_SCAN_PNO -/* - * FUNCTION: WDA_PNOScanRespCallback - * - */ -void WDA_PNOScanRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - return ; -} -/* - * FUNCTION: WDA_PNOScanReqCallback - * Free memory. - * Invoked when PNOScan REQ failed in WDI and no RSP callback is generated. - */ -void WDA_PNOScanReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_UpdateScanParamsRespCallback - * - */ -void WDA_UpdateScanParamsRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - return ; -} -/* - * FUNCTION: WDA_UpdateScanParamsReqCallback - * Free memory. - * Invoked when UpdateScanParams REQ failed in WDI and no RSP callback is generated. - */ -void WDA_UpdateScanParamsReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessSetPreferredNetworkList - * Request to WDI to set Preferred Network List.Offload - */ -VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA, - tSirPNOScanReq *pPNOScanReqParams) -{ - WDI_Status status; - WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo = - (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - v_U8_t i; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pwdiPNOScanReqInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiPNOScanReqInfo); - return VOS_STATUS_E_NOMEM; - } - // - // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams - // - pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable; - pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO; - pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount = - ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )? - pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ; - for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++) - { - vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i], - &pPNOScanReqParams->aNetworks[i], - sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i])); - } - /*Scan timer intervals*/ - vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers, - &pPNOScanReqParams->scanTimers, - sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers)); - /*Probe template for 2.4GHz band*/ - pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize = - (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)? - pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE; - vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate, - pPNOScanReqParams->p24GProbeTemplate, - pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize); - /*Probe template for 5GHz band*/ - pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize = - (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)? - pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE; - vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate, - pPNOScanReqParams->p5GProbeTemplate, - pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize); - pwdiPNOScanReqInfo->wdiReqStatusCB = WDA_PNOScanReqCallback; - pwdiPNOScanReqInfo->pUserData = pWdaParams; - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pPNOScanReqParams; - status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo, - (WDI_PNOScanCb)WDA_PNOScanRespCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set PNO REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - pWdaParams->wdaWdiApiMsgParam = NULL; - pWdaParams->wdaMsgParam = NULL; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} - -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD - -void WDA_ConvertSirAuthToWDIAuth(WDI_AuthType *AuthType, v_U8_t csrAuthType) -{ - /*Convert the CSR Auth types to WDI Auth types */ - switch (csrAuthType) - { - case eCSR_AUTH_TYPE_OPEN_SYSTEM: - *AuthType = eWDA_AUTH_TYPE_OPEN_SYSTEM; - break; -#ifdef FEATURE_WLAN_ESE - case eCSR_AUTH_TYPE_CCKM_WPA: - *AuthType = eWDA_AUTH_TYPE_CCKM_WPA; - break; -#endif - case eCSR_AUTH_TYPE_WPA: - *AuthType = eWDA_AUTH_TYPE_WPA; - break; - case eCSR_AUTH_TYPE_WPA_PSK: - *AuthType = eWDA_AUTH_TYPE_WPA_PSK; - break; -#ifdef FEATURE_WLAN_ESE - case eCSR_AUTH_TYPE_CCKM_RSN: - *AuthType = eWDA_AUTH_TYPE_CCKM_RSN; - break; -#endif - case eCSR_AUTH_TYPE_RSN: - *AuthType = eWDA_AUTH_TYPE_RSN; - break; - case eCSR_AUTH_TYPE_RSN_PSK: - *AuthType = eWDA_AUTH_TYPE_RSN_PSK; - break; -#if defined WLAN_FEATURE_VOWIFI_11R - case eCSR_AUTH_TYPE_FT_RSN: - *AuthType = eWDA_AUTH_TYPE_FT_RSN; - break; - case eCSR_AUTH_TYPE_FT_RSN_PSK: - *AuthType = eWDA_AUTH_TYPE_FT_RSN_PSK; - break; -#endif -#ifdef FEATURE_WLAN_WAPI - case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE: - *AuthType = eWDA_AUTH_TYPE_WAPI_WAI_CERTIFICATE; - break; - case eCSR_AUTH_TYPE_WAPI_WAI_PSK: - *AuthType = eWDA_AUTH_TYPE_WAPI_WAI_PSK; - break; -#endif /* FEATURE_WLAN_WAPI */ - case eCSR_AUTH_TYPE_SHARED_KEY: - case eCSR_AUTH_TYPE_AUTOSWITCH: - *AuthType = eWDA_AUTH_TYPE_OPEN_SYSTEM; - break; -#if 0 - case eCSR_AUTH_TYPE_SHARED_KEY: - *AuthType = eWDA_AUTH_TYPE_SHARED_KEY; - break; - case eCSR_AUTH_TYPE_AUTOSWITCH: - *AuthType = eWDA_AUTH_TYPE_AUTOSWITCH; -#endif - default: - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Unknown Auth Type", __func__); - break; - } -} -void WDA_ConvertSirEncToWDIEnc(WDI_EdType *EncrType, v_U8_t csrEncrType) -{ - switch (csrEncrType) - { - case eCSR_ENCRYPT_TYPE_NONE: - *EncrType = WDI_ED_NONE; - break; - case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY: - case eCSR_ENCRYPT_TYPE_WEP40: - *EncrType = WDI_ED_WEP40; - break; - case eCSR_ENCRYPT_TYPE_WEP104: - case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY: - *EncrType = WDI_ED_WEP104; - break; - case eCSR_ENCRYPT_TYPE_TKIP: - *EncrType = WDI_ED_TKIP; - break; - case eCSR_ENCRYPT_TYPE_AES: - *EncrType = WDI_ED_CCMP; - break; -#ifdef WLAN_FEATURE_11W - case eCSR_ENCRYPT_TYPE_AES_CMAC: - *EncrType = WDI_ED_AES_128_CMAC; - break; -#endif -#ifdef FEATURE_WLAN_WAPI - case eCSR_ENCRYPT_TYPE_WPI: - *EncrType = WDI_ED_WPI; - break; -#endif - case eCSR_ENCRYPT_TYPE_ANY: - *EncrType = WDI_ED_ANY; - break; - - default: - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Unknown Encryption Type", __func__); - break; - } -} - -/* - * FUNCTION: WDA_ProcessRoamScanOffloadReq - * Request to WDI to set Roam Offload Scan - */ -VOS_STATUS WDA_ProcessRoamScanOffloadReq(tWDA_CbContext *pWDA, - tSirRoamOffloadScanReq *pRoamOffloadScanReqParams) -{ - WDI_Status status; - WDI_RoamScanOffloadReqParamsType *pwdiRoamScanOffloadReqParams = - (WDI_RoamScanOffloadReqParamsType *)vos_mem_malloc(sizeof(WDI_RoamScanOffloadReqParamsType)); - tWDA_ReqParams *pWdaParams ; - v_U8_t csrAuthType; - WDI_RoamNetworkType *pwdiRoamNetworkType; - WDI_RoamOffloadScanInfo *pwdiRoamOffloadScanInfo; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if (NULL == pwdiRoamScanOffloadReqParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiRoamScanOffloadReqParams); - return VOS_STATUS_E_NOMEM; - } - - pwdiRoamNetworkType = - &pwdiRoamScanOffloadReqParams->wdiRoamOffloadScanInfo.ConnectedNetwork; - pwdiRoamOffloadScanInfo = - &pwdiRoamScanOffloadReqParams->wdiRoamOffloadScanInfo; - vos_mem_zero (pwdiRoamScanOffloadReqParams,sizeof(WDI_RoamScanOffloadReqParamsType)); - csrAuthType = pRoamOffloadScanReqParams->ConnectedNetwork.authentication; - pwdiRoamOffloadScanInfo->RoamScanOffloadEnabled = - pRoamOffloadScanReqParams->RoamScanOffloadEnabled; - vos_mem_copy(pwdiRoamNetworkType->currAPbssid, - pRoamOffloadScanReqParams->ConnectedNetwork.currAPbssid, - sizeof(pwdiRoamNetworkType->currAPbssid)); - WDA_ConvertSirAuthToWDIAuth(&pwdiRoamNetworkType->authentication, - csrAuthType); - WDA_ConvertSirEncToWDIEnc(&pwdiRoamNetworkType->encryption, - pRoamOffloadScanReqParams->ConnectedNetwork.encryption); - WDA_ConvertSirEncToWDIEnc(&pwdiRoamNetworkType->mcencryption, - pRoamOffloadScanReqParams->ConnectedNetwork.mcencryption); - pwdiRoamOffloadScanInfo->LookupThreshold = - pRoamOffloadScanReqParams->LookupThreshold ; - pwdiRoamOffloadScanInfo->RoamRssiDiff = - pRoamOffloadScanReqParams->RoamRssiDiff ; - pwdiRoamOffloadScanInfo->MAWCEnabled = - pRoamOffloadScanReqParams->MAWCEnabled ; - pwdiRoamOffloadScanInfo->Command = - pRoamOffloadScanReqParams->Command ; - pwdiRoamOffloadScanInfo->StartScanReason = - pRoamOffloadScanReqParams->StartScanReason ; - pwdiRoamOffloadScanInfo->NeighborScanTimerPeriod = - pRoamOffloadScanReqParams->NeighborScanTimerPeriod ; - pwdiRoamOffloadScanInfo->NeighborRoamScanRefreshPeriod = - pRoamOffloadScanReqParams->NeighborRoamScanRefreshPeriod ; - pwdiRoamOffloadScanInfo->NeighborScanChannelMinTime = - pRoamOffloadScanReqParams->NeighborScanChannelMinTime ; - pwdiRoamOffloadScanInfo->NeighborScanChannelMaxTime = - pRoamOffloadScanReqParams->NeighborScanChannelMaxTime ; - pwdiRoamOffloadScanInfo->EmptyRefreshScanPeriod = - pRoamOffloadScanReqParams->EmptyRefreshScanPeriod ; - pwdiRoamOffloadScanInfo->IsESEEnabled = - pRoamOffloadScanReqParams->IsESEEnabled ; - vos_mem_copy(&pwdiRoamNetworkType->ssId.sSSID, - &pRoamOffloadScanReqParams->ConnectedNetwork.ssId.ssId, - pRoamOffloadScanReqParams->ConnectedNetwork.ssId.length); - pwdiRoamNetworkType->ssId.ucLength = - pRoamOffloadScanReqParams->ConnectedNetwork.ssId.length; - vos_mem_copy(pwdiRoamNetworkType->ChannelCache, - pRoamOffloadScanReqParams->ConnectedNetwork.ChannelCache, - pRoamOffloadScanReqParams->ConnectedNetwork.ChannelCount); - pwdiRoamNetworkType->ChannelCount = - pRoamOffloadScanReqParams->ConnectedNetwork.ChannelCount; - pwdiRoamOffloadScanInfo->ChannelCacheType = - pRoamOffloadScanReqParams->ChannelCacheType; - vos_mem_copy(pwdiRoamOffloadScanInfo->ValidChannelList, - pRoamOffloadScanReqParams->ValidChannelList, - pRoamOffloadScanReqParams->ValidChannelCount); - pwdiRoamOffloadScanInfo->ValidChannelCount = - pRoamOffloadScanReqParams->ValidChannelCount; - pwdiRoamOffloadScanInfo->us24GProbeSize = - (pRoamOffloadScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)? - pRoamOffloadScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE; - vos_mem_copy(&pwdiRoamOffloadScanInfo->a24GProbeTemplate, - pRoamOffloadScanReqParams->p24GProbeTemplate, - pwdiRoamOffloadScanInfo->us24GProbeSize); - pwdiRoamOffloadScanInfo->us5GProbeSize = - (pRoamOffloadScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)? - pRoamOffloadScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE; - vos_mem_copy(&pwdiRoamOffloadScanInfo->a5GProbeTemplate, - pRoamOffloadScanReqParams->p5GProbeTemplate, - pwdiRoamOffloadScanInfo->us5GProbeSize); - pwdiRoamOffloadScanInfo->MDID.mdiePresent = - pRoamOffloadScanReqParams->MDID.mdiePresent; - pwdiRoamOffloadScanInfo->MDID.mobilityDomain = - pRoamOffloadScanReqParams->MDID.mobilityDomain; - pwdiRoamOffloadScanInfo->nProbes = - pRoamOffloadScanReqParams->nProbes; - pwdiRoamOffloadScanInfo->HomeAwayTime = - pRoamOffloadScanReqParams->HomeAwayTime; - pwdiRoamScanOffloadReqParams->wdiReqStatusCB = NULL; - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRoamScanOffloadReqParams; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pRoamOffloadScanReqParams; - status = WDI_RoamScanOffloadReq(pwdiRoamScanOffloadReqParams, - (WDI_RoamOffloadScanCb)WDA_RoamOffloadScanReqCallback, pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Start Roam Candidate Lookup Req WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - pWdaParams->wdaWdiApiMsgParam = NULL; - pWdaParams->wdaMsgParam = NULL; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif - -/* - * FUNCTION: WDA_RssiFilterRespCallback - * - */ -void WDA_RssiFilterRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - return ; -} -/* - * FUNCTION: WDA_RssiFilterReqCallback - * Free memory. - * Invoked when RSSIFilter REQ failed in WDI and no RSP callback is generated. - */ -void WDA_RssiFilterReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessSetPreferredNetworkList - * Request to WDI to set Preferred Network List.Offload - */ -VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA, - tSirSetRSSIFilterReq* pRssiFilterParams) -{ - WDI_Status status; - WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo = - (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pwdiSetRssiFilterReqInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiSetRssiFilterReqInfo); - return VOS_STATUS_E_NOMEM; - } - pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold; - pwdiSetRssiFilterReqInfo->wdiReqStatusCB = WDA_RssiFilterReqCallback; - pwdiSetRssiFilterReqInfo->pUserData = pWdaParams; - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pRssiFilterParams; - status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo, - (WDI_PNOScanCb)WDA_RssiFilterRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set RSSI Filter REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - pWdaParams->wdaWdiApiMsgParam = NULL; - pWdaParams->wdaMsgParam = NULL; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} - -/* - * FUNCTION: WDA_ProcessUpdateScanParams - * Request to WDI to update Scan Parameters - */ -VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA, - tSirUpdateScanParams *pUpdateScanParams) -{ - WDI_Status status; - WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType = - (WDI_UpdateScanParamsInfoType *)vos_mem_malloc( - sizeof(WDI_UpdateScanParamsInfoType)) ; - tWDA_ReqParams *pWdaParams ; - v_U8_t i; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == wdiUpdateScanParamsInfoType) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if ( NULL == pWdaParams ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiUpdateScanParamsInfoType); - return VOS_STATUS_E_NOMEM; - } - // - // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams - // - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Update Scan Parameters b11dEnabled %d b11dResolved %d " - "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime" - " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof " - "sir struct %zu wdi struct %zu", - pUpdateScanParams->b11dEnabled, - pUpdateScanParams->b11dResolved, - pUpdateScanParams->ucChannelCount, - pUpdateScanParams->usPassiveMinChTime, - pUpdateScanParams->usPassiveMaxChTime, - pUpdateScanParams->usActiveMinChTime, - pUpdateScanParams->usActiveMaxChTime, - sizeof(tSirUpdateScanParams), - sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) ); - - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled = - pUpdateScanParams->b11dEnabled; - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved = - pUpdateScanParams->b11dResolved; - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState = - pUpdateScanParams->ucCBState; - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime = - pUpdateScanParams->usActiveMaxChTime; - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime = - pUpdateScanParams->usActiveMinChTime; - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime = - pUpdateScanParams->usPassiveMaxChTime; - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime = - pUpdateScanParams->usPassiveMinChTime; - - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount = - (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS_EX)? - pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS_EX; - - for ( i = 0; i < - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ; - i++) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Update Scan Parameters channel: %d", - pUpdateScanParams->aChannels[i]); - - wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] = - pUpdateScanParams->aChannels[i]; - } - - wdiUpdateScanParamsInfoType->wdiReqStatusCB = WDA_UpdateScanParamsReqCallback; - wdiUpdateScanParamsInfoType->pUserData = pWdaParams; - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pUpdateScanParams; - - - - status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType, - (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Update Scan Params EQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif // FEATURE_WLAN_SCAN_PNO - -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD -/* - * FUNCTION: WDA_RoamOffloadScanReqCallback - * - */ -void WDA_RoamOffloadScanReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - vos_msg_t vosMsg; - wpt_uint8 reason = 0; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - if ( pWdaParams != NULL ) - { - if ( pWdaParams->wdaWdiApiMsgParam != NULL ) - { - reason = ((WDI_RoamScanOffloadReqParamsType *)pWdaParams->wdaWdiApiMsgParam)->wdiRoamOffloadScanInfo.StartScanReason; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - } - if ( pWdaParams->wdaMsgParam != NULL) - { - vos_mem_free(pWdaParams->wdaMsgParam); - } - - vos_mem_free(pWdaParams) ; - } - vosMsg.type = eWNI_SME_ROAM_SCAN_OFFLOAD_RSP; - vosMsg.bodyptr = NULL; - if (WDI_STATUS_SUCCESS != status) - { - reason = 0; - } - vosMsg.bodyval = reason; - if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - /* free the mem and return */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s: Failed to post the rsp to UMAC", __func__); - } - - return ; -} -#endif - -/* - * FUNCTION: WDA_SetPowerParamsRespCallback - * - */ -void WDA_SetPowerParamsRespCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - - return; -} -/* - * FUNCTION: WDA_SetPowerParamsReqCallback - * Free memory. - * Invoked when SetPowerParams REQ failed in WDI and no RSP callback is generated. - */ -void WDA_SetPowerParamsReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} - -#ifdef WLAN_FEATURE_PACKET_FILTERING -/* - * FUNCTION: WDA_8023MulticastListRespCallback - * - */ -void WDA_8023MulticastListRespCallback( - WDI_RcvFltPktSetMcListRspParamsType *pwdiRcvFltPktSetMcListRspInfo, - void * pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_8023MulticastListRespCallback invoked " ); - return ; -} -/* - * FUNCTION: WDA_8023MulticastListReqCallback - * Free memory. - * Invoked when 8023MulticastList REQ failed in WDI and no RSP callback is generated. - */ -void WDA_8023MulticastListReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_Process8023MulticastListReq - * Request to WDI to add 8023 Multicast List - */ -VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA, - tSirRcvFltMcAddrList *pRcvFltMcAddrList) -{ - WDI_Status status; - WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL; - tWDA_ReqParams *pWdaParams ; - tANI_U8 i; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - pwdiFltPktSetMcListReqParamsType = - (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc( - sizeof(WDI_RcvFltPktSetMcListReqParamsType) - ) ; - if(NULL == pwdiFltPktSetMcListReqParamsType) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - vos_mem_free(pwdiFltPktSetMcListReqParamsType); - return VOS_STATUS_E_NOMEM; - } - - // - // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList - // - pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt = - pRcvFltMcAddrList->ulMulticastAddrCnt; - - vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr, - pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr)); - vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId, - pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr)); - - for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ ) - { - vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]), - &(pRcvFltMcAddrList->multicastAddr[i]), - sizeof(tSirMacAddr)); - } - pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = WDA_8023MulticastListReqCallback; - pwdiFltPktSetMcListReqParamsType->pUserData = pWdaParams; - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pRcvFltMcAddrList; - status = WDI_8023MulticastListReq( - pwdiFltPktSetMcListReqParamsType, - (WDI_8023MulticastListCb)WDA_8023MulticastListRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in WDA_Process8023MulticastListReq(), free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_ReceiveFilterSetFilterRespCallback - * - */ -void WDA_ReceiveFilterSetFilterRespCallback( - WDI_SetRcvPktFilterRspParamsType *pwdiSetRcvPktFilterRspInfo, - void * pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - /*WDA_VOS_ASSERT(NULL != pWdaParams);*/ - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_ReceiveFilterSetFilterRespCallback invoked " ); - return ; -} - -/* - * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback - * Free memory. - * Invoked when ReceiveFilterSetFilter REQ failed in WDI and no RSP callback is generated. - */ -void WDA_ReceiveFilterSetFilterReqCallback(WDI_Status wdiStatus, - void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", - __func__, wdiStatus); - - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid pWdaParams pointer", __func__); - VOS_ASSERT(0); - return; - } - - if (IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} - -/* - * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq - * Request to WDI to set Receive Filters - */ -VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA, - tSirRcvPktFilterCfgType *pRcvPktFilterCfg) -{ - WDI_Status status; - v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) + - ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams)); - WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType = - (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ; - tWDA_ReqParams *pWdaParams ; - tANI_U8 i; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pwdiSetRcvPktFilterReqParamsType) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiSetRcvPktFilterReqParamsType); - return VOS_STATUS_E_NOMEM; - } - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId; - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType; - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams; - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime; - vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr, - pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr)); - - vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId, - pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr)); - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "FID %d FT %d NParams %d CT %d", - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId, - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType, - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams, - pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime); - for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ ) - { - wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i], - &pRcvPktFilterCfg->paramsData[i], - sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i])); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Proto %d Comp Flag %d", - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].protocolLayer, - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].cmpFlag); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Data Offset %d Data Len %d", - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataOffset, - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataLength); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "CData: %d:%d:%d:%d:%d:%d", - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].compareData[0], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].compareData[1], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].compareData[2], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].compareData[3], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].compareData[4], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].compareData[5]); - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "MData: %d:%d:%d:%d:%d:%d", - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataMask[0], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataMask[1], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataMask[2], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataMask[3], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataMask[4], - pwdiSetRcvPktFilterReqParamsType-> - wdiPktFilterCfg.paramsData[i].dataMask[5]); - } - pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = WDA_ReceiveFilterSetFilterReqCallback; - pwdiSetRcvPktFilterReqParamsType->pUserData = pWdaParams; - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pRcvPktFilterCfg; - status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType, - (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in SetFilter(),free all the memory,status %d ",status); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_FilterMatchCountRespCallback - * - */ -void WDA_FilterMatchCountRespCallback( - WDI_RcvFltPktMatchCntRspParamsType *pwdiRcvFltPktMatchRspParams, - void * pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - tWDA_CbContext *pWDA; - tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq; - tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp = - vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp)); - tANI_U8 i; - vos_msg_t vosMsg; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - /*WDA_VOS_ASSERT(NULL != pWdaParams);*/ - - if(NULL == pRcvFltPktMatchCntRsp) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pRcvFltPktMatchCntRsp is NULL", __func__); - VOS_ASSERT(0) ; - vos_mem_free(pWdaParams); - return ; - } - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - vos_mem_free(pRcvFltPktMatchCntRsp); - return ; - } - pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ; - pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam; - // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq - vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp)); - - /* Message Header */ - pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP; - pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp); - - pRcvFltPktMatchCntRsp->status = pwdiRcvFltPktMatchRspParams->wdiStatus; - - for (i = 0; i < SIR_MAX_NUM_FILTERS; i++) - { - pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId; - pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt; - } - /* VOS message wrapper */ - vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP; - vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp; - vosMsg.bodyval = 0; - if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg)) - { - /* free the mem and return */ - vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp); - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - - return; -} -/* - * FUNCTION: WDA_FilterMatchCountReqCallback - * Free memory and send RSP back to SME. - * Invoked when FilterMatchCount REQ failed in WDI and no RSP callback is generated. - */ -void WDA_FilterMatchCountReqCallback(WDI_Status wdiStatus, void * pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - vos_msg_t vosMsg; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0); - return; - } - - /* VOS message wrapper */ - vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP; - vosMsg.bodyptr = NULL; - vosMsg.bodyval = 0; - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg); - } - - return; -} -/* - * FUNCTION: WDA_ProcessPacketFilterMatchCountReq - * Request to WDI to get PC Filter Match Count - */ -VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp) -{ - WDI_Status status; - WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType = - (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType)); - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pwdiRcvFltPktMatchCntReqParamsType) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType); - return VOS_STATUS_E_NOMEM; - } - - pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = WDA_FilterMatchCountReqCallback; - pwdiRcvFltPktMatchCntReqParamsType->pUserData = pWdaParams; - - vos_mem_copy( pwdiRcvFltPktMatchCntReqParamsType->bssId, - pRcvFltPktMatchRsp->bssId, - sizeof(wpt_macAddr)); - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp; - status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType, - (WDI_FilterMatchCountCb)WDA_FilterMatchCountRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - /* failure returned by WDI API */ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in WDI_FilterMatchCountReq(), free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - pRcvFltPktMatchRsp->status = eSIR_FAILURE ; - WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -/* - * FUNCTION: WDA_ReceiveFilterClearFilterRespCallback - * - */ -void WDA_ReceiveFilterClearFilterRespCallback( - WDI_RcvFltPktClearRspParamsType *pwdiRcvFltPktClearRspParamsType, - void * pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); -/* WDA_VOS_ASSERT(NULL != pWdaParams); */ - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - //print a msg, nothing else to do - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "WDA_ReceiveFilterClearFilterRespCallback invoked " ); - return ; -} -/* - * FUNCTION: WDA_ReceiveFilterClearFilterReqCallback - * Free memory. - * Invoked when ReceiveFilterClearFilter REQ failed in WDI and no RSP callback is generated. - */ -void WDA_ReceiveFilterClearFilterReqCallback(WDI_Status wdiStatus, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s, wdiStatus: %d", __func__, wdiStatus); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid pWdaParams pointer", __func__); - VOS_ASSERT(0); - return; - } - - if(IS_WDI_STATUS_FAILURE(wdiStatus)) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return; -} -/* - * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq - * Request to WDI to clear Receive Filters - */ -VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA, - tSirRcvFltPktClearParam *pRcvFltPktClearParam) -{ - WDI_Status status; - WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType = - (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType)); - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pwdiRcvFltPktClearReqParamsType) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiRcvFltPktClearReqParamsType); - return VOS_STATUS_E_NOMEM; - } - pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status; - pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId; - vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr, - pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr)); - vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId, - pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr)); - - pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = WDA_ReceiveFilterClearFilterReqCallback; - pwdiRcvFltPktClearReqParamsType->pUserData = pWdaParams; - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pRcvFltPktClearParam; - status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType, - (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif // WLAN_FEATURE_PACKET_FILTERING - -/* - * FUNCTION: WDA_ProcessSetPowerParamsReq - * Request to WDI to set power params - */ -VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA, - tSirSetPowerParamsReq *pPowerParams) -{ - WDI_Status status; - WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo = - (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ; - tWDA_ReqParams *pWdaParams ; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if(NULL == pwdiSetPowerParamsReqInfo) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pwdiSetPowerParamsReqInfo); - return VOS_STATUS_E_NOMEM; - } - - - pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM = - pPowerParams->uIgnoreDTIM; - pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod = - pPowerParams->uDTIMPeriod; - pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval = - pPowerParams->uListenInterval; - pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter = - pPowerParams->uBcastMcastFilter; - pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET = - pPowerParams->uEnableBET; - pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval = - pPowerParams->uBETInterval; - pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uMaxLIModulatedDTIM = - pPowerParams->uMaxLIModulatedDTIM; - pwdiSetPowerParamsReqInfo->wdiReqStatusCB = WDA_SetPowerParamsReqCallback; - pwdiSetPowerParamsReqInfo->pUserData = pWdaParams; - - /* Store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo; - pWdaParams->pWdaContext = pWDA; - /* Store param pointer as passed in by caller */ - pWdaParams->wdaMsgParam = pPowerParams; - status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo, - (WDI_SetPowerParamsCb)WDA_SetPowerParamsRespCallback, - pWdaParams); - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in Set power params REQ WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - pWdaParams->wdaWdiApiMsgParam = NULL; - pWdaParams->wdaMsgParam = NULL; - } - return CONVERT_WDI2VOS_STATUS(status) ; -} - -/* - * FUNCTION: WDA_SetTmLevelRspCallback - * Set TM Level response - */ -void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - /* Dose not need to send notification to upper layer - * Just free allocated resources */ - if( pWdaParams != NULL ) - { - if( pWdaParams->wdaWdiApiMsgParam != NULL ) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - } - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams) ; - } -} - -/* - * FUNCTION: WDA_ProcessSetTmLevelReq - * Set TM Level request - */ -VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA, - tAniSetTmLevelReq *setTmLevelReq) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - tWDA_ReqParams *pWdaParams ; - WDI_SetTmLevelReqType *wdiSetTmLevelReq = - (WDI_SetTmLevelReqType *)vos_mem_malloc( - sizeof(WDI_SetTmLevelReqType)) ; - if(NULL == wdiSetTmLevelReq) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiSetTmLevelReq); - return VOS_STATUS_E_NOMEM; - } - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - - wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode; - wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel; - - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = setTmLevelReq; - pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq; - - status = WDI_SetTmLevelReq(wdiSetTmLevelReq, - (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure setting thermal mitigation level, freeing memory" ); - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - } - - return CONVERT_WDI2VOS_STATUS(status) ; -} - -VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA, - tpTxControlParams pTxCtrlParam) -{ - VOS_STATUS wdaStatus; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " ,__func__); - if( pTxCtrlParam == NULL ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Input tpTxControlParams is NULL", __func__); - return VOS_STATUS_E_FAILURE; - } - if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE ) - { - wdaStatus = WDA_SuspendDataTx(pWDA); - } - else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */ - { - wdaStatus = WDA_ResumeDataTx(pWDA); - } - return wdaStatus; -} - - /* FUNCTION WDA_featureCapsExchange - * WDA API to invoke capability exchange between host and FW. - */ -void WDA_featureCapsExchange(v_PVOID_t pVosContext) -{ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s:enter", __func__ ); - WDI_featureCapsExchangeReq( NULL, pVosContext); -} - -/* FUNCTION WDA_disableCapablityFeature - * WDA API to diable Active mode offload in host. - */ -void WDA_disableCapablityFeature(tANI_U8 feature_index) -{ - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "%s:enter", __func__ ); - WDI_disableCapablityFeature(feature_index); -} - - /* FUNCTION WDA_getHostWlanFeatCaps - * Wrapper for WDI API, that will return if the feature (enum value).passed - * to this API is supported or not in Host - * return value - * 0 - implies feature is NOT Supported - * any non zero value - implies feature is SUPPORTED - */ -tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue) -{ - return WDI_getHostWlanFeatCaps(featEnumValue); -} - - /* FUNCTION WDA_getFwWlanFeatCaps - * Wrapper for WDI API, that will return if the feature (enum value).passed - * to this API is supported or not in FW - * return value - * 0 - implies feature is NOT Supported - * any non zero value - implies feature is SUPPORTED - */ -tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue) -{ - return WDI_getFwWlanFeatCaps(featEnumValue); -} - - -/* - * FUNCTION: WDA_shutdown - * Shutdown WDA/WDI without handshaking with Riva. - * Synchronous function. - */ -VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport) -{ - WDI_Status wdiStatus; - //tANI_U8 eventIdx = 0; - VOS_STATUS status = VOS_STATUS_SUCCESS; - tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - if (NULL == pWDA) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: Invoked with invalid pWDA", __func__ ); - VOS_ASSERT(0); - return VOS_STATUS_E_FAILURE; - } - /* FTM mode stay START_STATE */ - if( (WDA_READY_STATE != pWDA->wdaState) && - (WDA_INIT_STATE != pWDA->wdaState) && - (WDA_START_STATE != pWDA->wdaState) ) - { - VOS_ASSERT(0); - } - - if ( (eDRIVER_TYPE_MFG != pWDA->driverMode) && - (VOS_TRUE == pWDA->wdaTimersCreated)) - { - wdaDestroyTimers(pWDA); - pWDA->wdaTimersCreated = VOS_FALSE; - } - else - { - vos_event_destroy(&pWDA->ftmStopDoneEvent); - } - - /* call WDI shutdown */ - wdiStatus = WDI_Shutdown(closeTransport); - if (IS_WDI_STATUS_FAILURE(wdiStatus) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "error in WDA Stop" ); - status = VOS_STATUS_E_FAILURE; - } - /* WDI stop is synchrnous, shutdown is complete when it returns */ - pWDA->wdaState = WDA_STOP_STATE; - - /* shutdown should perform the stop & close actions. */ - /* Destroy the event */ - status = vos_event_destroy(&pWDA->txFrameEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event destroy failed - status = %d", status); - status = VOS_STATUS_E_FAILURE; - } - status = vos_event_destroy(&pWDA->suspendDataTxEvent); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event destroy failed - status = %d", status); - status = VOS_STATUS_E_FAILURE; - } - status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack); - if(!VOS_IS_STATUS_SUCCESS(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "VOS Event destroy failed - status = %d", status); - status = VOS_STATUS_E_FAILURE; - } - /* free WDA context */ - status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA); - if ( !VOS_IS_STATUS_SUCCESS(status) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "error in WDA close " ); - status = VOS_STATUS_E_FAILURE; - } - return status; -} - -/* - * FUNCTION: WDA_setNeedShutdown - * WDA stop failed or WDA NVDownload failed - */ - -void WDA_setNeedShutdown(v_PVOID_t pVosContext) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - if(pWDA == NULL) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Could not get the WDA Context pointer" ); - return; - } - pWDA->needShutdown = TRUE; -} -/* - * FUNCTION: WDA_needShutdown - * WDA needs a shutdown - */ - -v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext) -{ - tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext); - if(pWDA == NULL) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Could not get the WDA Context pointer" ); - return 0; - } - return pWDA->needShutdown; -} - -#ifdef WLAN_FEATURE_11AC -/* - * FUNCTION: WDA_SetBeaconFilterReqCallback - * - */ -void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - vos_mem_free(pWdaParams) ; - /* - * No respone required for SetBeaconFilter req so just free the request - * param here - */ - - return ; -} - -VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA, - tUpdateVHTOpMode *pData) -{ - WDI_Status status = WDI_STATUS_SUCCESS ; - tWDA_ReqParams *pWdaParams ; - WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc( - sizeof(WDI_UpdateVHTOpMode)) ; - if(NULL == wdiTemp) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - return VOS_STATUS_E_NOMEM; - } - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if(NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(wdiTemp); - return VOS_STATUS_E_NOMEM; - } - - wdiTemp->opMode = pData->opMode; - wdiTemp->staId = pData->staId; - - pWdaParams->pWdaContext = pWDA; - /* Store Req pointer, as this will be used for response */ - pWdaParams->wdaMsgParam = (void *)pData; - /* store Params pass it to WDI */ - pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ; - - status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams); - - if(IS_WDI_STATUS_FAILURE(status)) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " ); - vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ; - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - return CONVERT_WDI2VOS_STATUS(status) ; -} -#endif - -/*========================================================================== - FUNCTION WDA_TransportChannelDebug - - DESCRIPTION - Display Transport Channel debugging information - User may request to display DXE channel snapshot - Or if host driver detects any abnormal stcuk may display - - PARAMETERS - pMac : upper MAC context pointer - displaySnapshot : Display DXE snapshot option - enableStallDetect : Enable stall detect feature - This feature will take effect to data performance - Not integrate till fully verification - - RETURN VALUE - NONE - -===========================================================================*/ -void WDA_TransportChannelDebug -( - tpAniSirGlobal pMac, - v_BOOL_t displaySnapshot, - v_BOOL_t toggleStallDetect -) -{ - WDI_TransportChannelDebug(displaySnapshot, toggleStallDetect); - return; -} - -/*========================================================================== - FUNCTION WDA_SetEnableSSR - - DESCRIPTION - API to enable/disable SSR on WDI timeout - - PARAMETERS - enableSSR : enable/disable SSR - - RETURN VALUE - NONE - -===========================================================================*/ -void WDA_SetEnableSSR(v_BOOL_t enableSSR) -{ - WDI_SetEnableSSR(enableSSR); -} - -#ifdef FEATURE_WLAN_LPHB -/* - * FUNCTION: WDA_LPHBconfRspCallback - * - */ -void WDA_LPHBconfRspCallback(WDI_Status status, void* pUserData) -{ - tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData; - - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "<------ %s " ,__func__); - if (NULL == pWdaParams) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: pWdaParams received NULL", __func__); - VOS_ASSERT(0) ; - return ; - } - - /* Do not need to send notification to upper layer - * Just free allocated resources */ - if (pWdaParams != NULL) - { - if (pWdaParams->wdaWdiApiMsgParam != NULL) - { - vos_mem_free(pWdaParams->wdaWdiApiMsgParam); - } - vos_mem_free(pWdaParams->wdaMsgParam) ; - vos_mem_free(pWdaParams) ; - } - - return; -} - -/* - * FUNCTION: WDA_ProcessLPHBConfReq - * - */ -VOS_STATUS WDA_ProcessLPHBConfReq(tWDA_CbContext *pWDA, - tSirLPHBReq *pData) -{ - WDI_Status wdiStatus; - tWDA_ReqParams *pWdaParams ; - - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "------> %s " , __func__); - - pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ; - if (NULL == pWdaParams) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s: VOS MEM Alloc Failure", __func__); - VOS_ASSERT(0); - vos_mem_free(pData); - return VOS_STATUS_E_NOMEM; - } - - pWdaParams->pWdaContext = pWDA; - pWdaParams->wdaMsgParam = (void *)pData; - pWdaParams->wdaWdiApiMsgParam = NULL; - - wdiStatus = WDI_LPHBConfReq(pData, pWdaParams, WDA_LPHBconfRspCallback); - if (WDI_STATUS_PENDING == wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, - "Pending received for %s:%d ", __func__, __LINE__); - } - else if (WDI_STATUS_SUCCESS != wdiStatus) - { - VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "Failure in %s:%d s %d", __func__, __LINE__, wdiStatus); - vos_mem_free(pWdaParams->wdaMsgParam); - vos_mem_free(pWdaParams); - } - - return CONVERT_WDI2VOS_STATUS(wdiStatus); -} -#endif /* FEATURE_WLAN_LPHB */ - -tANI_U8 WDA_MapChannel(tANI_U8 mapChannel) -{ - if(mapChannel >0 && mapChannel <25){ -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD - if(IS_ROAM_SCAN_OFFLOAD_FEATURE_ENABLE) - return aUnsortedChannelList[mapChannel -1]; -#endif - return abChannel[mapChannel -1]; - } - else - return 0; -} diff --git a/CORE/WDA/src/wlan_qct_wda_ds.c b/CORE/WDA/src/wlan_qct_wda_ds.c deleted file mode 100644 index 01890c4617be..000000000000 --- a/CORE/WDA/src/wlan_qct_wda_ds.c +++ /dev/null @@ -1,1208 +0,0 @@ -/* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. - * - * Previously licensed under the ISC license by Qualcomm Atheros, Inc. - * - * - * Permission to use, copy, modify, and/or distribute this software for - * any purpose with or without fee is hereby granted, provided that the - * above copyright notice and this permission notice appear in all - * copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* - * This file was originally distributed by Qualcomm Atheros, Inc. - * under proprietary terms before Copyright ownership was assigned - * to the Linux Foundation. - */ - - -/*=========================================================================== - - - W L A N _ Q C T _ WDA _ DS . C - - OVERVIEW: - - This software unit holds the implementation of WLAN Data Abtraction APIs - for the WLAN Transport Layer. - - DEPENDENCIES: - - Are listed for each API below. -===========================================================================*/ - -/*=========================================================================== - - EDIT HISTORY FOR FILE - - - This section contains comments describing changes made to the module. - Notice that changes are listed in reverse chronological order. - - - $Header:$ $DateTime: $ $Author: $ - - -when who what, where, why --------- --- ---------------------------------------------- -08/19/2013 rajekuma Added reliable multicast support in WDA -12/08/2010 seokyoun Created. Move down HAL interfaces from TL to WDA - for UMAC convergence btween Volans/Libra and Prima -=========================================================================== */ - -#include "wlan_qct_wda.h" -#include "wlan_qct_tl.h" -#include "wlan_qct_tli.h" -#include "tlDebug.h" - -#define WDA_DS_DXE_RES_COUNT (WDA_TLI_MIN_RES_DATA + 20) - -/* macro's for acessing TL API/data structures */ -#define WDA_TL_SET_TX_XMIT_PENDING(a) WLANTL_SetTxXmitPending(a) -#define WDA_TL_IS_TX_XMIT_PENDING(a) WLANTL_IsTxXmitPending(a) -#define WDA_TL_CLEAR_TX_XMIT_PENDING(a) WLANTL_ClearTxXmitPending(a) - -#define WDA_HI_FLOW_MASK 0xF0 -#define WDA_LO_FLOW_MASK 0x0F - -static v_VOID_t -WDA_DS_TxCompleteCB -( - v_PVOID_t pvosGCtx, - v_PVOID_t pFrameDataBuff -); - - -#ifdef WLAN_PERF -/*========================================================================== - FUNCTION WDA_TLI_FastHwFwdDataFrame - - DESCRIPTION - For NON integrated SOC, this function is called by TL. - - Fast path function to quickly forward a data frame if HAL determines BD - signature computed here matches the signature inside current VOSS packet. - If there is a match, HAL and TL fills in the swapped packet length into - BD header and DxE header, respectively. Otherwise, packet goes back to - normal (slow) path and a new BD signature would be tagged into BD in this - VOSS packet later by the WLANHAL_FillTxBd() function. - - TODO For integrated SOC, this function does nothing yet. Pima SLM/HAL - should provide the equivelant functionality. - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - vosDataBuff Ptr to VOSS packet - pMetaInfo For getting frame's TID - pStaInfo For checking STA type - - OUT - pvosStatus returned status - puFastFwdOK Flag to indicate whether frame could be fast forwarded - - RETURN VALUE - No return. - - SIDE EFFECTS - -============================================================================*/ -void WDA_TLI_FastHwFwdDataFrame -( - v_PVOID_t pvosGCtx, - vos_pkt_t* vosDataBuff, - VOS_STATUS* pvosStatus, - v_U32_t* puFastFwdOK, - WLANTL_MetaInfoType* pMetaInfo, - WLAN_STADescType* pStaInfo -) -{ - /* FIXME WDI/WDA should support this function - once HAL supports it - */ -} -#endif /*WLAN_PERF*/ - -/*========================================================================== - FUNCTION WDA_DS_Register - - DESCRIPTION - Register TL client to WDA. This function registers TL RX/TX functions - to WDI by calling WDI_DS_Register. - - - For NON integrated SOC, this function calls WLANBAL_RegTlCbFunctions - to register TL's RX/TX functions to BAL - - TODO - For Prima, pfnResourceCB gets called in WDTS_OOResourceNotification. - The uCount parameter is AC mask. It should be redefined to use the - same resource callback function. - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - pfnTxCompleteCallback TX complete callback upon TX completion - pfnRxPacketCallback RX callback - pfnTxPacketCallback TX callback - pfnResourceCB gets called when updating TX PDU number - uResTheshold minimum TX PDU size for a packet - pCallbackContext WDI calls callback function with it - VOS global context pointer - OUT - uAvailableTxBuf available TX PDU numbder. - BAL returns it for NON integrated SOC - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS WDA_DS_Register -( - v_PVOID_t pvosGCtx, - WDA_DS_TxCompleteCallback pfnTxCompleteCallback, - WDA_DS_RxPacketCallback pfnRxPacketCallback, - WDA_DS_TxPacketCallback pfnTxPacketCallback, - WDA_DS_ResourceCB pfnResourceCB, - v_U32_t uResTheshold, - v_PVOID_t pCallbackContext, - v_U32_t *uAvailableTxBuf -) -{ - tWDA_CbContext *wdaContext = NULL; - WDI_Status wdiStatus; - - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, - "WLAN WDA: WDA_DS_Register" ); - - /*------------------------------------------------------------------------ - Sanity check - ------------------------------------------------------------------------*/ - if ( ( NULL == pvosGCtx ) || - ( NULL == pfnTxPacketCallback ) || - ( NULL == pfnTxCompleteCallback ) || - ( NULL == pfnRxPacketCallback ) || - ( NULL == pfnResourceCB) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WLAN WDA:Invalid pointers on WDA_DS_Register" ); - return VOS_STATUS_E_FAULT; - } - - /*------------------------------------------------------------------------ - Extract WDA context - ------------------------------------------------------------------------*/ - wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx ); - if ( NULL == wdaContext ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WLAN WDA:Invalid wda context pointer " - "from pvosGCtx on WDA_DS_Register" ); - return VOS_STATUS_E_FAULT; - } - - /*------------------------------------------------------------------------ - Register with WDI as transport layer client - ------------------------------------------------------------------------*/ - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WDA: WDA_DS_Register"); - - wdaContext->pfnTxResourceCB = pfnResourceCB; - wdaContext->pfnTxCompleteCallback = pfnTxCompleteCallback; - - wdiStatus = WDI_DS_Register( wdaContext->pWdiContext, - (WDI_DS_TxCompleteCallback)WDA_DS_TxCompleteCB, - (WDI_DS_RxPacketCallback)pfnRxPacketCallback, - WDA_DS_TxFlowControlCallback, - pvosGCtx ); - - if ( WDI_STATUS_SUCCESS != wdiStatus ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WLAN TL:TL failed to register with DAL, Err: %d", wdiStatus ); - return VOS_STATUS_E_FAILURE; - } - - /* TODO Out-of-resource condition if PDU size is less than WLANTL_MIN_RES_MF - Put hardcoded value not to put TL into OOR. Revisit it */ - *uAvailableTxBuf = WDA_DS_DXE_RES_COUNT; - - return VOS_STATUS_SUCCESS; -} - -/*========================================================================== - FUNCTION WDA_DS_StartXmit - - DESCRIPTION - Serialize TX transmit reques to TX thread. - - TODO This sends TX transmit request to TL. It should send to WDI for - abstraction. - - For NON integrated SOC, this function calls WLANBAL_StartXmit - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_StartXmit -( - v_PVOID_t pvosGCtx -) -{ - vos_msg_t sMessage; - VOS_STATUS status; -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - - if ( NULL == pvosGCtx ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WLAN WDA:Invalid pointers on WDA_DS_StartXmit" ); - return VOS_STATUS_E_FAULT; - } - - if(WDA_TL_IS_TX_XMIT_PENDING( pvosGCtx )) - { - /*Already WDA_DS_TX_START_XMIT msg is pending in TL msg queue */ - return VOS_STATUS_SUCCESS; - } - /* Serialize our event */ - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, - "Serializing WDA TX Start Xmit event" ); - - vos_mem_zero( &sMessage, sizeof(vos_msg_t) ); - - sMessage.bodyptr = NULL; - sMessage.type = WDA_DS_TX_START_XMIT; - - WDA_TL_SET_TX_XMIT_PENDING(pvosGCtx); - - status = vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage); - - if(status != VOS_STATUS_SUCCESS) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_FATAL, - "Serializing WDA TX Start Xmit event FAILED" ); - WDA_TL_CLEAR_TX_XMIT_PENDING(pvosGCtx); - } - return status; -} - - -/*========================================================================== - FUNCTION WDA_DS_FinishULA - - DESCRIPTION - Serialize Finish Upper Level Authentication reques to TX thread. - - DEPENDENCIES - - PARAMETERS - - IN - callbackRoutine routine to be called in TX thread - callbackContext user data for the above routine - - RETURN VALUE - please see vos_tx_mq_serialize - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_FinishULA -( - void (*callbackRoutine) (void *callbackContext), - void *callbackContext -) -{ - vos_msg_t sMessage; -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - - /* Serialize our event */ - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, - "Serializing WDA_DS_FinishULA event" ); - - vos_mem_zero( &sMessage, sizeof(vos_msg_t) ); - - sMessage.callback = callbackRoutine; - sMessage.bodyptr = callbackContext; - sMessage.bodyval = 0; - sMessage.type = WDA_DS_FINISH_ULA; - - return vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage); -}/*WDA_DS_FinishULA*/ - -/*========================================================================== - FUNCTION WDA_DS_BuildTxPacketInfo - - DESCRIPTION - Build TX meta info for integrated SOC. - - Same function calls HAL for reserve BD header space into VOS packet and - HAL function to fill it. - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - vosDataBuff vos data buffer - pvDestMacAddr destination MAC address ponter - ucDisableFrmXtl Is frame xtl disabled? - ucQosEnabled Is QoS enabled? - ucWDSEnabled Is WDS enabled? - extraHeadSpace Extra head bytes. If it's not 0 due to 4 bytes align - of BD header. - typeSubtype typeSubtype from MAC header or TX metainfo/BD - pAddr2 address 2 - uTid tid - txFlag - timeStamp - ucIsEapol - ucUP - - OUT - *pusPktLen Packet length - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_BuildTxPacketInfo -( - v_PVOID_t pvosGCtx, - vos_pkt_t* vosDataBuff, - v_MACADDR_t* pvDestMacAddr, - v_U8_t ucDisableFrmXtl, - v_U16_t* pusPktLen, - v_U8_t ucQosEnabled, - v_U8_t ucWDSEnabled, - v_U8_t extraHeadSpace, - v_U8_t typeSubtype, - v_PVOID_t pAddr2, - v_U8_t uTid, - v_U8_t txFlag, - v_U32_t timeStamp, - v_U8_t ucIsEapol, - v_U8_t ucUP -) -{ - VOS_STATUS vosStatus; - WDI_DS_TxMetaInfoType* pTxMetaInfo = NULL; - v_SIZE_t usMacAddrSize; - wpt_FrameCtrl *pFrameControl; - /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - - /*------------------------------------------------------------------------ - Sanity check - Extract TL control block - ------------------------------------------------------------------------*/ - if ( ( NULL == pvosGCtx ) || ( NULL == vosDataBuff ) || ( NULL == pvDestMacAddr ) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA:Invalid parameter sent on WDA_DS_BuildTxPacketInfo" ); - return VOS_STATUS_E_FAULT; - } - - /*------------------------------------------------------------------------ - Extract TX Meta Info pointer from PAL packet - ------------------------------------------------------------------------*/ - pTxMetaInfo = WDI_DS_ExtractTxMetaData( VOS_TO_WPAL_PKT(vosDataBuff) ); - if ( NULL == pTxMetaInfo ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WLAN TL:Invalid RxMetaInfo pointer from PAL packet on WLANTL_RxFrames"); - VOS_ASSERT( 0 ); - return VOS_STATUS_E_FAULT; - } - - /* Zero out memeory */ - vos_mem_zero( pTxMetaInfo, sizeof( WDI_DS_TxMetaInfoType ) ); - - /* Fill the TX Meta info */ - pTxMetaInfo->txFlags = txFlag; - pTxMetaInfo->qosEnabled = ucQosEnabled; - pTxMetaInfo->fenableWDS = ucWDSEnabled; - pTxMetaInfo->ac = ucUP; - pTxMetaInfo->fUP = uTid; - pTxMetaInfo->isEapol = ucIsEapol; - pTxMetaInfo->fdisableFrmXlt = ucDisableFrmXtl; - pTxMetaInfo->frmType = ( ( typeSubtype & 0x30 ) >> 4 ); - pTxMetaInfo->typeSubtype = typeSubtype; - - /* Length = MAC header + payload */ - vos_pkt_get_packet_length( vosDataBuff, pusPktLen); - pTxMetaInfo->fPktlen = *pusPktLen; - - /* For management frames, peek into Frame Control - field to get value of Protected Frame bit */ - pTxMetaInfo->fProtMgmtFrame = 0; - if ( WDA_TLI_MGMT_FRAME_TYPE == pTxMetaInfo->frmType ) - { - if ( 1 == ucDisableFrmXtl ) /* should be 802.11, but check */ - { - vosStatus = vos_pkt_peek_data( vosDataBuff, 0, (v_PVOID_t)&pFrameControl, - sizeof( wpt_FrameCtrl )); - if ( VOS_STATUS_SUCCESS != vosStatus ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WDA: Failed while attempting to extract Protect Bit in " - "Frame Control, status %d", vosStatus ); - VOS_ASSERT( 0 ); - return VOS_STATUS_E_FAULT; - } - pTxMetaInfo->fProtMgmtFrame = pFrameControl->wep; - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW, - "WLAN TL: fProtMgmtFrame:%d", pTxMetaInfo->fProtMgmtFrame ); - } - } - - // Dst address - usMacAddrSize = VOS_MAC_ADDR_SIZE; - vosStatus = vos_pkt_extract_data( vosDataBuff, - WLANTL_MAC_ADDR_ALIGN( ucDisableFrmXtl ), - (v_PVOID_t)pvDestMacAddr, - &usMacAddrSize ); - if ((VOS_STATUS_SUCCESS != vosStatus) || - (usMacAddrSize != VOS_MAC_ADDR_SIZE)) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WDA:Failed while attempting to extract MAC Addr %d", - vosStatus ); - VOS_ASSERT( 0 ); - return VOS_STATUS_E_FAULT; - } - - vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->fSTAMACAddress, pvDestMacAddr ); - - // ADDR2 - vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->addr2MACAddress, pAddr2 ); - - /* Dump TX meta infro for debugging */ - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW, - "WLAN TL: Dump TX meta info: " - "txFlags:%d, qosEnabled:%d, ac:%d, " - "isEapol:%d, fdisableFrmXlt:%d, frmType:%d", - pTxMetaInfo->txFlags, ucQosEnabled, pTxMetaInfo->ac, - pTxMetaInfo->isEapol, pTxMetaInfo->fdisableFrmXlt, - pTxMetaInfo->frmType ); - - return VOS_STATUS_SUCCESS; -} - - -/*========================================================================== - FUNCTION WDS_DS_TrimRxPacketInfo - - DESCRIPTION - Trim/Remove RX BD header for NON integrated SOC. - It does nothing for integrated SOC. - - DEPENDENCIES - - PARAMETERS - - IN - vosDataBuff vos data buffer - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_TrimRxPacketInfo -( - vos_pkt_t *vosDataBuff -) -{ - /* Nothing to trim - * Do Nothing */ - - return VOS_STATUS_SUCCESS; -} - - - -/*========================================================================== - FUNCTION WDA_DS_PeekRxPacketInfo - - DESCRIPTION - Return RX metainfo pointer for for integrated SOC. - - Same function will return BD header pointer. - - DEPENDENCIES - - PARAMETERS - - IN - vosDataBuff vos data buffer - - pvDestMacAddr destination MAC address ponter - bSwap Want to swap BD header? For backward compatability - It does nothing for integrated SOC - OUT - *ppRxHeader RX metainfo pointer - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_PeekRxPacketInfo -( - vos_pkt_t *vosDataBuff, - v_PVOID_t *ppRxHeader, - v_BOOL_t bSwap -) -{ - /*------------------------------------------------------------------------ - Sanity check - ------------------------------------------------------------------------*/ - if ( NULL == vosDataBuff ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA:Invalid parameter sent on WDA_DS_PeekRxPacketInfo" ); - return VOS_STATUS_E_FAULT; - } - - *ppRxHeader = WDI_DS_ExtractRxMetaData( (wpt_packet*)vosDataBuff ); - - if ( NULL == *ppRxHeader ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA:Failed to get RX meta data from WDI" ); - return VOS_STATUS_E_FAILURE; - } - - return VOS_STATUS_SUCCESS; -} - - - -/*========================================================================== - FUNCTION WDA_DS_GetFrameTypeSubType - - DESCRIPTION - Get typeSubtype from the packet. The BD header should have this. - But some reason, Libra/Volans read it from 802.11 header and save it - back to BD header. So for NON integrated SOC, this function does - the same. - - For integrated SOC, WDI does the same, not TL. - It does return typeSubtype from RX meta info for integrated SOC. - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - vosDataBuff vos data buffer - pRxHeader RX meta info or BD header pointer - - OUT - ucTypeSubtype typeSubtype - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_GetFrameTypeSubType -( - v_PVOID_t pvosGCtx, - vos_pkt_t *vosDataBuff, - v_PVOID_t pRxHeader, - v_U8_t *ucTypeSubtype -) -{ - /*------------------------------------------------------------------------ - Sanity check - ------------------------------------------------------------------------*/ - if ( NULL == pRxHeader ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA:Invalid parameter sent on WDA_DS_GetFrameTypeSubType" ); - return VOS_STATUS_E_FAULT; - } - - *ucTypeSubtype = ( WDA_GET_RX_TYPE( pRxHeader ) << 4 ) | WDA_GET_RX_SUBTYPE( pRxHeader ); - - return VOS_STATUS_SUCCESS; -} - - -/*========================================================================== - FUNCTION WDA_DS_RxAmsduBdFix - - DESCRIPTION - For backward compatability with Libra/Volans. Need to call HAL function - for HW BD bug fix - - It does nothing for integrated SOC. - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - pvBDHeader BD header pointer - - OUT - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_RxAmsduBdFix -( - v_PVOID_t pvosGCtx, - v_PVOID_t pvBDHeader -) -{ - /* Do nothing for Prima */ - return VOS_STATUS_SUCCESS; -} - -/*========================================================================== - FUNCTION WDA_DS_GetRssi - - DESCRIPTION - Get RSSI - - TODO It returns hardcoded value in the meantime since WDA/WDI does nothing - support it yet for Prima. - - DEPENDENCIES - - PARAMETERS - - IN - vosDataBuff vos data buffer - - OUT - puRssi RSSI - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_GetRssi -( - v_PVOID_t pvosGCtx, - v_S7_t* puRssi -) -{ - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WDA:halPS_GetRssi no longer supported. Need replacement"); - - *puRssi = -30; - - return VOS_STATUS_SUCCESS; -} - -/*========================================================================== - FUNCTION WDA_DS_GetTxResources - - DESCRIPTION - It does return hardcoded value. It should bigger number than 0. - Returning 0 will put TL in out-of-resource condition for TX. - - Return current PDU resources from BAL for NON integrated SOC. - - DEPENDENCIES - - PARAMETERS - - IN - vosDataBuff vos data buffer - - OUT - puResCount available PDU number for TX - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_GetTxResources -( - v_PVOID_t pvosGCtx, - v_U32_t* puResCount -) -{ - /* Return minimum necessary number of packet(DXE descriptor) for data */ - /* TODO Need to get this from DXE??? */ - *puResCount = WDA_TLI_BD_PDU_RESERVE_THRESHOLD + 50; - return VOS_STATUS_SUCCESS; -} - - - -/*========================================================================== - FUNCTION WDA_DS_GetReplayCounter - - DESCRIPTION - Return replay counter from BD header or RX meta info - - DEPENDENCIES - - PARAMETERS - - IN - pRxHeader RX meta info or BD header pointer - - OUT - - RETURN VALUE - Replay Counter - - SIDE EFFECTS - -============================================================================*/ -v_U64_t -WDA_DS_GetReplayCounter -( - v_PVOID_t pRxHeader -) -{ - return WDA_GET_RX_REPLAY_COUNT( pRxHeader ); -} - -/*========================================================================== - FUNCTION WDA_DS_TxFrames - - DESCRIPTION - Pull packets from TL and push them to WDI. It gets invoked upon - WDA_DS_TX_START_XMIT. - - This function is equivelant of WLANSSC_Transmit in Libra/Volans. - - TODO - This function should be implemented and moved in WDI. - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - - OUT - - RETURN VALUE - VOS_STATUS_E_FAULT: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ - -VOS_STATUS -WDA_DS_TxFrames -( - v_PVOID_t pvosGCtx -) -{ - VOS_STATUS vosStatus; - vos_pkt_t *pTxMgmtChain = NULL; - vos_pkt_t *pTxDataChain = NULL; - vos_pkt_t *pTxPacket = NULL; - v_BOOL_t bUrgent; - wpt_uint32 ucTxResReq; - WDI_Status wdiStatus; - tWDA_CbContext *wdaContext = NULL; - v_U32_t uMgmtAvailRes; - v_U32_t uDataAvailRes; - WLANTL_TxCompCBType pfnTxComp = NULL; - v_U32_t uTxFailCount = 0; - - wdaContext = (tWDA_CbContext *)vos_get_context(VOS_MODULE_ID_WDA, pvosGCtx); - if ( NULL == wdaContext ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA:Invalid wda context pointer from pvosGCtx on WDA_DS_TxFrames" ); - return VOS_STATUS_E_FAULT; - } - - /*------------------------------------------------------------------------- - Need to fetch separatelly for Mgmt and Data frames because TL is not - aware of separate resource management at the lower levels - -------------------------------------------------------------------------*/ - /*Mgmt tx*/ - uMgmtAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext, - WDI_MGMT_POOL_ID); - - ucTxResReq = WLANTL_GetFrames( pvosGCtx, - &pTxMgmtChain, - uMgmtAvailRes, - (wdaContext->uTxFlowMask & WDA_HI_FLOW_MASK), - &bUrgent ); - - // We need to initialize vsoStatus in case we don't enter the "while" - // loop. If we don't enter the loop, it means that there are no packets, - // available, and that is considered success. If we enter the loop, - // vosStatus will be set appropriately inside the loop - vosStatus = VOS_STATUS_SUCCESS; - - while ( NULL != pTxMgmtChain ) - { - /* Walk the chain and unchain the packet */ - pTxPacket = pTxMgmtChain; - vosStatus = vos_pkt_walk_packet_chain( pTxMgmtChain, &pTxMgmtChain, VOS_TRUE ); - - if( (VOS_STATUS_SUCCESS != vosStatus) && - (VOS_STATUS_E_EMPTY != vosStatus) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA Walking packet chain returned status : %d", vosStatus ); - VOS_ASSERT( 0 ); - vosStatus = VOS_STATUS_E_FAILURE; - break; - } - - if ( VOS_STATUS_E_EMPTY == vosStatus ) - { - vosStatus = VOS_STATUS_SUCCESS; - } - - wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext, - (wpt_packet*)pTxPacket, - 0 /* more */ ); - if ( WDI_STATUS_SUCCESS != wdiStatus ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN, - "WDA : Pushing a packet to WDI failed." ); - if ( WDI_STATUS_E_NOT_ALLOWED != wdiStatus ) - { - uTxFailCount++; - } - VOS_ASSERT( wdiStatus == WDI_STATUS_E_NOT_ALLOWED ); - //We need to free the packet here - vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp); - if(pfnTxComp) - { - pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE); - } - } - - }; - - if ( uTxFailCount ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WDA : Tx fail count for mgmt pkts: %d.", uTxFailCount); - uTxFailCount = 0; - } - - /*Data tx*/ - uDataAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext, - WDI_DATA_POOL_ID); - - ucTxResReq = WLANTL_GetFrames( pvosGCtx, - &pTxDataChain, - /*WDA_DS_DXE_RES_COUNT*/ uDataAvailRes, - (wdaContext->uTxFlowMask & WDA_LO_FLOW_MASK), - &bUrgent ); - - // We need to initialize vsoStatus in case we don't enter the "while" - // loop. If we don't enter the loop, it means that there are no packets, - // available, and that is considered success. If we enter the loop, - // vosStatus will be set appropriately inside the loop - vosStatus = VOS_STATUS_SUCCESS; - - while ( NULL != pTxDataChain ) - { - /* Walk the chain and unchain the packet */ - pTxPacket = pTxDataChain; - vosStatus = vos_pkt_walk_packet_chain( pTxDataChain, &pTxDataChain, VOS_TRUE ); - - if( (VOS_STATUS_SUCCESS != vosStatus) && - (VOS_STATUS_E_EMPTY != vosStatus) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA Walking packet chain returned status : %d", vosStatus ); - VOS_ASSERT( 0 ); - vosStatus = VOS_STATUS_E_FAILURE; - break; - } - - if ( VOS_STATUS_E_EMPTY == vosStatus ) - { - vosStatus = VOS_STATUS_SUCCESS; - } - - wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext, - (wpt_packet*)pTxPacket, - 0 /* more */ ); - if ( WDI_STATUS_SUCCESS != wdiStatus ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN, - "WDA : Pushing a packet to WDI failed." ); - if ( WDI_STATUS_E_NOT_ALLOWED != wdiStatus ) - { - uTxFailCount++; - } - VOS_ASSERT( wdiStatus == WDI_STATUS_E_NOT_ALLOWED ); - //We need to free the packet here - vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp); - if(pfnTxComp) - { - pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE); - } - } - - }; - - if ( uTxFailCount ) - { - VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, - "WDA : Tx fail count for data pkts: %d.", uTxFailCount); - } - - - WDI_DS_TxComplete(wdaContext->pWdiContext, ucTxResReq); - - return vosStatus; -} - -/*========================================================================== - FUNCTION WDA_DS_TxFlowControlCallback - - DESCRIPTION - Invoked by WDI to control TX flow. - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - uFlowMask TX channel mask for flow control - Defined in WDA_TXFlowEnumType - - OUT - - RETURN VALUE - - SIDE EFFECTS - -============================================================================*/ -v_VOID_t -WDA_DS_TxFlowControlCallback -( - v_PVOID_t pvosGCtx, - v_U8_t ucFlowMask -) -{ - tWDA_CbContext* wdaContext = NULL; - v_U8_t ucOldFlowMask; - /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - - /*------------------------------------------------------------------------ - Sanity check - ------------------------------------------------------------------------*/ - if ( NULL == pvosGCtx ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA: Invalid parameter sent on WDA_DS_TxFlowControlCallback" ); - return; - } - - wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx ); - if ( NULL == wdaContext ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA: Invalid context on WDA_DS_TxFlowControlCallback" ); - return; - } - - /* two physical DXE channels - 1) data packets(all four AC) and BAP for the low priority channel(lower 4 bits) - 2) management packets for high priority channel(5th bit) - */ - - - /*Save and reset */ - ucOldFlowMask = wdaContext->uTxFlowMask; - wdaContext->uTxFlowMask = ucFlowMask; - - /*If the AC is being enabled - resume data xfer - - Assume previous value of wdaContext->uTxFlowMask: - - DATA\MGM | ON | OFF - ---------------------- - ON | 1F | 0F * - ---------------------- - OFF | 10 *| 00 * - - * - states in which a channel can be enabled - - ucFlowMask will tell which channel must be enabled - to enable a channel a new bit must be turned on => - ucFlowMask > wdaContext->uTxFlowMask when enable happens - */ - - if ( ucFlowMask > ucOldFlowMask ) - { - WDA_DS_StartXmit(pvosGCtx); - } - -} - -/*========================================================================== - FUNCTION WDA_DS_GetTxFlowMask - - DESCRIPTION - return TX flow mask control value - - DEPENDENCIES - - PARAMETERS - - IN - pvosGCtx VOS context - - OUT - uFlowMask TX channel mask for flow control - Defined in WDA_TXFlowEnumType - - RETURN VALUE - VOS_STATUS_E_INVAL: pointer is NULL and other errors - VOS_STATUS_SUCCESS: Everything is good :) - - SIDE EFFECTS - -============================================================================*/ -VOS_STATUS -WDA_DS_GetTxFlowMask -( - v_PVOID_t pvosGCtx, - v_U8_t* puFlowMask -) -{ - tWDA_CbContext* wdaContext = NULL; - /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - - /*------------------------------------------------------------------------ - Sanity check - ------------------------------------------------------------------------*/ - if ( ( NULL == pvosGCtx ) || ( NULL == puFlowMask ) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA: Invalid parameter sent on WDA_DS_GetTxFlowMask" ); - return VOS_STATUS_E_INVAL; - } - - wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx ); - if ( NULL == wdaContext ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA: Invalid context on WDA_DS_GetTxFlowMask" ); - return VOS_STATUS_E_INVAL; - } - - *puFlowMask = wdaContext->uTxFlowMask; - - return VOS_STATUS_SUCCESS; -} - -v_VOID_t -WDA_DS_TxCompleteCB -( - v_PVOID_t pvosGCtx, - v_PVOID_t pFrameDataBuff -) -{ - tWDA_CbContext* wdaContext = NULL; - WDI_DS_TxMetaInfoType* pTxMetadata; - VOS_STATUS vosStatus; - /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - - /*------------------------------------------------------------------------ - Sanity check - ------------------------------------------------------------------------*/ - - if ( ( NULL == pvosGCtx ) || ( NULL == pFrameDataBuff ) ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA: Invalid parameter sent on WDA_DS_TxCompleteCB" ); - return; - } - - wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx ); - if ( NULL == wdaContext ) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "WDA: Invalid context on WDA_DS_TxCompleteCB" ); - return; - } - - // extract metadata from PAL packet - pTxMetadata = WDI_DS_ExtractTxMetaData( (wpt_packet*)pFrameDataBuff ); - - if ( eWLAN_PAL_STATUS_SUCCESS == pTxMetadata->txCompleteStatus ) - vosStatus = VOS_STATUS_SUCCESS; - else - vosStatus = VOS_STATUS_E_FAILURE; - - wdaContext->pfnTxCompleteCallback( pvosGCtx, pFrameDataBuff, vosStatus ); -} diff --git a/CORE/WDA/src/wlan_qct_wda_legacy.c b/CORE/WDA/src/wlan_qct_wda_legacy.c index 9803ed190cb5..6ef18cf50206 100644 --- a/CORE/WDA/src/wlan_qct_wda_legacy.c +++ b/CORE/WDA/src/wlan_qct_wda_legacy.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -208,25 +208,3 @@ tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb) return eSIR_SUCCESS; } // uMacPostCtrlMsg() - - -/* --------------------------------------------------------- - * FUNCTION: wdaGetGlobalSystemRole() - * - * Get the global HAL system role. - * --------------------------------------------------------- - */ -tBssSystemRole wdaGetGlobalSystemRole(tpAniSirGlobal pMac) -{ - v_VOID_t * pVosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL); - tWDA_CbContext *wdaContext = - vos_get_context(VOS_MODULE_ID_WDA, pVosContext); - if(NULL == wdaContext) - { - VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, - "%s:WDA context is NULL", __func__); - VOS_ASSERT(0); - return eSYSTEM_UNKNOWN_ROLE; - } - return wdaContext->wdaGlobalSystemRole; -} @@ -321,46 +321,11 @@ HIF_INC := -I$(WLAN_ROOT)/$(HIF_COMMON_DIR) \ -I$(WLAN_ROOT)/$(HIF_SDIO_NATIVE_INC_DIR) \ -I$(WLAN_ROOT)/$(HIF_SDIO_NATIVE_SRC_DIR) -HIF_OBJS := $(HIF_DIR_OBJS)\ - $(HIF_COMMON_OBJS)\ - $(HIF_SDIO_OBJS)\ - $(HIF_SDIO_LINUX_OBJS)\ - $(HIF_SDIO_NATIVE_OBJS) -else -############ DXE ############ -DXE_DIR := CORE/DXE -DXE_INC_DIR := $(DXE_DIR)/inc -DXE_SRC_DIR := $(DXE_DIR)/src - -DXE_INC := -I$(WLAN_ROOT)/$(DXE_INC_DIR) \ - -I$(WLAN_ROOT)/$(DXE_SRC_DIR) - -HIF_DXE_DIR := CORE/SERVICES/HIF/DXE -HIF_DXE_INC := -I$(WLAN_ROOT)/$(HIF_DXE_DIR) - -ifeq ($(CONFIG_QCA_WIFI_2_0), 0) -DXE_OBJS = $(DXE_SRC_DIR)/wlan_qct_dxe.o \ - $(DXE_SRC_DIR)/wlan_qct_dxe_cfg_i.o -else -ifeq ($(CONFIG_QCA_WIFI_ISOC), 1) -HIF_DXE_INC := -I$(WLAN_ROOT)/$(HIF_DXE_DIR) \ - -I$(WLAN_ROOT)/$(HIF_DXE_DIR)/linux - -HIF_DXE_OBJS:= $(HIF_DXE_DIR)/hif_dxe.o \ - $(HIF_DXE_DIR)/hif_dxe_config.o \ - $(HIF_DXE_DIR)/linux/hif_dxe_os.o \ - $(HIF_DXE_DIR)/dmux_dxe.o \ - $(DXE_DIR)/htt_dxe_tx.o \ - $(DXE_DIR)/htt_dxe_fw_stats.o \ - $(DXE_DIR)/htt_dxe_h2t.o \ - $(DXE_DIR)/htt_dxe_t2h.o \ - $(DXE_DIR)/htt_dxe.o \ - $(DXE_DIR)/htt_dxe_rx.o - -DXE_INC += $(HIF_DXE_INC) -DXE_OBJS := $(HIF_DXE_OBJS) -endif -endif +HIF_OBJS := $(HIF_DIR_OBJS) \ + $(HIF_COMMON_OBJS) \ + $(HIF_SDIO_OBJS) \ + $(HIF_SDIO_LINUX_OBJS) \ + $(HIF_SDIO_NATIVE_OBJS) endif ############ HDD ############ @@ -843,17 +808,12 @@ WDA_OBJS := $(WDA_SRC_DIR)/wlan_qct_wda_debug.o \ $(WDA_SRC_DIR)/wlan_qct_wda_legacy.o \ $(WDA_SRC_DIR)/wlan_nv.o -ifeq ($(CONFIG_QCA_WIFI_2_0), 0) -WDA_OBJS += $(WDA_SRC_DIR)/wlan_qct_wda.o \ - $(WDA_SRC_DIR)/wlan_qct_wda_ds.o -endif - ############ WDI ############ WDI_DIR := CORE/WDI WDI_CP_INC := -I$(WLAN_ROOT)/$(WDI_DIR)/CP/inc/ -WDI_DP_INC := -I$(WLAN_ROOT)/$(WDI_DIR)/DP/inc/ +WDI_DP_INC := -I$(WLAN_ROOT)/$(WDI_DIR)/DP/inc/ WDI_TRP_INC := -I$(WLAN_ROOT)/$(WDI_DIR)/TRP/CTS/inc/ \ -I$(WLAN_ROOT)/$(WDI_DIR)/TRP/DTS/inc/ @@ -875,7 +835,6 @@ WCNSS_INC := -I$(WLAN_ROOT)/wcnss/inc LINUX_INC := -Iinclude/linux INCS := $(BAP_INC) \ - $(DXE_INC) \ $(HDD_INC) \ $(EPPING_INC) \ $(LINUX_INC) \ @@ -891,9 +850,7 @@ INCS := $(BAP_INC) \ $(WDI_INC) \ $(DFS_INC) -ifeq ($(CONFIG_QCA_WIFI_2_0), 0) -INCS += $(DXE_INC) -else +ifeq ($(CONFIG_QCA_WIFI_2_0), 1) INCS += $(WMA_INC) \ $(COMMON_INC) \ $(WMI_INC) \ @@ -914,8 +871,6 @@ ifeq ($(CONFIG_REMOVE_PKT_LOG), 0) INCS += $(PKTLOG_INC) endif -else -INCS += $(DXE_INC) endif endif @@ -934,8 +889,7 @@ OBJS := $(BAP_OBJS) \ $(DFS_OBJS) ifeq ($(CONFIG_QCA_WIFI_2_0), 0) -OBJS += $(DXE_OBJS) \ - $(TL_OBJS) +OBJS += $(TL_OBJS) else OBJS += $(WMA_OBJS) \ $(TLSHIM_OBJS) \ @@ -955,8 +909,6 @@ ifeq ($(CONFIG_REMOVE_PKT_LOG), 0) OBJS += $(PKTLOG_OBJS) endif -else -OBJS += $(DXE_OBJS) endif endif diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini index bd171d65fb61..bd5e48cdd47b 100755 --- a/firmware_bin/WCNSS_qcom_cfg.ini +++ b/firmware_bin/WCNSS_qcom_cfg.ini @@ -582,6 +582,9 @@ gEnableLpassSupport=0 # Whether userspace country code setting shld have priority gCountryCodePriority=1 +# Enable(1)/Disable(0) SIFS burst +gEnableSifsBurst=1 + END # Note: Configuration parser would not read anything past the END marker diff --git a/tools/fwdebuglog/nan-parser.c b/tools/fwdebuglog/nan-parser.c index 7def50bebec7..5f00bd867a8f 100644 --- a/tools/fwdebuglog/nan-parser.c +++ b/tools/fwdebuglog/nan-parser.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * |
