From 558f8085c4a01de1ac8b596cffde5b714687ebcd Mon Sep 17 00:00:00 2001 From: Will Huang Date: Wed, 31 May 2017 16:22:24 +0800 Subject: [PATCH] qcacld-3.0: Add support of request peer stats info(part 2) qcacld-2.0 to qcacld-3.0 propagation FW has limitation to support old WMI_REQUEST_STATS_CMDID and WMI_UPDATE_STATS_EVENTID interface on AP vDev. FW suggest to use new WMI_REQUEST_PEER_STATS_INFO_CMDID and WMI_PEER_STATS_INFO_EVENTID to get tx/rx rate. This checkin is about LIM/SME/SAP layer, provide SME APIs/callbacks to HDD layer to get SAP's peer station tx/rx related information, fill these information from wma layer get-peer-stat-info APIs and peer station's association request frame. It also fixed function csr_send_assoc_ind_to_upper_layer_cnf_msg when copy information between different structures and using offset style. Change-Id: Icb1aaa126663af7eaedd1c4db86ca25c40ce6ee9 CRs-Fixed: 2051628 --- core/mac/inc/sir_api.h | 17 +++ .../src/pe/lim/lim_process_assoc_req_frame.c | 96 ++++++++++++++++ .../src/pe/lim/lim_process_mlm_rsp_messages.c | 11 ++ core/mac/src/pe/lim/lim_types.h | 11 ++ .../src/sys/legacy/src/utils/src/mac_trace.c | 2 + core/sap/inc/sap_api.h | 11 ++ core/sap/src/sap_fsm.c | 11 ++ core/sme/inc/csr_api.h | 22 ++++ core/sme/inc/sme_api.h | 33 ++++++ core/sme/inc/sme_internal.h | 8 ++ core/sme/src/common/sme_api.c | 106 ++++++++++++++++++ core/sme/src/csr/csr_api_roam.c | 103 ++++++++++++----- 12 files changed, 403 insertions(+), 28 deletions(-) diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 1dc99e34558b..e30acfd1d330 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -1287,6 +1287,12 @@ typedef struct sSirSmeChanInfo { enum phy_ch_width ch_width; } tSirSmeChanInfo, *tpSirSmeChanInfo; +enum sir_sme_phy_mode { + SIR_SME_PHY_MODE_LEGACY = 0, + SIR_SME_PHY_MODE_HT = 1, + SIR_SME_PHY_MODE_VHT = 2 +}; + /* / Definition for Association indication from peer */ /* / MAC ---> */ typedef struct sSirSmeAssocInd { @@ -1324,6 +1330,17 @@ typedef struct sSirSmeAssocInd { /* Timing measurement capability */ uint8_t timingMeasCap; tSirSmeChanInfo chan_info; + bool ampdu; + bool sgi_enable; + bool tx_stbc; + bool rx_stbc; + tSirMacHTChannelWidth ch_width; + enum sir_sme_phy_mode mode; + uint8_t max_supp_idx; + uint8_t max_ext_idx; + uint8_t max_mcs_idx; + uint8_t rx_mcs_map; + uint8_t tx_mcs_map; } tSirSmeAssocInd, *tpSirSmeAssocInd; /* / Definition for Association confirm */ diff --git a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c index d13d49aeca2a..9c39b71e694a 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c +++ b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c @@ -2110,6 +2110,50 @@ static void lim_fill_assoc_ind_vht_info(tpAniSirGlobal mac_ctx, return; } +static uint8_t lim_get_max_rate_idx(tSirMacRateSet *rateset) +{ + uint8_t maxidx; + int i; + + maxidx = rateset->rate[0] & 0x7f; + for (i = 1; i < rateset->numRates; i++) { + if ((rateset->rate[i] & 0x7f) > maxidx) + maxidx = rateset->rate[i] & 0x7f; + } + + return maxidx; +} + +static void fill_mlm_assoc_ind_vht(tpSirAssocReq assocreq, + tpDphHashNode stads, + tpLimMlmAssocInd assocind) +{ + if (stads->mlmStaContext.vhtCapability) { + /* ampdu */ + assocind->ampdu = true; + + /* sgi */ + if (assocreq->VHTCaps.shortGI80MHz || + assocreq->VHTCaps.shortGI160and80plus80MHz) + assocind->sgi_enable = true; + + /* stbc */ + assocind->tx_stbc = assocreq->VHTCaps.txSTBC; + assocind->rx_stbc = assocreq->VHTCaps.rxSTBC; + + /* ch width */ + assocind->ch_width = stads->vhtSupportedChannelWidthSet ? + eHT_CHANNEL_WIDTH_80MHZ : + stads->htSupportedChannelWidthSet ? + eHT_CHANNEL_WIDTH_40MHZ : eHT_CHANNEL_WIDTH_20MHZ; + + /* mode */ + assocind->mode = SIR_SME_PHY_MODE_VHT; + assocind->rx_mcs_map = assocreq->VHTCaps.rxMCSMap & 0xff; + assocind->tx_mcs_map = assocreq->VHTCaps.txMCSMap & 0xff; + } +} + /** * lim_send_mlm_assoc_ind() - Sends assoc indication to SME * @mac_ctx: Global Mac context @@ -2130,6 +2174,7 @@ void lim_send_mlm_assoc_ind(tpAniSirGlobal mac_ctx, uint32_t phy_mode; uint8_t sub_type; uint8_t *wpsie = NULL; + uint8_t maxidx, i; uint32_t tmp; /* Get a copy of the already parsed Assoc Request */ @@ -2295,6 +2340,57 @@ void lim_send_mlm_assoc_ind(tpAniSirGlobal mac_ctx, assoc_ind->chan_info.nss = sta_ds->nss; assoc_ind->chan_info.rate_flags = lim_get_max_rate_flags(mac_ctx, sta_ds); + assoc_ind->ampdu = false; + assoc_ind->sgi_enable = false; + assoc_ind->tx_stbc = false; + assoc_ind->rx_stbc = false; + assoc_ind->ch_width = eHT_CHANNEL_WIDTH_20MHZ; + assoc_ind->mode = SIR_SME_PHY_MODE_LEGACY; + assoc_ind->max_supp_idx = 0xff; + assoc_ind->max_ext_idx = 0xff; + assoc_ind->max_mcs_idx = 0xff; + assoc_ind->rx_mcs_map = 0xff; + assoc_ind->tx_mcs_map = 0xff; + + if (assoc_req->supportedRates.numRates) + assoc_ind->max_supp_idx = + lim_get_max_rate_idx( + &assoc_req->supportedRates); + if (assoc_req->extendedRates.numRates) + assoc_ind->max_ext_idx = + lim_get_max_rate_idx( + &assoc_req->extendedRates); + + if (sta_ds->mlmStaContext.htCapability) { + /* ampdu */ + assoc_ind->ampdu = true; + + /* sgi */ + if (sta_ds->htShortGI20Mhz || sta_ds->htShortGI40Mhz) + assoc_ind->sgi_enable = true; + + /* stbc */ + assoc_ind->tx_stbc = assoc_req->HTCaps.txSTBC; + assoc_ind->rx_stbc = assoc_req->HTCaps.rxSTBC; + + /* ch width */ + assoc_ind->ch_width = + sta_ds->htSupportedChannelWidthSet ? + eHT_CHANNEL_WIDTH_40MHZ : + eHT_CHANNEL_WIDTH_20MHZ; + + /* mode */ + assoc_ind->mode = SIR_SME_PHY_MODE_HT; + maxidx = 0; + for (i = 0; i < 8; i++) { + if (assoc_req->HTCaps.supportedMCSSet[0] & + (1 << i)) + maxidx = i; + } + assoc_ind->max_mcs_idx = maxidx; + } + fill_mlm_assoc_ind_vht(assoc_req, sta_ds, assoc_ind); + /* updates VHT information in assoc indication */ lim_fill_assoc_ind_vht_info(mac_ctx, session_entry, assoc_req, assoc_ind); diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index fda70245cb5e..209e209aa61c 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c @@ -772,6 +772,17 @@ lim_fill_assoc_ind_params(tpAniSirGlobal mac_ctx, sizeof(tSirSmeChanInfo)); /* Fill in WmmInfo */ sme_assoc_ind->wmmEnabledSta = assoc_ind->WmmStaInfoPresent; + sme_assoc_ind->ampdu = assoc_ind->ampdu; + sme_assoc_ind->sgi_enable = assoc_ind->sgi_enable; + sme_assoc_ind->tx_stbc = assoc_ind->tx_stbc; + sme_assoc_ind->rx_stbc = assoc_ind->rx_stbc; + sme_assoc_ind->ch_width = assoc_ind->ch_width; + sme_assoc_ind->mode = assoc_ind->mode; + sme_assoc_ind->max_supp_idx = assoc_ind->max_supp_idx; + sme_assoc_ind->max_ext_idx = assoc_ind->max_ext_idx; + sme_assoc_ind->max_mcs_idx = assoc_ind->max_mcs_idx; + sme_assoc_ind->rx_mcs_map = assoc_ind->rx_mcs_map; + sme_assoc_ind->tx_mcs_map = assoc_ind->tx_mcs_map; } /** diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index 72c86581550c..4cfa3d749e0a 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/core/mac/src/pe/lim/lim_types.h @@ -266,6 +266,17 @@ typedef struct sLimMlmAssocInd { uint32_t assocReqLength; uint8_t *assocReqPtr; tSirSmeChanInfo chan_info; + bool ampdu; + bool sgi_enable; + bool tx_stbc; + bool rx_stbc; + tSirMacHTChannelWidth ch_width; + enum sir_sme_phy_mode mode; + uint8_t max_supp_idx; + uint8_t max_ext_idx; + uint8_t max_mcs_idx; + uint8_t rx_mcs_map; + uint8_t tx_mcs_map; } tLimMlmAssocInd, *tpLimMlmAssocInd; typedef struct sLimMlmReassocReq { diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c index 5744ae9199b4..79cd5ef8841d 100644 --- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c +++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c @@ -414,6 +414,8 @@ uint8_t *mac_trace_get_sme_msg_string(uint16_t sme_msg) CASE_RETURN_STRING(eWNI_SME_DEFAULT_SCAN_IE); CASE_RETURN_STRING(eWNI_SME_ROAM_SCAN_OFFLOAD_REQ); CASE_RETURN_STRING(eWNI_SME_LOST_LINK_INFO_IND); + CASE_RETURN_STRING(eWNI_SME_GET_PEER_INFO_IND); + CASE_RETURN_STRING(eWNI_SME_GET_PEER_INFO_EXT_IND); CASE_RETURN_STRING(eWNI_SME_RSO_CMD_STATUS_IND); CASE_RETURN_STRING(eWNI_SME_MSG_TYPES_END); default: diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index e6cd4932b965..1412220c239f 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -287,6 +287,17 @@ typedef struct sap_StationAssocReassocCompleteEvent_s { uint8_t *assocRespPtr; uint8_t timingMeasCap; tSirSmeChanInfo chan_info; + bool ampdu; + bool sgi_enable; + bool tx_stbc; + bool rx_stbc; + tSirMacHTChannelWidth ch_width; + enum sir_sme_phy_mode mode; + uint8_t max_supp_idx; + uint8_t max_ext_idx; + uint8_t max_mcs_idx; + uint8_t rx_mcs_map; + uint8_t tx_mcs_map; } tSap_StationAssocReassocCompleteEvent; typedef struct sap_StationDisassocCompleteEvent_s { diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index ae850044c3ad..5cfd69c8f60e 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -2451,6 +2451,17 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta; reassoc_complete->status = (eSapStatus) context; reassoc_complete->timingMeasCap = csr_roaminfo->timingMeasCap; + reassoc_complete->ampdu = csr_roaminfo->ampdu; + reassoc_complete->sgi_enable = csr_roaminfo->sgi_enable; + reassoc_complete->tx_stbc = csr_roaminfo->tx_stbc; + reassoc_complete->rx_stbc = csr_roaminfo->rx_stbc; + reassoc_complete->ch_width = csr_roaminfo->ch_width; + reassoc_complete->mode = csr_roaminfo->mode; + reassoc_complete->max_supp_idx = csr_roaminfo->max_supp_idx; + reassoc_complete->max_ext_idx = csr_roaminfo->max_ext_idx; + reassoc_complete->max_mcs_idx = csr_roaminfo->max_mcs_idx; + reassoc_complete->rx_mcs_map = csr_roaminfo->rx_mcs_map; + reassoc_complete->tx_mcs_map = csr_roaminfo->tx_mcs_map; break; case eSAP_STA_DISASSOC_EVENT: diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 14eb6e80e8a3..cec91f0aa2a9 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -1450,6 +1450,17 @@ typedef struct tagCsrRoamInfo { tDot11fIEVHTOperation vht_operation; tDot11fIEHTInfo ht_operation; bool reassoc; + bool ampdu; + bool sgi_enable; + bool tx_stbc; + bool rx_stbc; + tSirMacHTChannelWidth ch_width; + enum sir_sme_phy_mode mode; + uint8_t max_supp_idx; + uint8_t max_ext_idx; + uint8_t max_mcs_idx; + uint8_t rx_mcs_map; + uint8_t tx_mcs_map; } tCsrRoamInfo; typedef struct tagCsrFreqScanInfo { @@ -1477,6 +1488,17 @@ typedef struct sSirSmeAssocIndToUpperLayerCnf { uint8_t timingMeasCap; tSirSmeChanInfo chan_info; uint8_t target_channel; + bool ampdu; + bool sgi_enable; + bool tx_stbc; + tSirMacHTChannelWidth ch_width; + enum sir_sme_phy_mode mode; + bool rx_stbc; + uint8_t max_supp_idx; + uint8_t max_ext_idx; + uint8_t max_mcs_idx; + uint8_t rx_mcs_map; + uint8_t tx_mcs_map; } tSirSmeAssocIndToUpperLayerCnf, *tpSirSmeAssocIndToUpperLayerCnf; typedef struct tagCsrSummaryStatsInfo { diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 44b971586eba..fece2e13c2af 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1627,4 +1627,37 @@ int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev); QDF_STATUS sme_set_bt_activity_info_cb(tHalHandle hal, void (*cb)(void *, uint32_t profile_info)); +/** + * sme_get_peer_info() - sme api to get peer info + * @hal: hal handle for getting global mac struct + * @req: peer info request struct send to wma + * @context: context of callback function + * @callbackfn: hdd callback function when receive response + * + * This function will send WMA_GET_PEER_INFO to WMA + * + * Return: QDF_STATUS_SUCCESS or non-zero on failure + */ +QDF_STATUS sme_get_peer_info(tHalHandle hal, + struct sir_peer_info_req req, + void *context, + void (*callbackfn)(struct sir_peer_info_resp *param, + void *pcontext)); + +/** + * sme_get_peer_info_ext() - sme api to get peer ext info + * @hal: hal handle for getting global mac struct + * @req: peer ext info request struct send to wma + * @context: context of callback function + * @callbackfn: hdd callback function when receive response + * + * This function will send WMA_GET_PEER_INFO_EXT to WMA + * + * Return: QDF_STATUS_SUCCESS or non-zero on failure + */ +QDF_STATUS sme_get_peer_info_ext(tHalHandle hal, + struct sir_peer_info_ext_req *req, + void *context, + void (*callbackfn)(struct sir_peer_info_ext_resp *param, + void *pcontext)); #endif /* #if !defined( __SME_API_H ) */ diff --git a/core/sme/inc/sme_internal.h b/core/sme/inc/sme_internal.h index 86d8af3f8bf9..585ccedf58ce 100644 --- a/core/sme/inc/sme_internal.h +++ b/core/sme/inc/sme_internal.h @@ -197,6 +197,14 @@ typedef struct tagSmeStruct { void (*pLinkSpeedIndCb)(tSirLinkSpeedInfo *indParam, void *pDevContext); void *pLinkSpeedCbContext; + /* get peer info callback */ + void (*pget_peer_info_ind_cb)(struct sir_peer_info_resp *param, + void *pcontext); + void *pget_peer_info_cb_context; + /* get extended peer info callback */ + void (*pget_peer_info_ext_ind_cb)(struct sir_peer_info_ext_resp *param, + void *pcontext); + void *pget_peer_info_ext_cb_context; #ifdef FEATURE_WLAN_EXTSCAN void (*pExtScanIndCb)(void *, const uint16_t, void *); #endif /* FEATURE_WLAN_EXTSCAN */ diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 12bd31a6be14..617e8a695350 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -2413,6 +2413,18 @@ QDF_STATUS sme_process_msg(tHalHandle hHal, struct scheduler_msg *pMsg) } break; #endif + case eWNI_SME_GET_PEER_INFO_IND: + if (pMac->sme.pget_peer_info_ind_cb) + pMac->sme.pget_peer_info_ind_cb(pMsg->bodyptr, + pMac->sme.pget_peer_info_cb_context); + qdf_mem_free(pMsg->bodyptr); + break; + case eWNI_SME_GET_PEER_INFO_EXT_IND: + if (pMac->sme.pget_peer_info_ext_ind_cb) + pMac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr, + pMac->sme.pget_peer_info_ext_cb_context); + qdf_mem_free(pMsg->bodyptr); + break; case eWNI_SME_CSA_OFFLOAD_EVENT: if (pMsg->bodyptr) { csr_scan_flush_bss_entry(pMac, pMsg->bodyptr); @@ -9686,6 +9698,100 @@ QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq, return status; } +QDF_STATUS sme_get_peer_info(tHalHandle hal, struct sir_peer_info_req req, + void *context, + void (*callbackfn)(struct sir_peer_info_resp *param, + void *pcontext)) +{ + + QDF_STATUS status; + QDF_STATUS qdf_status; + tpAniSirGlobal mac = PMAC_STRUCT(hal); + struct scheduler_msg message; + + status = sme_acquire_global_lock(&mac->sme); + if (QDF_STATUS_SUCCESS == status) { + if (NULL == callbackfn) { + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, + "%s: Indication Call back is NULL", + __func__); + sme_release_global_lock(&mac->sme); + return QDF_STATUS_E_FAILURE; + } + + mac->sme.pget_peer_info_ind_cb = callbackfn; + mac->sme.pget_peer_info_cb_context = context; + + /* serialize the req through MC thread */ + message.bodyptr = qdf_mem_malloc(sizeof(req)); + if (NULL == message.bodyptr) { + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, + "%s: Memory allocation failed.", __func__); + sme_release_global_lock(&mac->sme); + return QDF_STATUS_E_NOMEM; + } + qdf_mem_copy(message.bodyptr, &req, sizeof(req)); + message.type = WMA_GET_PEER_INFO; + qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, + "%s: Post get peer info msg fail", __func__); + qdf_mem_free(message.bodyptr); + status = QDF_STATUS_E_FAILURE; + } + sme_release_global_lock(&mac->sme); + } + return status; +} + +QDF_STATUS sme_get_peer_info_ext(tHalHandle hal, + struct sir_peer_info_ext_req *req, + void *context, + void (*callbackfn)(struct sir_peer_info_ext_resp *param, + void *pcontext)) +{ + QDF_STATUS status; + QDF_STATUS qdf_status; + tpAniSirGlobal mac = PMAC_STRUCT(hal); + struct scheduler_msg message; + + status = sme_acquire_global_lock(&mac->sme); + if (QDF_STATUS_SUCCESS == status) { + if (NULL == callbackfn) { + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, + "%s: Indication Call back is NULL", + __func__); + sme_release_global_lock(&mac->sme); + return QDF_STATUS_E_FAILURE; + } + + mac->sme.pget_peer_info_ext_ind_cb = callbackfn; + mac->sme.pget_peer_info_ext_cb_context = context; + + /* serialize the req through MC thread */ + message.bodyptr = + qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req)); + if (NULL == message.bodyptr) { + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, + "%s: Memory allocation failed.", __func__); + sme_release_global_lock(&mac->sme); + return QDF_STATUS_E_NOMEM; + } + qdf_mem_copy(message.bodyptr, + req, + sizeof(struct sir_peer_info_ext_req)); + message.type = WMA_GET_PEER_INFO_EXT; + qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, + "%s: Post get rssi msg fail", __func__); + qdf_mem_free(message.bodyptr); + status = QDF_STATUS_E_FAILURE; + } + sme_release_global_lock(&mac->sme); + } + return status; +} /* * SME API to enable/disable WLAN driver initiated SSR diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 34e6256b8413..8820dc6342fb 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -9852,6 +9852,17 @@ void csr_roam_joined_state_msg_processor(tpAniSirGlobal pMac, void *pMsgBuf) qdf_mem_copy(&pRoamInfo->chan_info, &pUpperLayerAssocCnf->chan_info, sizeof(tSirSmeChanInfo)); + pRoamInfo->ampdu = pUpperLayerAssocCnf->ampdu; + pRoamInfo->sgi_enable = pUpperLayerAssocCnf->sgi_enable; + pRoamInfo->tx_stbc = pUpperLayerAssocCnf->tx_stbc; + pRoamInfo->tx_stbc = pUpperLayerAssocCnf->rx_stbc; + pRoamInfo->ch_width = pUpperLayerAssocCnf->ch_width; + pRoamInfo->mode = pUpperLayerAssocCnf->mode; + pRoamInfo->max_supp_idx = pUpperLayerAssocCnf->max_supp_idx; + pRoamInfo->max_ext_idx = pUpperLayerAssocCnf->max_ext_idx; + pRoamInfo->max_mcs_idx = pUpperLayerAssocCnf->max_mcs_idx; + pRoamInfo->rx_mcs_map = pUpperLayerAssocCnf->rx_mcs_map; + pRoamInfo->tx_mcs_map = pUpperLayerAssocCnf->tx_mcs_map; if (CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile)) { pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED; @@ -15171,54 +15182,90 @@ QDF_STATUS csr_send_assoc_ind_to_upper_layer_cnf_msg(tpAniSirGlobal pMac, else statusCode = eSIR_SME_ASSOC_REFUSED; qdf_mem_copy(pBuf, &statusCode, sizeof(tSirResultCodes)); - pBuf += sizeof(tSirResultCodes); /* bssId */ - qdf_mem_copy((tSirMacAddr *) pBuf, pAssocInd->bssId, - sizeof(tSirMacAddr)); - pBuf += sizeof(tSirMacAddr); + pBuf = (uint8_t *)&pMsg->bssId; + qdf_mem_copy((tSirMacAddr *)pBuf, pAssocInd->bssId, + sizeof(tSirMacAddr)); /* peerMacAddr */ - qdf_mem_copy((tSirMacAddr *) pBuf, pAssocInd->peerMacAddr, - sizeof(tSirMacAddr)); - pBuf += sizeof(tSirMacAddr); + pBuf = (uint8_t *)&pMsg->peerMacAddr; + qdf_mem_copy((tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, + sizeof(tSirMacAddr)); /* StaId */ + pBuf = (uint8_t *)&pMsg->aid; wTmp = pAssocInd->staId; qdf_mem_copy(pBuf, &wTmp, sizeof(uint16_t)); - pBuf += sizeof(uint16_t); /* alternateBssId */ - qdf_mem_copy((tSirMacAddr *) pBuf, pAssocInd->bssId, - sizeof(tSirMacAddr)); - pBuf += sizeof(tSirMacAddr); + pBuf = (uint8_t *)&pMsg->alternateBssId; + qdf_mem_copy((tSirMacAddr *)pBuf, pAssocInd->bssId, + sizeof(tSirMacAddr)); /* alternateChannelId */ + pBuf = (uint8_t *)&pMsg->alternateChannelId; *pBuf = 11; - pBuf += sizeof(uint8_t); - /* Instead of copying roam Info, we just copy only WmmEnabled, - * RsnIE information + /* + * Instead of copying roam Info,just copy WmmEnabled, + * RsnIE information. + * Wmm */ - /* Wmm */ + pBuf = (uint8_t *)&pMsg->wmmEnabledSta; *pBuf = pAssocInd->wmmEnabledSta; - pBuf += sizeof(uint8_t); /* RSN IE */ - qdf_mem_copy((tSirRSNie *) pBuf, &pAssocInd->rsnIE, - sizeof(tSirRSNie)); - pBuf += sizeof(tSirRSNie); + pBuf = (uint8_t *)&pMsg->rsnIE; + qdf_mem_copy((tSirRSNie *)pBuf, &pAssocInd->rsnIE, + sizeof(tSirRSNie)); #ifdef FEATURE_WLAN_WAPI /* WAPI IE */ - qdf_mem_copy((tSirWAPIie *) pBuf, &pAssocInd->wapiIE, - sizeof(tSirWAPIie)); - pBuf += sizeof(tSirWAPIie); + pBuf = (uint8_t *)&pMsg->wapiIE; + qdf_mem_copy((tSirWAPIie *)pBuf, &pAssocInd->wapiIE, + sizeof(tSirWAPIie)); #endif /* Additional IE */ - qdf_mem_copy((void *)pBuf, &pAssocInd->addIE, - sizeof(tSirAddie)); - pBuf += sizeof(tSirAddie); + pBuf = (uint8_t *)&pMsg->addIE; + qdf_mem_copy((tSirAddie *)pBuf, &pAssocInd->addIE, + sizeof(tSirAddie)); /* reassocReq */ + pBuf = (uint8_t *)&pMsg->reassocReq; *pBuf = pAssocInd->reassocReq; - pBuf += sizeof(uint8_t); /* timingMeasCap */ + pBuf = (uint8_t *)&pMsg->timingMeasCap; *pBuf = pAssocInd->timingMeasCap; - pBuf += sizeof(uint8_t); + /* chan_info */ + pBuf = (uint8_t *)&pMsg->chan_info; qdf_mem_copy((void *)pBuf, &pAssocInd->chan_info, - sizeof(tSirSmeChanInfo)); + sizeof(tSirSmeChanInfo)); + /* ampdu */ + pBuf = (uint8_t *)&pMsg->ampdu; + *((bool *)pBuf) = pAssocInd->ampdu; + /* sgi_enable */ + pBuf = (uint8_t *)&pMsg->sgi_enable; + *((bool *)pBuf) = pAssocInd->sgi_enable; + /* tx stbc */ + pBuf = (uint8_t *)&pMsg->tx_stbc; + *((bool *)pBuf) = pAssocInd->tx_stbc; + /* ch_width */ + pBuf = (uint8_t *)&pMsg->ch_width; + *((tSirMacHTChannelWidth *)pBuf) = pAssocInd->ch_width; + /* mode */ + pBuf = (uint8_t *)&pMsg->mode; + *((enum sir_sme_phy_mode *)pBuf) = pAssocInd->mode; + /* rx stbc */ + pBuf = (uint8_t *)&pMsg->rx_stbc; + *((bool *)pBuf) = pAssocInd->rx_stbc; + /* max supported idx */ + pBuf = (uint8_t *)&pMsg->max_supp_idx; + *pBuf = pAssocInd->max_supp_idx; + /* max extended idx */ + pBuf = (uint8_t *)&pMsg->max_ext_idx; + *pBuf = pAssocInd->max_ext_idx; + /* max ht mcs idx */ + pBuf = (uint8_t *)&pMsg->max_mcs_idx; + *pBuf = pAssocInd->max_mcs_idx; + /* vht rx mcs map */ + pBuf = (uint8_t *)&pMsg->rx_mcs_map; + *pBuf = pAssocInd->rx_mcs_map; + /* vht tx mcs map */ + pBuf = (uint8_t *)&pMsg->tx_mcs_map; + *pBuf = pAssocInd->tx_mcs_map; + msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF; msgQ.bodyptr = pMsg; msgQ.bodyval = 0;