diff options
| author | Naveen Rawat <naveenrawat@codeaurora.org> | 2017-08-22 15:28:32 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-08-25 13:25:50 -0700 |
| commit | dfc634bc8b4f8380fc348a7493e09e088e7c546f (patch) | |
| tree | 64b19d156ada2ec4229ce472b7f28f54396dccd3 | |
| parent | ff16bd817b952545af1d5f4a6ba27de5675b41f3 (diff) | |
qcacld-3.0: Add support to send rate information for mgmt frames
Add support to send rate information for mgmt frames.
Currently default rates are used by target for the mgmt frames
before association. If the AP does not support the default rates
(1 Mbps for 2.4G and 6Mbps for 5G), STA would still send AUTH,
ASSOC frames with the default rates. This change set will add
support to send the minimum rate supported by the AP as part of
the MGMT Tx WMI command.
Change-Id: I38d832818bbbd5fe3dec5660bd01dd08798bf0be
CRs-Fixed: 2085006
| -rw-r--r-- | core/mac/src/pe/lim/lim_p2p.c | 4 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_tdls.c | 9 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_send_frames_host_roam.c | 5 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_send_management_frames.c | 57 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_utils.c | 61 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_utils.h | 12 | ||||
| -rw-r--r-- | core/wma/inc/wma_types.h | 28 | ||||
| -rw-r--r-- | core/wma/src/wma_data.c | 66 |
8 files changed, 204 insertions, 38 deletions
diff --git a/core/mac/src/pe/lim/lim_p2p.c b/core/mac/src/pe/lim/lim_p2p.c index 66231237a384..e95ca1727f48 100644 --- a/core/mac/src/pe/lim/lim_p2p.c +++ b/core/mac/src/pe/lim/lim_p2p.c @@ -470,7 +470,7 @@ static void lim_tx_action_frame(tpAniSirGlobal mac_ctx, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, tx_flag, sme_session_id, - channel_freq); + channel_freq, RATEID_DEFAULT); if (!mb_msg->noack) lim_p2p_action_cnf(mac_ctx, @@ -485,7 +485,7 @@ static void lim_tx_action_frame(tpAniSirGlobal mac_ctx, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, lim_p2p_action_cnf, tx_flag, sme_session_id, false, - channel_freq); + channel_freq, RATEID_DEFAULT); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pe_err("couldn't send action frame"); diff --git a/core/mac/src/pe/lim/lim_process_tdls.c b/core/mac/src/pe/lim/lim_process_tdls.c index b0e01bc10688..1e5a93e73502 100644 --- a/core/mac/src/pe/lim/lim_process_tdls.c +++ b/core/mac/src/pe/lim/lim_process_tdls.c @@ -669,7 +669,7 @@ static tSirRetStatus lim_send_tdls_dis_req_frame(tpAniSirGlobal pMac, lim_mgmt_tdls_tx_complete, HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME | HAL_USE_PEER_STA_REQUESTED_MASK, - smeSessionId, false, 0); + smeSessionId, false, 0, RATEID_DEFAULT); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pMac->lim.tdls_frm_session_id = NO_SESSION; pe_err("could not send TDLS Discovery Request frame"); @@ -975,7 +975,8 @@ static tSirRetStatus lim_send_tdls_dis_rsp_frame(tpAniSirGlobal pMac, lim_tx_complete, pFrame, lim_mgmt_tdls_tx_complete, HAL_USE_SELF_STA_REQUESTED_MASK, - smeSessionId, false, 0); + smeSessionId, false, 0, + RATEID_DEFAULT); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pMac->lim.tdls_frm_session_id = NO_SESSION; pe_err("could not send TDLS Discovery Response frame!"); @@ -1057,7 +1058,7 @@ wma_tx_frame_with_tx_complete_send(tpAniSirGlobal pMac, void *pPacket, lim_mgmt_tdls_tx_complete, HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME | HAL_USE_PEER_STA_REQUESTED_MASK, - smeSessionId, flag, 0); + smeSessionId, flag, 0, RATEID_DEFAULT); } #else @@ -1077,7 +1078,7 @@ wma_tx_frame_with_tx_complete_send(tpAniSirGlobal pMac, void *pPacket, lim_mgmt_tdls_tx_complete, HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME | HAL_USE_PEER_STA_REQUESTED_MASK, - smeSessionId, false, 0); + smeSessionId, false, 0, RATEID_DEFAULT); } #endif diff --git a/core/mac/src/pe/lim/lim_send_frames_host_roam.c b/core/mac/src/pe/lim/lim_send_frames_host_roam.c index 95ae7acfffe8..e8a39163bcc3 100644 --- a/core/mac/src/pe/lim/lim_send_frames_host_roam.c +++ b/core/mac/src/pe/lim/lim_send_frames_host_roam.c @@ -442,7 +442,7 @@ void lim_send_reassoc_req_with_ft_ies_mgmt_frame(tpAniSirGlobal mac_ctx, (uint16_t) (bytes + ft_ies_length), TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, tx_flag, sme_sessionid, - 0); + 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, pe_session->peSessionId, qdf_status)); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { @@ -762,7 +762,8 @@ void lim_send_reassoc_req_mgmt_frame(tpAniSirGlobal pMac, wma_tx_frame(pMac, pPacket, (uint16_t) (sizeof(tSirMacMgmtHdr) + nPayload), TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, - lim_tx_complete, pFrame, txFlag, smeSessionId, 0); + lim_tx_complete, pFrame, txFlag, smeSessionId, 0, + RATEID_DEFAULT); MTRACE(qdf_trace (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); diff --git a/core/mac/src/pe/lim/lim_send_management_frames.c b/core/mac/src/pe/lim/lim_send_management_frames.c index 6c84973b825e..29c40f9e9935 100644 --- a/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/core/mac/src/pe/lim/lim_send_management_frames.c @@ -449,7 +449,7 @@ lim_send_probe_req_mgmt_frame(tpAniSirGlobal mac_ctx, (uint16_t) sizeof(tSirMacMgmtHdr) + payload, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, txflag, sme_sessionid, - 0); + 0, RATEID_DEFAULT); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { pe_err("could not send Probe Request frame!"); /* Pkt will be freed up by the callback */ @@ -852,7 +852,7 @@ lim_send_probe_rsp_mgmt_frame(tpAniSirGlobal mac_ctx, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, tx_flag, - sme_sessionid, 0); + sme_sessionid, 0, RATEID_DEFAULT); /* Pkt will be freed up by the callback */ if (!QDF_IS_STATUS_SUCCESS(qdf_status)) @@ -1066,7 +1066,7 @@ lim_send_addts_req_action_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); @@ -1411,7 +1411,7 @@ lim_send_assoc_rsp_mgmt_frame(tpAniSirGlobal mac_ctx, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, tx_flag, - sme_session, 0); + sme_session, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, pe_session->peSessionId, qdf_status)); @@ -1558,7 +1558,7 @@ lim_send_delts_req_action_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); /* Pkt will be freed up by the callback */ @@ -1637,6 +1637,7 @@ lim_send_assoc_req_mgmt_frame(tpAniSirGlobal mac_ctx, uint8_t *bcn_ie = NULL; uint32_t bcn_ie_len = 0; uint32_t aes_block_size_len = 0; + enum rateid min_rid = RATEID_DEFAULT; if (NULL == pe_session) { pe_err("pe_session is NULL"); @@ -2028,13 +2029,14 @@ lim_send_assoc_req_mgmt_frame(tpAniSirGlobal mac_ctx, MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT, pe_session->peSessionId, mac_hdr->fc.subType)); + min_rid = lim_get_min_session_txrate(pe_session); pe_debug("Sending Association Request length %d to ", bytes); qdf_status = wma_tx_frameWithTxComplete(mac_ctx, packet, (uint16_t) (sizeof(tSirMacMgmtHdr) + payload), TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, lim_assoc_tx_complete_cnf, - tx_flag, sme_sessionid, false, 0); + tx_flag, sme_sessionid, false, 0, min_rid); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, pe_session->peSessionId, qdf_status)); @@ -2119,6 +2121,7 @@ lim_send_auth_mgmt_frame(tpAniSirGlobal mac_ctx, uint8_t sme_sessionid = 0; uint16_t ft_ies_length = 0, auth_ack_status; bool challenge_req = false; + enum rateid min_rid = RATEID_DEFAULT; if (NULL == session) { pe_err("Error: psession Entry is NULL"); @@ -2386,12 +2389,15 @@ alloc_packet: session->peSessionId, mac_hdr->fc.subType)); mac_ctx->auth_ack_status = LIM_AUTH_ACK_NOT_RCD; + + min_rid = lim_get_min_session_txrate(session); qdf_status = wma_tx_frameWithTxComplete(mac_ctx, packet, (uint16_t)frame_len, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, lim_auth_tx_complete_cnf, - tx_flag, sme_sessionid, false, 0); + tx_flag, sme_sessionid, false, 0, + min_rid); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, session->peSessionId, qdf_status)); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { @@ -2731,7 +2737,8 @@ lim_send_disassoc_mgmt_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, lim_disassoc_tx_complete_cnf, - txFlag, smeSessionId, false, 0); + txFlag, smeSessionId, false, 0, + RATEID_DEFAULT); MTRACE(qdf_trace (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); @@ -2761,7 +2768,7 @@ lim_send_disassoc_mgmt_frame(tpAniSirGlobal pMac, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); @@ -2906,7 +2913,8 @@ lim_send_deauth_mgmt_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, lim_deauth_tx_complete_cnf, - txFlag, smeSessionId, false, 0); + txFlag, smeSessionId, false, 0, + RATEID_DEFAULT); MTRACE(qdf_trace (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); @@ -2949,7 +2957,7 @@ lim_send_deauth_mgmt_frame(tpAniSirGlobal pMac, wma_tx_frame(pMac, pPacket, (uint16_t) nBytes, TXRX_FRM_802_11_MGMT, ANI_TXDIR_IBSS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); } else { #endif /* Queue Disassociation frame in high priority WQ */ @@ -2957,7 +2965,7 @@ lim_send_deauth_mgmt_frame(tpAniSirGlobal pMac, wma_tx_frame(pMac, pPacket, (uint16_t) nBytes, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); #ifdef FEATURE_WLAN_TDLS } #endif @@ -3087,7 +3095,7 @@ lim_send_meas_report_frame(tpAniSirGlobal pMac, qdf_status = wma_tx_frame(pMac, pPacket, (uint16_t) nBytes, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, - lim_tx_complete, pFrame, 0, 0); + lim_tx_complete, pFrame, 0, 0, RATEID_DEFAULT); MTRACE(qdf_trace (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, ((psessionEntry) ? psessionEntry->peSessionId : NO_SESSION), @@ -3187,7 +3195,7 @@ lim_send_tpc_request_frame(tpAniSirGlobal pMac, qdf_status = wma_tx_frame(pMac, pPacket, (uint16_t) nBytes, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, - lim_tx_complete, pFrame, 0, 0); + lim_tx_complete, pFrame, 0, 0, RATEID_DEFAULT); MTRACE(qdf_trace (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, ((psessionEntry) ? psessionEntry->peSessionId : NO_SESSION), @@ -3290,7 +3298,7 @@ lim_send_tpc_report_frame(tpAniSirGlobal pMac, qdf_status = wma_tx_frame(pMac, pPacket, (uint16_t) nBytes, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, - lim_tx_complete, pFrame, 0, 0); + lim_tx_complete, pFrame, 0, 0, RATEID_DEFAULT); MTRACE(qdf_trace (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, ((psessionEntry) ? psessionEntry->peSessionId : NO_SESSION), @@ -3420,7 +3428,7 @@ lim_send_channel_switch_mgmt_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { @@ -3547,7 +3555,8 @@ lim_send_extended_chan_switch_action_frame(tpAniSirGlobal mac_ctx, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, - txFlag, sme_session_id, 0); + txFlag, sme_session_id, 0, + RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, session_entry->peSessionId, qdf_status)); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { @@ -3691,7 +3700,7 @@ lim_p2p_oper_chan_change_confirm_action_frame(tpAniSirGlobal mac_ctx, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, frame, lim_oper_chan_change_confirm_tx_complete_cnf, - tx_flag, sme_session_id, false, 0); + tx_flag, sme_session_id, false, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, session_entry->peSessionId, qdf_status)); @@ -3794,7 +3803,7 @@ lim_send_vht_opmode_notification_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { @@ -3929,7 +3938,7 @@ lim_send_neighbor_report_request_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); if (QDF_STATUS_SUCCESS != qdf_status) { @@ -4076,7 +4085,7 @@ lim_send_link_report_action_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); if (QDF_STATUS_SUCCESS != qdf_status) { @@ -4263,7 +4272,7 @@ lim_send_radio_measure_report_action_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); if (QDF_STATUS_SUCCESS != qdf_status) { @@ -4399,7 +4408,7 @@ tSirRetStatus lim_send_sa_query_request_frame(tpAniSirGlobal pMac, uint8_t *tran TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); if (QDF_STATUS_SUCCESS != qdf_status) { pe_err("wma_tx_frame FAILED! Status [%d]", qdf_status); nSirStatus = eSIR_FAILURE; @@ -4531,7 +4540,7 @@ tSirRetStatus lim_send_sa_query_response_frame(tpAniSirGlobal pMac, TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); + smeSessionId, 0, RATEID_DEFAULT); MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, psessionEntry->peSessionId, qdf_status)); if (QDF_STATUS_SUCCESS != qdf_status) { diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index ebd394792280..79eb0ad07a77 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -7486,3 +7486,64 @@ bool lim_check_if_vendor_oui_match(tpAniSirGlobal mac_ctx, else return false; } + +enum rateid lim_get_min_session_txrate(tpPESession session) +{ + enum rateid rid = RATEID_DEFAULT; + uint8_t min_rate = SIR_MAC_RATE_54, curr_rate, i; + tSirMacRateSet *rateset = &session->rateSet; + + if (!session) + return rid; + + for (i = 0; i < rateset->numRates; i++) { + /* Ignore MSB - set to indicate basic rate */ + curr_rate = rateset->rate[i] & 0x7F; + min_rate = (curr_rate < min_rate) ? curr_rate : min_rate; + } + pe_debug("supported min_rate: %0x(%d)", min_rate, min_rate); + + switch (min_rate) { + case SIR_MAC_RATE_1: + rid = RATEID_1MBPS; + break; + case SIR_MAC_RATE_2: + rid = RATEID_2MBPS; + break; + case SIR_MAC_RATE_5_5: + rid = RATEID_5_5MBPS; + break; + case SIR_MAC_RATE_11: + rid = RATEID_11MBPS; + break; + case SIR_MAC_RATE_6: + rid = RATEID_6MBPS; + break; + case SIR_MAC_RATE_9: + rid = RATEID_9MBPS; + break; + case SIR_MAC_RATE_12: + rid = RATEID_12MBPS; + break; + case SIR_MAC_RATE_18: + rid = RATEID_18MBPS; + break; + case SIR_MAC_RATE_24: + rid = RATEID_24MBPS; + break; + case SIR_MAC_RATE_36: + rid = RATEID_36MBPS; + break; + case SIR_MAC_RATE_48: + rid = RATEID_48MBPS; + break; + case SIR_MAC_RATE_54: + rid = RATEID_54MBPS; + break; + default: + rid = RATEID_DEFAULT; + break; + } + + return rid; +} diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index 65b08fc042d0..5c4f8b2fcc1c 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -795,4 +795,16 @@ void lim_assoc_rej_add_to_rssi_based_reject_list(tpAniSirGlobal mac_ctx, bool lim_check_if_vendor_oui_match(tpAniSirGlobal mac_ctx, uint8_t *oui, uint8_t oui_len, uint8_t *ie, uint8_t ie_len); + +/** + * lim_get_min_session_txrate() - Get the minimum rate supported in the session + * @session: Pointer to PE session + * + * This API will find the minimum rate supported by the given PE session and + * return the enum rateid corresponding to the rate. + * + * Return: enum rateid + */ +enum rateid lim_get_min_session_txrate(tpPESession session); + #endif /* __LIM_UTILS_H */ diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 7c1b23d8b90e..15894889ca49 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -511,7 +511,7 @@ #define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 #define wma_tx_frame(hHal, pFrmBuf, frmLen, frmType, txDir, tid, pCompFunc, \ - pData, txFlag, sessionid, channel_freq) \ + pData, txFlag, sessionid, channel_freq, rid) \ (QDF_STATUS)( wma_tx_packet( \ cds_get_context(QDF_MODULE_ID_WMA), \ (pFrmBuf), \ @@ -525,11 +525,12 @@ (txFlag), \ (sessionid), \ (false), \ - (channel_freq))) + (channel_freq), \ + (rid))) #define wma_tx_frameWithTxComplete(hHal, pFrmBuf, frmLen, frmType, txDir, tid, \ pCompFunc, pData, pCBackFnTxComp, txFlag, sessionid, tdlsflag, \ - channel_freq) \ + channel_freq, rid) \ (QDF_STATUS)( wma_tx_packet( \ cds_get_context(QDF_MODULE_ID_WMA), \ (pFrmBuf), \ @@ -543,7 +544,8 @@ (txFlag), \ (sessionid), \ (tdlsflag), \ - (channel_freq))) + (channel_freq), \ + (rid))) #define WMA_SetEnableSSR(enable_ssr) ((void)enable_ssr) @@ -702,6 +704,22 @@ enum wma_tdls_off_chan_mode { #endif /* FEATURE_WLAN_TDLS */ +enum rateid { + RATEID_1MBPS = 0, + RATEID_2MBPS, + RATEID_5_5MBPS, + RATEID_11MBPS, + RATEID_6MBPS, + RATEID_9MBPS, + RATEID_12MBPS, + RATEID_18MBPS, + RATEID_24MBPS, + RATEID_36MBPS, + RATEID_48MBPS = 10, + RATEID_54MBPS, + RATEID_DEFAULT +}; + tSirRetStatus wma_post_ctrl_msg(tpAniSirGlobal pMac, tSirMsgQ *pMsg); tSirRetStatus u_mac_post_ctrl_msg(void *pSirGlobal, tSirMbMsg *pMb); @@ -726,7 +744,7 @@ QDF_STATUS wma_tx_packet(void *pWMA, void *pData, pWMAAckFnTxComp pAckTxComp, uint8_t txFlag, uint8_t sessionId, bool tdlsflag, - uint16_t channel_freq); + uint16_t channel_freq, enum rateid rid); /** * wma_vdev_init() - initialize a wma vdev diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index 582a433fd214..3784b6533d91 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -2514,6 +2514,58 @@ void wmi_desc_put(tp_wma_handle wma_handle, struct wmi_desc_t *wmi_desc) } /** + * rate_pream: Mapping from data rates to preamble. + */ +static uint32_t rate_pream[] = {WMI_RATE_PREAMBLE_CCK, WMI_RATE_PREAMBLE_CCK, + WMI_RATE_PREAMBLE_CCK, WMI_RATE_PREAMBLE_CCK, + WMI_RATE_PREAMBLE_OFDM, WMI_RATE_PREAMBLE_OFDM, + WMI_RATE_PREAMBLE_OFDM, WMI_RATE_PREAMBLE_OFDM, + WMI_RATE_PREAMBLE_OFDM, WMI_RATE_PREAMBLE_OFDM, + WMI_RATE_PREAMBLE_OFDM, WMI_RATE_PREAMBLE_OFDM}; + +/** + * rate_mcs: Mapping from data rates to MCS (+4 for OFDM to keep the sequence). + */ +static uint32_t rate_mcs[] = {WMI_MAX_CCK_TX_RATE_1M, WMI_MAX_CCK_TX_RATE_2M, + WMI_MAX_CCK_TX_RATE_5_5M, WMI_MAX_CCK_TX_RATE_11M, + WMI_MAX_OFDM_TX_RATE_6M + 4, + WMI_MAX_OFDM_TX_RATE_9M + 4, + WMI_MAX_OFDM_TX_RATE_12M + 4, + WMI_MAX_OFDM_TX_RATE_18M + 4, + WMI_MAX_OFDM_TX_RATE_24M + 4, + WMI_MAX_OFDM_TX_RATE_36M + 4, + WMI_MAX_OFDM_TX_RATE_48M + 4, + WMI_MAX_OFDM_TX_RATE_54M + 4}; + +#define WMA_TX_SEND_MGMT_TYPE 0 +#define WMA_TX_SEND_DATA_TYPE 1 + +/** + * wma_update_tx_send_params() - Update tx_send_params TLV info + * @tx_param: Pointer to tx_send_params + * @rid: rate ID passed by PE + * + * Return: None + */ +static void wma_update_tx_send_params(struct tx_send_params *tx_param, + enum rateid rid) +{ + uint8_t preamble = 0, nss = 0, rix = 0; + + preamble = rate_pream[rid]; + rix = rate_mcs[rid]; + + tx_param->mcs_mask = (1 << rix); + tx_param->nss_mask = (1 << nss); + tx_param->preamble_type = (1 << preamble); + tx_param->frame_type = WMA_TX_SEND_MGMT_TYPE; + + WMA_LOGD(FL("rate_id: %d, mcs: %0x, nss: %0x, preamble: %0x"), + rid, tx_param->mcs_mask, tx_param->nss_mask, + tx_param->preamble_type); +} + +/** * wma_tx_packet() - Sends Tx Frame to TxRx * @wma_context: wma context * @tx_frame: frame buffer @@ -2537,7 +2589,8 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, eFrameType frmType, eFrameTxDir txDir, uint8_t tid, pWMATxRxCompFunc tx_frm_download_comp_cb, void *pData, pWMAAckFnTxComp tx_frm_ota_comp_cb, uint8_t tx_flag, - uint8_t vdev_id, bool tdlsFlag, uint16_t channel_freq) + uint8_t vdev_id, bool tdlsFlag, uint16_t channel_freq, + enum rateid rid) { tp_wma_handle wma_handle = (tp_wma_handle) (wma_context); int32_t status; @@ -2900,6 +2953,17 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, mgmt_param.pdata = pData; mgmt_param.chanfreq = chanfreq; mgmt_param.qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); + /* + * Update the tx_params TLV only for rates + * other than 1Mbps and 6 Mbps + */ + if (rid < RATEID_DEFAULT && + (rid != RATEID_1MBPS && rid != RATEID_6MBPS)) { + WMA_LOGD(FL("using rate id: %d for Tx"), rid); + mgmt_param.tx_params_valid = true; + wma_update_tx_send_params(&mgmt_param.tx_param, rid); + } + wmi_desc = wmi_desc_get(wma_handle); if (!wmi_desc) { /* Countinous failure can cause flooding of logs */ |
