From b61cf643e264d8e8738df894706dda959868cac3 Mon Sep 17 00:00:00 2001 From: "Poddar, Siddarth" Date: Thu, 28 Apr 2016 16:02:39 +0530 Subject: [PATCH] qcacld-3.0: Add hdd tx-rx apis for High Latency systems (Part 5 - HL Datapath) Support per vdev tx desc pool in hdd and for sending 802.11z action frames. CRs-Fixed: 975526 Change-Id: Ic63e07abdabae9795bba6f76daa954235c894245 --- core/bmi/src/ol_fw.c | 39 +++++- core/hdd/inc/wlan_hdd_cfg.h | 159 +++++++++++++++++++++++++ core/hdd/src/wlan_hdd_softap_tx_rx.c | 45 +++++++ core/hdd/src/wlan_hdd_tx_rx.c | 49 ++++++++ core/mac/src/include/sir_params.h | 1 + core/mac/src/pe/lim/lim_process_tdls.c | 110 ++++++++++++----- 6 files changed, 365 insertions(+), 38 deletions(-) diff --git a/core/bmi/src/ol_fw.c b/core/bmi/src/ol_fw.c index 778b9dc681b4..ee7f9401fa5f 100644 --- a/core/bmi/src/ol_fw.c +++ b/core/bmi/src/ol_fw.c @@ -1565,6 +1565,39 @@ void ol_dump_target_memory(struct hif_opaque_softc *scn, void *memory_block) } } +#ifdef CONFIG_HL_SUPPORT + +/** + * ol_dump_ce_register() - cannot read the section + * @scn: ol_softc handler + * @memory_block: non-NULL reserved memory location + * + * Return: -EACCES for LL and not apllicable for HL + */ +static inline int +ol_dump_ce_register(struct hif_opaque_softc *scn, void *memory_block) +{ + return 0; +} +#else + +static int +ol_dump_ce_register(struct hif_opaque_softc *scn, void *memory_block) +{ + int ret; + + BMI_ERR("Could not read dump section!"); + + if (hif_dump_registers(scn)) + BMI_ERR("Failed to dump bus registers"); + + ol_dump_target_memory(scn, memory_block); + ret = -EACCES; + + return ret; +} +#endif + /** * ol_target_coredump() - API to collect target ramdump * @inst - private context @@ -1639,11 +1672,7 @@ static int ol_target_coredump(void *inst, void *memory_block, buffer_loc += result; section_count++; } else { - BMI_ERR("Could not read dump section!"); - if (hif_dump_registers(scn)) - BMI_ERR("Failed to dump bus registers"); - ol_dump_target_memory(scn, memory_block); - ret = -EACCES; + ret = ol_dump_ce_register(scn, memory_block); break; /* Could not read the section */ } } else { diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index b5317f7807f2..f0212b7476d3 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -1481,6 +1481,138 @@ typedef enum { #define CFG_ALLOW_MCC_GO_DIFF_BI_MAX (4) #define CFG_ALLOW_MCC_GO_DIFF_BI_DEFAULT (4) +#if defined(CONFIG_HL_SUPPORT) && defined(QCA_BAD_PEER_TX_FLOW_CL) +/* + * Enable/Disable Bad Peer TX CTL feature + * Default: Enable + */ +#define CFG_BAD_PEER_TX_CTL_ENABLE_NAME "gBadPeerTxCtlEnable" +#define CFG_BAD_PEER_TX_CTL_ENABLE_MIN (0) +#define CFG_BAD_PEER_TX_CTL_ENABLE_MAX (1) +#define CFG_BAD_PEER_TX_CTL_ENABLE_DEFAULT (1) + +#define CFG_BAD_PEER_TX_CTL_PERIOD_NAME "gBadPeerTxCtlPeriod" +#define CFG_BAD_PEER_TX_CTL_PERIOD_MIN (10) +#define CFG_BAD_PEER_TX_CTL_PERIOD_MAX (10000) +#define CFG_BAD_PEER_TX_CTL_PERIOD_DEFAULT (50) + +#define CFG_BAD_PEER_TX_CTL_TXQ_LIMIT_NAME "gBadPeerTxCtlTxqLimit" +#define CFG_BAD_PEER_TX_CTL_TXQ_LIMIT_MIN (1) +#define CFG_BAD_PEER_TX_CTL_TXQ_LIMIT_MAX (5000) +#define CFG_BAD_PEER_TX_CTL_TXQ_LIMIT_DEFAULT (100) + +#define CFG_BAD_PEER_TX_CTL_TGT_BACKOFF_T_NAME "gBadPeerTxCtlTgtBackoffTime" +#define CFG_BAD_PEER_TX_CTL_TGT_BACKOFF_T_MIN (1) +#define CFG_BAD_PEER_TX_CTL_TGT_BACKOFF_T_MAX (5000) +#define CFG_BAD_PEER_TX_CTL_TGT_BACKOFF_T_DEFAULT (20) + +#define CFG_BAD_PEER_TX_CTL_TGT_REPORT_PRD_NAME "gBadPeerTxCtlTgtReportPeriod" +#define CFG_BAD_PEER_TX_CTL_TGT_REPORT_PRD_MIN (1) +#define CFG_BAD_PEER_TX_CTL_TGT_REPORT_PRD_MAX (5000) +#define CFG_BAD_PEER_TX_CTL_TGT_REPORT_PRD_DEFAULT (500) + +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEB_NAME "gBadPeerTxCtlCondLevelIeeeB" +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEB_MIN (1) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEB_MAX (2) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEB_DEFAULT (2) + +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEB_NAME "gBadPeerTxCtlDeltaLevelIeeeB" +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEB_MIN (1) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEB_MAX (11) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEB_DEFAULT (2) + +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEB_NAME "gBadPeerTxCtlPctLevelIeeeB" +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEB_MIN (1) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEB_MAX (8) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEB_DEFAULT (1) + +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEB_NAME "gBadPeerTxCtlTputLevelIeeeB" +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEB_MIN (1) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEB_MAX (11) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEB_DEFAULT (2) + +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEB_NAME "gBadPeerTxCtlTxLimitLevelIeeeB" +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEB_MIN (0) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEB_MAX (50) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEB_DEFAULT (3) + +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAG_NAME "gBadPeerTxCtlCondLevelIeeeAG" +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAG_MIN (1) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAG_MAX (2) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAG_DEFAULT (2) + +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAG_NAME "gBadPeerTxCtlDeltaLevelIeeeAG" +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAG_MIN (6) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAG_MAX (54) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAG_DEFAULT (6) + +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAG_NAME "gBadPeerTxCtlPctLevelIeeeAG" +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAG_MIN (1) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAG_MAX (8) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAG_DEFAULT (1) + +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAG_NAME "gBadPeerTxCtlTputLevelIeeeAG" +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAG_MIN (6) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAG_MAX (54) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAG_DEFAULT (6) + +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAG_NAME "gBadPeerTxCtlTxLimitLevelIeeeAG" +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAG_MIN (0) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAG_MAX (50) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAG_DEFAULT (3) + +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEN_NAME "gBadPeerTxCtlCondLevelIeeeN" +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEN_MIN (1) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEN_MAX (2) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEN_DEFAULT (2) + +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEN_NAME "gBadPeerTxCtlDeltaLevelIeeeN" +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEN_MIN (6) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEN_MAX (72) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEN_DEFAULT (6) + +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEN_NAME "gBadPeerTxCtlPctLevelIeeeN" +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEN_MIN (1) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEN_MAX (8) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEN_DEFAULT (1) + +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEN_NAME "gBadPeerTxCtlTputLevelIeeeN" +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEN_MIN (6) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEN_MAX (72) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEN_DEFAULT (15) + +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEN_NAME "gBadPeerTxCtlTxLimitLevelIeeeN" +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEN_MIN (0) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEN_MAX (50) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEN_DEFAULT (3) + +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAC_NAME "gBadPeerTxCtlCondLevelIeeeAC" +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAC_MIN (1) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAC_MAX (2) +#define CFG_BAD_PEER_TX_CTL_COND_LEVEL_IEEEAC_DEFAULT (2) + +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAC_NAME "gBadPeerTxCtlDeltaLevelIeeeAC" +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAC_MIN (6) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAC_MAX (433) +#define CFG_BAD_PEER_TX_CTL_DELTA_LEVEL_IEEEAC_DEFAULT (6) + +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAC_NAME "gBadPeerTxCtlPctLevelIeeeAC" +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAC_MIN (1) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAC_MAX (8) +#define CFG_BAD_PEER_TX_CTL_PCT_LEVEL_IEEEAC_DEFAULT (1) + +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAC_NAME "gBadPeerTxCtlTputLevelIeeeAC" +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAC_MIN (6) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAC_MAX (433) +#define CFG_BAD_PEER_TX_CTL_TPUT_LEVEL_IEEEAC_DEFAULT (15) + +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAC_NAME "gBadPeerTxCtlTxLimitLevelIeeeAC" +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAC_MIN (0) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAC_MAX (50) +#define CFG_BAD_PEER_TX_CTL_TX_LIMIT_LEVEL_IEEEAC_DEFAULT (3) +#endif + + /* * Enable/Disable Thermal Mitigation feature * Default: Enable @@ -3512,6 +3644,33 @@ struct hdd_config { uint32_t throttle_dutycycle_level1; uint32_t throttle_dutycycle_level2; uint32_t throttle_dutycycle_level3; +#if defined(CONFIG_HL_SUPPORT) && defined(QCA_BAD_PEER_TX_FLOW_CL) + bool bad_peer_txctl_enable; + uint32_t bad_peer_txctl_prd; + uint32_t bad_peer_txctl_txq_lmt; + uint32_t bad_peer_tgt_backoff; + uint32_t bad_peer_tgt_report_prd; + uint32_t bad_peer_cond_ieee80211b; + uint32_t bad_peer_delta_ieee80211b; + uint32_t bad_peer_pct_ieee80211b; + uint32_t bad_peer_tput_ieee80211b; + uint32_t bad_peer_limit_ieee80211b; + uint32_t bad_peer_cond_ieee80211ag; + uint32_t bad_peer_delta_ieee80211ag; + uint32_t bad_peer_pct_ieee80211ag; + uint32_t bad_peer_tput_ieee80211ag; + uint32_t bad_peer_limit_ieee80211ag; + uint32_t bad_peer_cond_ieee80211n; + uint32_t bad_peer_delta_ieee80211n; + uint32_t bad_peer_pct_ieee80211n; + uint32_t bad_peer_tput_ieee80211n; + uint32_t bad_peer_limit_ieee80211n; + uint32_t bad_peer_cond_ieee80211ac; + uint32_t bad_peer_delta_ieee80211ac; + uint32_t bad_peer_pct_ieee80211ac; + uint32_t bad_peer_tput_ieee80211ac; + uint32_t bad_peer_limit_ieee80211ac; +#endif uint8_t vhtChannelWidth; uint8_t vhtRxMCS; uint8_t vhtTxMCS; diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index 1f8bf40c360d..a0dbea356d3b 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c @@ -117,6 +117,49 @@ void hdd_softap_tx_resume_timer_expired_handler(void *adapter_context) return; } +#if defined(CONFIG_PER_VDEV_TX_DESC_POOL) + +/** + * hdd_softap_tx_resume_false() - Resume OS TX Q false leads to queue disabling + * @pAdapter: pointer to hdd adapter + * @tx_resume: TX Q resume trigger + * + * + * Return: None + */ +static void +hdd_softap_tx_resume_false(hdd_adapter_t *pAdapter, bool tx_resume) +{ + if (true == tx_resume) + return; + + hdd_notice("Disabling queues"); + wlan_hdd_netif_queue_control(pAdapter, WLAN_STOP_ALL_NETIF_QUEUE, + WLAN_DATA_FLOW_CONTROL); + + if (QDF_TIMER_STATE_STOPPED == + qdf_mc_timer_get_current_state(&pAdapter-> + tx_flow_control_timer)) { + QDF_STATUS status; + status = qdf_mc_timer_start(&pAdapter->tx_flow_control_timer, + WLAN_SAP_HDD_TX_FLOW_CONTROL_OS_Q_BLOCK_TIME); + + if (!QDF_IS_STATUS_SUCCESS(status)) + hdd_err("Failed to start tx_flow_control_timer"); + else + pAdapter->hdd_stats.hddTxRxStats.txflow_timer_cnt++; + } + return; +} +#else + +static inline void +hdd_softap_tx_resume_false(hdd_adapter_t *pAdapter, bool tx_resume) +{ + return; +} +#endif + /** * hdd_softap_tx_resume_cb() - Resume OS TX Q. * @adapter_context: pointer to vdev apdapter @@ -150,6 +193,8 @@ void hdd_softap_tx_resume_cb(void *adapter_context, bool tx_resume) WLAN_WAKE_ALL_NETIF_QUEUE, WLAN_DATA_FLOW_CONTROL); } + hdd_softap_tx_resume_false(pAdapter, tx_resume); + return; } #endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */ diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index d3d8d712cd8c..10897f1d4160 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -96,6 +96,53 @@ void hdd_tx_resume_timer_expired_handler(void *adapter_context) WLAN_CONTROL_PATH); return; } +#if defined(CONFIG_PER_VDEV_TX_DESC_POOL) + +/** + * hdd_tx_resume_false() - Resume OS TX Q false leads to queue disabling + * @pAdapter: pointer to hdd adapter + * @tx_resume: TX Q resume trigger + * + * + * Return: None + */ +static void +hdd_tx_resume_false(hdd_adapter_t *pAdapter, bool tx_resume) +{ + if (true == tx_resume) + return; + + /* Pause TX */ + hdd_notice("Disabling queues"); + wlan_hdd_netif_queue_control(pAdapter, WLAN_STOP_ALL_NETIF_QUEUE, + WLAN_DATA_FLOW_CONTROL); + + if (QDF_TIMER_STATE_STOPPED == + qdf_mc_timer_get_current_state(&pAdapter-> + tx_flow_control_timer)) { + QDF_STATUS status; + status = qdf_mc_timer_start(&pAdapter->tx_flow_control_timer, + WLAN_HDD_TX_FLOW_CONTROL_OS_Q_BLOCK_TIME); + + if (!QDF_IS_STATUS_SUCCESS(status)) + hdd_err("Failed to start tx_flow_control_timer"); + else + pAdapter->hdd_stats.hddTxRxStats.txflow_timer_cnt++; + } + + pAdapter->hdd_stats.hddTxRxStats.txflow_pause_cnt++; + pAdapter->hdd_stats.hddTxRxStats.is_txflow_paused = true; + + return; +} +#else + +static inline void +hdd_tx_resume_false(hdd_adapter_t *pAdapter, bool tx_resume) +{ + return; +} +#endif /** * hdd_tx_resume_cb() - Resume OS TX Q. @@ -135,6 +182,8 @@ void hdd_tx_resume_cb(void *adapter_context, bool tx_resume) WLAN_WAKE_ALL_NETIF_QUEUE, WLAN_DATA_FLOW_CONTROL); } + hdd_tx_resume_false(pAdapter, tx_resume); + return; } diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index 0ecb1258755c..476e4a68b752 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -592,6 +592,7 @@ typedef struct sSirMbMsgP2p { #define SIR_HAL_PDEV_SET_HW_MODE_RESP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 330) #define SIR_HAL_PDEV_HW_MODE_TRANS_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 331) +#define SIR_HAL_BAD_PEER_TX_CTL_INI_CMD (SIR_HAL_ITC_MSG_TYPES_BEGIN + 332) #define SIR_HAL_SET_RSSI_MONITOR_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 333) #define SIR_HAL_SET_IE_INFO (SIR_HAL_ITC_MSG_TYPES_BEGIN + 334) diff --git a/core/mac/src/pe/lim/lim_process_tdls.c b/core/mac/src/pe/lim/lim_process_tdls.c index 9016fbf2c412..53ec5b0ab084 100644 --- a/core/mac/src/pe/lim/lim_process_tdls.c +++ b/core/mac/src/pe/lim/lim_process_tdls.c @@ -846,10 +846,64 @@ static void populate_dotf_tdls_vht_aid(tpAniSirGlobal pMac, uint32_t selfDot11Mo } } +#ifdef CONFIG_HL_SUPPORT + +/** + * wma_tx_frame_with_tx_complete_send() - Send tx frames on Direct link or AP link + * depend on reason code + * @pMac: pointer to MAC Sirius parameter structure + * @pPacket: pointer to mgmt packet + * @nBytes: number of bytes to send + * @tid:tid value for AC + * @pFrame: pointer to tdls frame + * @smeSessionId:session id + * @flag: tdls flag + * + * Send TDLS Teardown frame on Direct link or AP link, depends on reason code. + * + * Return: None + */ +static inline QDF_STATUS +wma_tx_frame_with_tx_complete_send(tpAniSirGlobal pMac, void *pPacket, + uint16_t nBytes, + uint8_t tid, + uint8_t *pFrame, + uint8_t smeSessionId, bool flag) +{ + return wma_tx_frameWithTxComplete(pMac, pPacket, + (uint16_t) nBytes, + TXRX_FRM_802_11_DATA, + ANI_TXDIR_TODS, + tid, + lim_tx_complete, pFrame, + lim_mgmt_tx_complete, + HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME, + smeSessionId, flag, 0); +} +#else + +static inline QDF_STATUS +wma_tx_frame_with_tx_complete_send(tpAniSirGlobal pMac, void *pPacket, + uint16_t nBytes, + uint8_t tid, + uint8_t *pFrame, + uint8_t smeSessionId, bool flag) +{ + return wma_tx_frameWithTxComplete(pMac, pPacket, + (uint16_t) nBytes, + TXRX_FRM_802_11_DATA, + ANI_TXDIR_TODS, + tid, + lim_tx_complete, pFrame, + lim_mgmt_tx_complete, + HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME, + smeSessionId, false, 0); +} +#endif + /* * TDLS setup Request frame on AP link */ - tSirRetStatus lim_send_tdls_link_setup_req_frame(tpAniSirGlobal pMac, struct qdf_mac_addr peer_mac, uint8_t dialog, @@ -1108,14 +1162,11 @@ tSirRetStatus lim_send_tdls_link_setup_req_frame(tpAniSirGlobal pMac, pMac->lim.mgmtFrameSessionId = psessionEntry->peSessionId; - qdf_status = wma_tx_frameWithTxComplete(pMac, pPacket, (uint16_t) nBytes, - TXRX_FRM_802_11_DATA, - ANI_TXDIR_TODS, - TID_AC_VI, - lim_tx_complete, pFrame, - lim_mgmt_tx_complete, - HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME, - smeSessionId, false, 0); + qdf_status = wma_tx_frame_with_tx_complete_send(pMac, pPacket, + (uint16_t) nBytes, + TID_AC_VI, + pFrame, + smeSessionId, true); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pMac->lim.mgmtFrameSessionId = 0xff; @@ -1310,14 +1361,13 @@ tSirRetStatus lim_send_tdls_teardown_frame(tpAniSirGlobal pMac, pMac->lim.mgmtFrameSessionId = psessionEntry->peSessionId; - qdf_status = wma_tx_frameWithTxComplete(pMac, pPacket, (uint16_t) nBytes, - TXRX_FRM_802_11_DATA, - ANI_TXDIR_TODS, - TID_AC_VI, - lim_tx_complete, pFrame, - lim_mgmt_tx_complete, - HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME, - smeSessionId, false, 0); + qdf_status = wma_tx_frame_with_tx_complete_send(pMac, pPacket, + (uint16_t) nBytes, + TID_AC_VI, + pFrame, + smeSessionId, + (reason == eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE) + ? true : false); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pMac->lim.mgmtFrameSessionId = 0xff; @@ -1588,14 +1638,11 @@ static tSirRetStatus lim_send_tdls_setup_rsp_frame(tpAniSirGlobal pMac, pMac->lim.mgmtFrameSessionId = psessionEntry->peSessionId; - qdf_status = wma_tx_frameWithTxComplete(pMac, pPacket, (uint16_t) nBytes, - TXRX_FRM_802_11_DATA, - ANI_TXDIR_TODS, - TID_AC_VI, - lim_tx_complete, pFrame, - lim_mgmt_tx_complete, - HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME, - smeSessionId, false, 0); + qdf_status = wma_tx_frame_with_tx_complete_send(pMac, pPacket, + (uint16_t) nBytes, + TID_AC_VI, + pFrame, + smeSessionId, true); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pMac->lim.mgmtFrameSessionId = 0xff; @@ -1808,14 +1855,11 @@ tSirRetStatus lim_send_tdls_link_setup_cnf_frame(tpAniSirGlobal pMac, pMac->lim.mgmtFrameSessionId = psessionEntry->peSessionId; - qdf_status = wma_tx_frameWithTxComplete(pMac, pPacket, (uint16_t) nBytes, - TXRX_FRM_802_11_DATA, - ANI_TXDIR_TODS, - TID_AC_VI, - lim_tx_complete, pFrame, - lim_mgmt_tx_complete, - HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME, - smeSessionId, false, 0); + qdf_status = wma_tx_frame_with_tx_complete_send(pMac, pPacket, + (uint16_t) nBytes, + TID_AC_VI, + pFrame, + smeSessionId, true); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pMac->lim.mgmtFrameSessionId = 0xff;