diff --git a/core/cds/inc/cds_regdomain.h b/core/cds/inc/cds_regdomain.h index 262677f201a1..28a22904024b 100644 --- a/core/cds/inc/cds_regdomain.h +++ b/core/cds/inc/cds_regdomain.h @@ -1094,5 +1094,7 @@ int32_t cds_get_country_from_alpha2(uint8_t *alpha2); void cds_fill_send_ctl_info_to_fw(struct regulatory *reg, uint32_t modesAvail, uint32_t modeSelect); void cds_set_wma_dfs_region(struct regulatory *reg); +void cds_set_ch_params(uint8_t ch, uint32_t phy_mode, + chan_params_t *ch_params); #endif /* REGULATORY_H */ diff --git a/core/cds/src/cds_reg_service.c b/core/cds/src/cds_reg_service.c index 016d5860b1bd..0e0b10ee5c4c 100644 --- a/core/cds/src/cds_reg_service.c +++ b/core/cds/src/cds_reg_service.c @@ -1458,3 +1458,27 @@ CDF_STATUS cds_set_reg_domain(void *client_ctxt, v_REGDOMAIN_t reg_domain) return CDF_STATUS_SUCCESS; } + +/** + * cds_set_ch_params() - set channel parameters + * @ch: channel + * @phy_mode: physical mode + * @ch_param: channel parameters will be returned + * + * Return: None + */ +void cds_set_ch_params(uint8_t ch, uint32_t phy_mode, + chan_params_t *ch_params) +{ + tHalHandle *hal_ctx = cds_get_context(CDF_MODULE_ID_PE); + if (!hal_ctx) { + CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR, + ("Invalid hal_ctx pointer")); + return; + } + /* + * TODO: remove SME call and move the SME set channel + * param functionality to CDS. + */ + sme_set_ch_params(hal_ctx, phy_mode, ch, 0, ch_params); +} diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index bd2853f875ff..cdc23d7dd2eb 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -287,6 +287,36 @@ struct rrm_config_param { uint8_t max_randn_interval; uint8_t rm_capability[RMENABLEDCAP_MAX_LEN]; }; +/** + * typedef ch_width - channel width + * @CH_WIDTH_20MHZ: channel width 20 MHz + * @CH_WIDTH_40MHZ: channel width 40 MHz + * @CH_WIDTH_80MHZ: channel width 80MHz + * @CH_WIDTH_160MHZ: channel width 160 MHz + * @CH_WIDTH_80P80MHZ: channel width 160MHz(80+80) + */ +typedef enum ch_width { + CH_WIDTH_20MHZ = 0, + CH_WIDTH_40MHZ = 1, + CH_WIDTH_80MHZ = 2, + CH_WIDTH_160MHZ = 3, + CH_WIDTH_80P80MHZ = 4 +} phy_ch_width; + +/** + * struct ch_params_s + * + * @ch_width: channel width + * @sec_ch_offset: secondary channel offset + * @center_freq_seg0: center freq for segment 0 + * @center_freq_seg1: center freq for segment 1 + */ +typedef struct ch_params_s { + enum ch_width ch_width; + uint8_t sec_ch_offset; + uint8_t center_freq_seg0; + uint8_t center_freq_seg1; +} chan_params_t; /* each station added has a rate mode which specifies the sta attributes */ typedef enum eStaRateMode { @@ -3790,8 +3820,8 @@ typedef struct sSirChanChangeRequest { uint16_t messageType; uint16_t messageLen; uint8_t targetChannel; - uint8_t cbMode; - uint8_t channel_width; + uint8_t sec_ch_offset; + phy_ch_width ch_width; uint8_t center_freq_seg_0; uint8_t center_freq_seg_1; uint8_t bssid[CDF_MAC_ADDR_SIZE]; @@ -3872,7 +3902,7 @@ typedef struct sSirDfsCsaIeRequest { uint8_t targetChannel; uint8_t csaIeRequired; uint8_t bssid[CDF_MAC_ADDR_SIZE]; - uint8_t ch_bandwidth; + struct ch_params_s ch_params; } tSirDfsCsaIeRequest, *tpSirDfsCsaIeRequest; /* Indication from lower layer indicating the completion of first beacon send diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index 64d4d624ecc1..6a4a485a195e 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -71,7 +71,7 @@ typedef enum { PHY_CHANNEL_BONDING_STATE_MAX = 11 } ePhyChanBondState; -#define MAX_BONDED_CHANNELS 4 +#define MAX_BONDED_CHANNELS 8 typedef enum { MCC = 0, diff --git a/core/mac/src/pe/include/lim_global.h b/core/mac/src/pe/include/lim_global.h index 07bd3bcc9224..a7747a1e67f6 100644 --- a/core/mac/src/pe/include/lim_global.h +++ b/core/mac/src/pe/include/lim_global.h @@ -512,6 +512,7 @@ typedef struct sLimChannelSwitchInfo { uint8_t primaryChannel; uint8_t ch_center_freq_seg0; uint8_t ch_center_freq_seg1; + uint8_t sec_ch_offset; phy_ch_width ch_width; int8_t switchCount; uint32_t switchTimeoutValue; diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index da1d9b60001c..9544e1aea5e1 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -498,60 +498,6 @@ static bool __lim_process_sme_sys_ready_ind(tpAniSirGlobal pMac, uint32_t *pMsgB return false; } -#ifdef WLAN_FEATURE_11AC - -uint32_t lim_get_center_channel(tpAniSirGlobal pMac, uint8_t primarychanNum, - ePhyChanBondState secondaryChanOffset, - uint8_t chanWidth) -{ - if (chanWidth == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ) { - switch (secondaryChanOffset) { - case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED: - return primarychanNum; - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED: - return primarychanNum + 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED: - return primarychanNum - 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW: - return primarychanNum + 6; - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW: - return primarychanNum + 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH: - return primarychanNum - 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH: - return primarychanNum - 6; - default: - return eSIR_CFG_INVALID_ID; - } - } else if (chanWidth == WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ) { - switch (secondaryChanOffset) { - case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: - return primarychanNum + 2; - case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: - return primarychanNum - 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED: - return primarychanNum; - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED: - return primarychanNum + 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED: - return primarychanNum - 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW: - return primarychanNum + 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW: - return primarychanNum - 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH: - return primarychanNum + 2; - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH: - return primarychanNum - 2; - default: - return eSIR_CFG_INVALID_ID; - } - } - return primarychanNum; -} - -#endif - /** *lim_configure_ap_start_bss_session() - Configure the AP Start BSS in session. *@mac_ctx: Pointer to Global MAC structure @@ -5136,17 +5082,17 @@ static void lim_process_sme_channel_change_request(tpAniSirGlobal mac_ctx, "switch old chnl %d to new chnl %d, ch_bw %d"), session_entry->currentOperChannel, ch_change_req->targetChannel, - ch_change_req->channel_width); + ch_change_req->ch_width); /* Store the New Channel Params in session_entry */ - session_entry->ch_width = ch_change_req->channel_width; + session_entry->ch_width = ch_change_req->ch_width; session_entry->ch_center_freq_seg0 = ch_change_req->center_freq_seg_0; session_entry->ch_center_freq_seg1 = ch_change_req->center_freq_seg_1; - session_entry->htSecondaryChannelOffset = ch_change_req->cbMode; + session_entry->htSecondaryChannelOffset = ch_change_req->sec_ch_offset; session_entry->htSupportedChannelWidthSet = - (ch_change_req->channel_width ? 1 : 0); + (ch_change_req->ch_width ? 1 : 0); session_entry->htRecommendedTxWidthSet = session_entry->htSupportedChannelWidthSet; session_entry->currentOperChannel = @@ -5548,7 +5494,6 @@ static void lim_process_sme_dfs_csa_ie_request(tpAniSirGlobal mac_ctx, { tpSirDfsCsaIeRequest dfs_csa_ie_req; tpPESession session_entry = NULL; - uint32_t ch_width = 0; uint8_t session_id; tLimWiderBWChannelSwitchInfo *wider_bw_ch_switch; @@ -5581,7 +5526,7 @@ static void lim_process_sme_dfs_csa_ie_request(tpAniSirGlobal mac_ctx, session_entry->dfsIncludeChanSwIe = true; session_entry->gLimChannelSwitch.switchCount = LIM_MAX_CSA_IE_UPDATES; session_entry->gLimChannelSwitch.ch_width = - dfs_csa_ie_req->ch_bandwidth; + dfs_csa_ie_req->ch_params.ch_width; if (mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch == false) session_entry->gLimChannelSwitch.switchMode = 1; @@ -5592,16 +5537,10 @@ static void lim_process_sme_dfs_csa_ie_request(tpAniSirGlobal mac_ctx, if (true != session_entry->vhtCapability) goto skip_vht; - if (WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ == - session_entry->vhtTxChannelWidthSet) - ch_width = eHT_CHANNEL_WIDTH_80MHZ; - else if (WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ == - session_entry->vhtTxChannelWidthSet) - ch_width = session_entry->htSupportedChannelWidthSet; /* Now encode the Wider Ch BW element depending on the ch width */ wider_bw_ch_switch = &session_entry->gLimWiderBWChannelSwitch; - switch (ch_width) { - case eHT_CHANNEL_WIDTH_20MHZ: + switch (dfs_csa_ie_req->ch_params.ch_width) { + case CH_WIDTH_20MHZ: /* * Wide channel BW sublement in channel wrapper element is not * required in case of 20 Mhz operation. Currently It is set @@ -5611,21 +5550,26 @@ static void lim_process_sme_dfs_csa_ie_request(tpAniSirGlobal mac_ctx, wider_bw_ch_switch->newChanWidth = WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ; break; - case eHT_CHANNEL_WIDTH_40MHZ: - session_entry->dfsIncludeChanWrapperIe = true; + case CH_WIDTH_40MHZ: + session_entry->dfsIncludeChanWrapperIe = false; wider_bw_ch_switch->newChanWidth = WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ; break; - case eHT_CHANNEL_WIDTH_80MHZ: + case CH_WIDTH_80MHZ: session_entry->dfsIncludeChanWrapperIe = true; wider_bw_ch_switch->newChanWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ; break; - case eHT_CHANNEL_WIDTH_160MHZ: + case CH_WIDTH_160MHZ: session_entry->dfsIncludeChanWrapperIe = true; wider_bw_ch_switch->newChanWidth = WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ; break; + case CH_WIDTH_80P80MHZ: + session_entry->dfsIncludeChanWrapperIe = true; + wider_bw_ch_switch->newChanWidth = + WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ; + break; default: session_entry->dfsIncludeChanWrapperIe = false; /* @@ -5637,16 +5581,15 @@ static void lim_process_sme_dfs_csa_ie_request(tpAniSirGlobal mac_ctx, } /* Fetch the center channel based on the channel width */ wider_bw_ch_switch->newCenterChanFreq0 = - lim_get_center_channel(mac_ctx, dfs_csa_ie_req->targetChannel, - session_entry->htSecondaryChannelOffset, - wider_bw_ch_switch->newChanWidth); + dfs_csa_ie_req->ch_params.center_freq_seg0; /* * This is not applicable for 20/40/80 Mhz.Only used when we support * 80+80 Mhz operation. In case of 80+80 Mhz, this parameter indicates * center channel frequency index of 80 Mhz channel of * frequency segment 1. */ - wider_bw_ch_switch->newCenterChanFreq1 = 0; + wider_bw_ch_switch->newCenterChanFreq1 = + dfs_csa_ie_req->ch_params.center_freq_seg1; skip_vht: /* Send CSA IE request from here */ if (sch_set_fixed_beacon_fields(mac_ctx, session_entry) != 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 62f452b6e97a..f99affbba849 100644 --- a/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/core/mac/src/pe/lim/lim_send_management_frames.c @@ -4259,7 +4259,6 @@ lim_send_extended_chan_switch_action_frame(tpAniSirGlobal mac_ctx, return eSIR_SUCCESS; } /* End lim_send_extended_chan_switch_action_frame */ -#ifdef WLAN_FEATURE_11AC tSirRetStatus lim_send_vht_opmode_notification_frame(tpAniSirGlobal pMac, tSirMacAddr peer, @@ -4369,140 +4368,6 @@ lim_send_vht_opmode_notification_frame(tpAniSirGlobal pMac, return eSIR_SUCCESS; } -/** - * \brief Send a VHT Channel Switch Announcement - * - * - * \param pMac Pointer to the global MAC datastructure - * - * \param peer MAC address to which this frame will be sent - * - * \param nChanWidth - * - * \param nNewChannel - * - * - * \return eSIR_SUCCESS on success, eSIR_FAILURE else - * - * - */ - -tSirRetStatus -lim_send_vht_channel_switch_mgmt_frame(tpAniSirGlobal pMac, - tSirMacAddr peer, - uint8_t nChanWidth, - uint8_t nNewChannel, - uint8_t ncbMode, tpPESession psessionEntry) -{ - tDot11fChannelSwitch frm; - uint8_t *pFrame; - tpSirMacMgmtHdr pMacHdr; - uint32_t nBytes, nPayload, nStatus; /* , nCfg; */ - void *pPacket; - CDF_STATUS cdf_status; - uint8_t txFlag = 0; - - uint8_t smeSessionId = 0; - - if (psessionEntry == NULL) { - PELOGE(lim_log(pMac, LOGE, FL("Session entry is NULL!!!"));) - return eSIR_FAILURE; - } - smeSessionId = psessionEntry->smeSessionId; - - cdf_mem_set((uint8_t *) &frm, sizeof(frm), 0); - - frm.Category.category = SIR_MAC_ACTION_SPECTRUM_MGMT; - frm.Action.action = SIR_MAC_ACTION_CHANNEL_SWITCH_ID; - frm.ChanSwitchAnn.switchMode = 1; - frm.ChanSwitchAnn.newChannel = nNewChannel; - frm.ChanSwitchAnn.switchCount = 1; - frm.sec_chan_offset_ele.secondaryChannelOffset = - lim_get_htcb_state(ncbMode); - frm.sec_chan_offset_ele.present = 1; - frm.WiderBWChanSwitchAnn.newChanWidth = nChanWidth; - frm.WiderBWChanSwitchAnn.newCenterChanFreq0 = - lim_get_center_channel(pMac, nNewChannel, ncbMode, nChanWidth); - frm.WiderBWChanSwitchAnn.newCenterChanFreq1 = 0; - frm.ChanSwitchAnn.present = 1; - frm.WiderBWChanSwitchAnn.present = 1; - - nStatus = dot11f_get_packed_channel_switch_size(pMac, &frm, &nPayload); - if (DOT11F_FAILED(nStatus)) { - lim_log(pMac, LOGP, FL("Failed to calculate the packed size f" - "or a Channel Switch (0x%08x)."), - nStatus); - /* We'll fall back on the worst case scenario: */ - nPayload = sizeof(tDot11fChannelSwitch); - } else if (DOT11F_WARNED(nStatus)) { - lim_log(pMac, LOGW, FL("There were warnings while calculating " - "the packed size for a Channel Switch (0x" - "%08x)."), nStatus); - } - - nBytes = nPayload + sizeof(tSirMacMgmtHdr); - - cdf_status = - cds_packet_alloc((uint16_t) nBytes, (void **)&pFrame, - (void **)&pPacket); - if (!CDF_IS_STATUS_SUCCESS(cdf_status)) { - lim_log(pMac, LOGP, FL("Failed to allocate %d bytes for a TPC" - " Report."), nBytes); - return eSIR_FAILURE; - } - /* Paranoia: */ - cdf_mem_set(pFrame, nBytes, 0); - - /* Next, we fill out the buffer descriptor: */ - lim_populate_mac_header(pMac, pFrame, SIR_MAC_MGMT_FRAME, - SIR_MAC_MGMT_ACTION, peer, psessionEntry->selfMacAddr); - pMacHdr = (tpSirMacMgmtHdr) pFrame; - cdf_mem_copy((uint8_t *) pMacHdr->bssId, - (uint8_t *) psessionEntry->bssId, sizeof(tSirMacAddr)); - nStatus = dot11f_pack_channel_switch(pMac, &frm, pFrame + - sizeof(tSirMacMgmtHdr), - nPayload, &nPayload); - if (DOT11F_FAILED(nStatus)) { - lim_log(pMac, LOGE, - FL("Failed to pack a Channel Switch (0x%08x)."), - nStatus); - cds_packet_free((void *)pPacket); - return eSIR_FAILURE; /* allocated! */ - } else if (DOT11F_WARNED(nStatus)) { - lim_log(pMac, LOGW, FL("There were warnings while packing a C" - "hannel Switch (0x%08x)."), nStatus); - } - - if ((SIR_BAND_5_GHZ == lim_get_rf_band(psessionEntry->currentOperChannel)) - || (psessionEntry->pePersona == CDF_P2P_CLIENT_MODE) || - (psessionEntry->pePersona == CDF_P2P_GO_MODE) - ) { - txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME; - } - - MTRACE(cdf_trace(CDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT, - psessionEntry->peSessionId, pMacHdr->fc.subType)); - cdf_status = wma_tx_frame(pMac, pPacket, (uint16_t) nBytes, - TXRX_FRM_802_11_MGMT, - ANI_TXDIR_TODS, - 7, lim_tx_complete, pFrame, txFlag, - smeSessionId, 0); - MTRACE(cdf_trace(CDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, - psessionEntry->peSessionId, cdf_status)); - if (!CDF_IS_STATUS_SUCCESS(cdf_status)) { - lim_log(pMac, LOGE, - FL("Failed to send a Channel Switch (%X)!"), - cdf_status); - /* Pkt will be freed up by the callback */ - return eSIR_FAILURE; - } - - return eSIR_SUCCESS; - -} /* End lim_send_vht_channel_switch_mgmt_frame. */ - -#endif - #if defined WLAN_FEATURE_VOWIFI /** diff --git a/core/mac/src/pe/lim/lim_send_messages.h b/core/mac/src/pe/lim/lim_send_messages.h index d884de757253..95161fbab130 100644 --- a/core/mac/src/pe/lim/lim_send_messages.h +++ b/core/mac/src/pe/lim/lim_send_messages.h @@ -49,7 +49,6 @@ tSirRetStatus lim_send_beacon_params(tpAniSirGlobal pMac, tpUpdateBeaconParams pUpdatedBcnParams, tpPESession psessionEntry); /* tSirRetStatus lim_send_beacon_params(tpAniSirGlobal pMac, tpUpdateBeaconParams pUpdatedBcnParams); */ -#ifdef WLAN_FEATURE_11AC tSirRetStatus lim_send_mode_update(tpAniSirGlobal pMac, tUpdateVHTOpMode *tempParam, tpPESession psessionEntry); @@ -57,11 +56,6 @@ tSirRetStatus lim_send_rx_nss_update(tpAniSirGlobal pMac, tUpdateRxNss *tempParam, tpPESession psessionEntry); -uint32_t lim_get_center_channel(tpAniSirGlobal pMac, - uint8_t primarychanNum, - ePhyChanBondState secondaryChanOffset, - uint8_t chanWidth); - tSirRetStatus lim_set_membership(tpAniSirGlobal pMac, tUpdateMembership *pTempParam, tpPESession psessionEntry); @@ -69,7 +63,6 @@ tSirRetStatus lim_set_membership(tpAniSirGlobal pMac, tSirRetStatus lim_set_user_pos(tpAniSirGlobal pMac, tUpdateUserPos *pTempParam, tpPESession psessionEntry); -#endif #if defined WLAN_FEATURE_VOWIFI tSirRetStatus lim_send_switch_chnl_params(tpAniSirGlobal pMac, uint8_t chnlNumber, diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c index ff4848c2dd44..ec9f22e98332 100644 --- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c @@ -2021,9 +2021,10 @@ void lim_handle_csa_offload_msg(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) uint8_t session_id; uint16_t aid = 0; uint16_t chan_space = 0; - int cb_mode = 0; + chan_params_t ch_params; tLimWiderBWChannelSwitchInfo *chnl_switch_info = NULL; + tLimChannelSwitchInfo *lim_ch_switch = NULL; if (!csa_params) { lim_log(mac_ctx, LOGE, FL("limMsgQ body ptr is NULL")); @@ -2055,6 +2056,7 @@ void lim_handle_csa_offload_msg(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) */ lim_delete_tdls_peers(mac_ctx, session_entry); + lim_ch_switch = &session_entry->gLimChannelSwitch; session_entry->gLimChannelSwitch.switchMode = csa_params->switchmode; /* timer already started by firmware, switch immediately */ @@ -2064,7 +2066,8 @@ void lim_handle_csa_offload_msg(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) session_entry->gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; session_entry->gLimChannelSwitch.ch_width = CH_WIDTH_20MHZ; - + lim_ch_switch->sec_ch_offset = + session_entry->htSecondaryChannelOffset; session_entry->gLimChannelSwitch.ch_center_freq_seg0 = 0; session_entry->gLimChannelSwitch.ch_center_freq_seg1 = 0; chnl_switch_info = @@ -2102,20 +2105,17 @@ void lim_handle_csa_offload_msg(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) } else { chnl_switch_info->newChanWidth = CH_WIDTH_20MHZ; - session_entry->gLimChannelSwitch.state = + lim_ch_switch->state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; } - cb_mode = lim_select_cb_mode_for_sta( - session_entry, - csa_params->channel, - chan_space); - + ch_params.ch_width = + chnl_switch_info->newChanWidth; + cds_set_ch_params(csa_params->channel, + eCSR_DOT11_MODE_11ac, + &ch_params); chnl_switch_info->newCenterChanFreq0 = - lim_get_center_channel(mac_ctx, - csa_params->channel, - cb_mode, - chnl_switch_info->newChanWidth); + ch_params.center_freq_seg0; /* * This is not applicable for 20/40/80 MHz. * Only used when we support 80+80 MHz operation. @@ -2123,7 +2123,10 @@ void lim_handle_csa_offload_msg(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) * center channel frequency index of 80 MHz * channel offrequency segment 1. */ - chnl_switch_info->newCenterChanFreq1 = 0; + chnl_switch_info->newCenterChanFreq1 = + ch_params.center_freq_seg1; + lim_ch_switch->sec_ch_offset = + ch_params.sec_ch_offset; } session_entry->gLimChannelSwitch.ch_center_freq_seg0 = @@ -2141,56 +2144,47 @@ void lim_handle_csa_offload_msg(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) mac_ctx->scan.countryCodeCurrent, csa_params->channel, csa_params->new_op_class); - session_entry->gLimChannelSwitch.state = + lim_ch_switch->state = eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; if (chan_space == 40) { - session_entry-> - gLimChannelSwitch.ch_width = + lim_ch_switch->ch_width = CH_WIDTH_40MHZ; chnl_switch_info->newChanWidth = CH_WIDTH_40MHZ; - cb_mode = lim_select_cb_mode_for_sta( - session_entry, - csa_params->channel, - chan_space); - if (cb_mode == - PHY_DOUBLE_CHANNEL_LOW_PRIMARY) { - session_entry-> - gLimChannelSwitch. - ch_center_freq_seg0 = - csa_params->channel + 2; - } else if (cb_mode == - PHY_DOUBLE_CHANNEL_HIGH_PRIMARY) { - session_entry-> - gLimChannelSwitch. - ch_center_freq_seg0 = - csa_params->channel - 2; - } - + ch_params.ch_width = + chnl_switch_info->newChanWidth; + cds_set_ch_params(csa_params->channel, + eCSR_DOT11_MODE_11n, + &ch_params); + lim_ch_switch->ch_center_freq_seg0 = + ch_params.center_freq_seg0; + lim_ch_switch->sec_ch_offset = + ch_params.sec_ch_offset; } else { - session_entry-> - gLimChannelSwitch.ch_width = + lim_ch_switch->ch_width = CH_WIDTH_20MHZ; chnl_switch_info->newChanWidth = CH_WIDTH_40MHZ; - session_entry->gLimChannelSwitch.state = + lim_ch_switch->state = eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; + lim_ch_switch->sec_ch_offset = + PHY_SINGLE_CHANNEL_CENTERED; } - - - } - - if (csa_params->sec_chan_offset) { - session_entry->gLimChannelSwitch.ch_width = - CH_WIDTH_40MHZ; - session_entry->gLimChannelSwitch.state = - eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; } else { - session_entry->htSupportedChannelWidthSet = - WNI_CFG_CHANNEL_BONDING_MODE_DISABLE; - session_entry->htRecommendedTxWidthSet = - session_entry->htSupportedChannelWidthSet; + lim_ch_switch->ch_width = + CH_WIDTH_40MHZ; + lim_ch_switch->state = + eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; + ch_params.ch_width = CH_WIDTH_40MHZ; + cds_set_ch_params(csa_params->channel, + eCSR_DOT11_MODE_11n, + &ch_params); + lim_ch_switch->ch_center_freq_seg0 = + ch_params.center_freq_seg0; + lim_ch_switch->sec_ch_offset = + ch_params.sec_ch_offset; } + } lim_log(mac_ctx, LOG1, FL("new ch width = %d"), session_entry->gLimChannelSwitch.ch_width); diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index 99ff48599312..c4b575058c79 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/core/mac/src/pe/lim/lim_types.h @@ -497,17 +497,9 @@ tSirRetStatus lim_send_extended_chan_switch_action_frame(tpAniSirGlobal mac_ctx, tSirMacAddr peer, uint8_t mode, uint8_t new_op_class, uint8_t new_channel, uint8_t count, tpPESession session_entry); -#ifdef WLAN_FEATURE_11AC tSirRetStatus lim_send_vht_opmode_notification_frame(tpAniSirGlobal pMac, tSirMacAddr peer, uint8_t nMode, tpPESession psessionEntry); -tSirRetStatus lim_send_vht_channel_switch_mgmt_frame(tpAniSirGlobal pMac, - tSirMacAddr peer, - uint8_t nChanWidth, - uint8_t nNewChannel, - uint8_t ncbMode, - tpPESession psessionEntry); -#endif #if defined WLAN_FEATURE_VOWIFI tSirRetStatus lim_send_neighbor_report_request_frame(tpAniSirGlobal, diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 00d416928ff0..0b90d19ad229 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -2810,11 +2810,13 @@ void lim_switch_primary_secondary_channel(tpAniSirGlobal pMac, psessionEntry->currentOperChannel, newChannel); psessionEntry->currentOperChannel = newChannel; } - if (psessionEntry->htSecondaryChannelOffset != subband) { + if (psessionEntry->htSecondaryChannelOffset != + psessionEntry->gLimChannelSwitch.sec_ch_offset) { lim_log(pMac, LOGW, FL("switch old sec chnl %d --> new sec chnl %d "), psessionEntry->htSecondaryChannelOffset, subband); - psessionEntry->htSecondaryChannelOffset = subband; + psessionEntry->htSecondaryChannelOffset = + psessionEntry->gLimChannelSwitch.sec_ch_offset; if (psessionEntry->htSecondaryChannelOffset == PHY_SINGLE_CHANNEL_CENTERED) { psessionEntry->htSupportedChannelWidthSet = diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index 42a5eab8e451..cd9d6a1a1bf3 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -294,59 +294,6 @@ is_entering_mimo_ps(tSirMacHTMIMOPowerSaveState curState, return false; } -/** - * lim_select_cb_mode_for_sta() - return cb_mode based on current session - * @session_entry: Session entry - * @channel: channel - * @chan_bw: channel bandwidth - * - * Given a value of channel and bandwidth this API will return the value of - * cb_mode on basis of channel, bandwidth ht/vht capabilities - * - * Return: cb_mode - * - */ - -static inline int lim_select_cb_mode_for_sta(tpPESession session_entry, - uint8_t channel, uint8_t chan_bw) -{ - if (session_entry->vhtCapability && chan_bw) { - if (channel == 36 || channel == 52 || channel == 100 || - channel == 116 || channel == 149) { - return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW - 1; - } else if (channel == 40 || channel == 56 || channel == 104 || - channel == 120 || channel == 153) { - return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW - 1; - } else if (channel == 44 || channel == 60 || channel == 108 || - channel == 124 || channel == 157) { - return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH - 1; - } else if (channel == 48 || channel == 64 || channel == 112 || - channel == 128 || channel == 161) { - return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH - 1; - } else if (channel == 165) { - return PHY_SINGLE_CHANNEL_CENTERED; - } - } else if (session_entry->htSupportedChannelWidthSet) { - if (channel == 40 || channel == 48 || channel == 56 || - channel == 64 || channel == 104 || channel == 112 || - channel == 120 || channel == 128 || channel == 136 || - channel == 144 || channel == 153 || channel == 161) { - return PHY_DOUBLE_CHANNEL_LOW_PRIMARY; - } else if (channel == 36 || channel == 44 || channel == 52 || - channel == 60 || channel == 100 || - channel == 108 || channel == 116 || - channel == 124 || channel == 132 || - channel == 140 || channel == 149 || - channel == 157) { - return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY; - } else if (channel == 165) { - return PHY_SINGLE_CHANNEL_CENTERED; - } - } - return PHY_SINGLE_CHANNEL_CENTERED; -} - - static inline int lim_select_cb_mode(tDphHashNode *pStaDs, tpPESession psessionEntry, uint8_t channel, uint8_t chan_bw) diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index 40f3b2d3073a..ffe912c33b2b 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -625,10 +625,9 @@ typedef struct sSapDfsInfo { * New channel width and new channel bonding mode * will only be updated via channel fallback mechanism */ - uint8_t orig_cbMode; - uint8_t orig_chanWidth; - uint8_t new_chanWidth; - uint8_t new_cbMode; + phy_ch_width orig_chanWidth; + phy_ch_width new_chanWidth; + chan_params_t new_ch_params; /* * INI param to enable/disable SAP W53 diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index 8335de53ab5f..771fc58cf699 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -878,23 +878,19 @@ static inline void sap_event_init(ptWLAN_SAPEvent sapEvent) #ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION /* - * This function gives the leakage matrix for given NOL channel and cbMode + * sap_find_target_channel_in_channel_matrix() - finds the leakage matrix + * @sapContext: Pointer to vos global context structure + * @ch_width: target channel width + * @NOL_channel: the NOL channel whose leakage matrix is required + * @pTarget_chnl_mtrx: pointer to target channel matrix returned. * - * PARAMETERS - * IN - * sapContext : Pointer to vos global context structure - * cbMode : target channel bonding mode - * NOL_channel : the NOL channel whose leakage matrix is required - * pTarget_chnl_mtrx : pointer to target channel matrix returned. + * This function gives the leakage matrix for given NOL channel and ch_width * - * RETURN VALUE - * BOOLEAN - * TRUE: leakage matrix was found - * FALSE: leakage matrix was not found + * Return: TRUE or FALSE */ bool sap_find_target_channel_in_channel_matrix(ptSapContext sapContext, - ePhyChanBondState cbMode, + phy_ch_width ch_width, uint8_t NOL_channel, tSapTxLeakInfo **pTarget_chnl_mtrx) { @@ -903,28 +899,22 @@ sap_find_target_channel_in_channel_matrix(ptSapContext sapContext, uint32_t nchan_matrix; int i = 0; - switch (cbMode) { - case PHY_SINGLE_CHANNEL_CENTERED: + switch (ch_width) { + case CH_WIDTH_20MHZ: /* HT20 */ pchan_matrix = ht20_chan; nchan_matrix = CDF_ARRAY_SIZE(ht20_chan); break; - case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: - case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: + case CH_WIDTH_40MHZ: /* HT40 */ pchan_matrix = ht40_chan; nchan_matrix = CDF_ARRAY_SIZE(ht40_chan); break; -#ifdef WLAN_FEATURE_11AC - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW: - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW: - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH: - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH: + case CH_WIDTH_80MHZ: /* HT80 */ pchan_matrix = ht80_chan; nchan_matrix = CDF_ARRAY_SIZE(ht80_chan); break; -#endif default: /* handle exception and fall back to HT20 table */ pchan_matrix = ht20_chan; @@ -951,7 +941,7 @@ sap_find_target_channel_in_channel_matrix(ptSapContext sapContext, /** * sap_mark_channels_leaking_into_nol() - to mark channel leaking in to nol * @sap_ctx: pointer to SAP context - * @cb_mode: channel bonding mode + * @ch_width: channel width * @nol: nol info * @temp_ch_lst_sz: the target channel list * @temp_ch_lst: the target channel list @@ -965,7 +955,7 @@ sap_find_target_channel_in_channel_matrix(ptSapContext sapContext, CDF_STATUS sap_mark_channels_leaking_into_nol(ptSapContext sap_ctx, - ePhyChanBondState cb_mode, + phy_ch_width ch_width, tSapDfsNolInfo *nol, uint8_t temp_ch_lst_sz, uint8_t *temp_ch_lst) @@ -990,7 +980,7 @@ sap_mark_channels_leaking_into_nol(ptSapContext sap_ctx, FL("sapdfs: processing NOL channel: %d"), dfs_nol_channel); if (false == sap_find_target_channel_in_channel_matrix( - sap_ctx, cb_mode, dfs_nol_channel, + sap_ctx, ch_width, dfs_nol_channel, &target_chan_matrix)) { /* * should never happen, we should always find a table @@ -1066,9 +1056,9 @@ static void sap_set_bitmap(chan_bonding_bitmap *pBitmap, uint8_t channel) } /** - * sap_populate_available_channels - To populate available channel + * sap_populate_available_channels() - To populate available channel * @bitmap: bitmap to populate - * @current_cbmode: cb mode to check for channel availability + * @ch_width: channel width * @avail_chnl: available channel list to populate * * This function reads the bitmap and populates available channel @@ -1079,20 +1069,16 @@ static void sap_set_bitmap(chan_bonding_bitmap *pBitmap, uint8_t channel) * Return: number of channels found */ static uint8_t sap_populate_available_channels(chan_bonding_bitmap *bitmap, - ePhyChanBondState current_cbmode, + phy_ch_width ch_width, uint8_t *avail_chnl) { uint8_t i = 0; uint8_t chnl_count = 0; uint8_t start_channel = 0; - switch (current_cbmode) { -#ifdef WLAN_FEATURE_11AC - /* HT80 */ - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW: - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW: - case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH: - case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH: + switch (ch_width) { + /* VHT80 */ + case CH_WIDTH_80MHZ: for (i = 0; i < MAX_80MHZ_BANDS; i++) { start_channel = bitmap->chanBondingSet[i].startChannel; if (bitmap->chanBondingSet[i].channelMap == @@ -1104,10 +1090,8 @@ static uint8_t sap_populate_available_channels(chan_bonding_bitmap *bitmap, } } break; -#endif /* HT40 */ - case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: - case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: + case CH_WIDTH_40MHZ: for (i = 0; i < MAX_80MHZ_BANDS; i++) { start_channel = bitmap->chanBondingSet[i].startChannel; if ((bitmap->chanBondingSet[i].channelMap & @@ -1262,8 +1246,7 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) uint8_t channelID; tHalHandle hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx); tpAniSirGlobal pMac; - uint32_t chanWidth; - ePhyChanBondState cbModeCurrent; + phy_ch_width ch_width; uint8_t *tmp_ch_lst = NULL; uint8_t dfs_region; @@ -1280,19 +1263,6 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) return target_channel; } - /* - * Retrieve the original one and store it. - * use the stored original value when you call this function next time - * so fall back mechanism always starts with original ini value. - */ - if (pMac->sap.SapDfsInfo.orig_cbMode == 0) { - pMac->sap.SapDfsInfo.orig_cbMode = - (sapContext->ch_width_orig > CH_WIDTH_20MHZ ? 1 : 0); - cbModeCurrent = pMac->sap.SapDfsInfo.orig_cbMode; - } else { - cbModeCurrent = pMac->sap.SapDfsInfo.orig_cbMode; - } - /* * Retrieve the original one and store it. * use the stored original value when you call this function next time @@ -1301,9 +1271,9 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) if (pMac->sap.SapDfsInfo.orig_chanWidth == 0) { pMac->sap.SapDfsInfo.orig_chanWidth = sapContext->ch_width_orig; - chanWidth = pMac->sap.SapDfsInfo.orig_chanWidth; + ch_width = pMac->sap.SapDfsInfo.orig_chanWidth; } else { - chanWidth = pMac->sap.SapDfsInfo.orig_chanWidth; + ch_width = pMac->sap.SapDfsInfo.orig_chanWidth; } if (sap_get5_g_hz_channel_list(sapContext)) { @@ -1471,7 +1441,7 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) ); if (CDF_STATUS_SUCCESS != sap_mark_channels_leaking_into_nol(sapContext, - cbModeCurrent, + ch_width, nol, valid_chnl_count, tmp_ch_lst)) { @@ -1505,8 +1475,7 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) * for 20MHz, directly create available * channel list */ - if (cbModeCurrent == - PHY_SINGLE_CHANNEL_CENTERED) { + if (ch_width == CH_WIDTH_20MHZ) { CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_DEBUG, FL @@ -1529,18 +1498,17 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) * if 40 MHz or 80 MHz, populate available * channel list from bitmap */ - if (cbModeCurrent != PHY_SINGLE_CHANNEL_CENTERED) { + if (ch_width != CH_WIDTH_20MHZ) { available_ch_cnt = sap_populate_available_channels(&channelBitmap, - cbModeCurrent, + ch_width, availableChannels); /* * if no valid channel bonding found, * fallback to lower bandwidth */ if (available_ch_cnt == 0) { - if (cbModeCurrent >= - PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED) { + if (ch_width == CH_WIDTH_80MHZ) { CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_WARN, FL @@ -1549,22 +1517,12 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) CDF_TRACE_LEVEL_WARN, FL ("sapdfs:Changing chanWidth from [%d] to [%d]"), - chanWidth, + ch_width, CH_WIDTH_40MHZ); - CDF_TRACE(CDF_MODULE_ID_SAP, - CDF_TRACE_LEVEL_WARN, - FL - ("sapdfs:Changing CB mode from [%d] to [%d]"), - cbModeCurrent, - PHY_DOUBLE_CHANNEL_LOW_PRIMARY - ); - cbModeCurrent = - PHY_DOUBLE_CHANNEL_LOW_PRIMARY; - chanWidth = CH_WIDTH_40MHZ; + ch_width = CH_WIDTH_40MHZ; /* continue to start of do loop */ continue; - } else if (cbModeCurrent >= - PHY_DOUBLE_CHANNEL_LOW_PRIMARY) { + } else if (ch_width == CH_WIDTH_40MHZ) { CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_WARN, FL @@ -1573,17 +1531,9 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) CDF_TRACE_LEVEL_WARN, FL ("sapdfs:Changing chanWidth from [%d] to [%d]"), - chanWidth, + ch_width, CH_WIDTH_20MHZ); - CDF_TRACE(CDF_MODULE_ID_SAP, - CDF_TRACE_LEVEL_WARN, - FL - ("sapdfs:Changing CB mode from [%d] to [%d]"), - cbModeCurrent, - PHY_SINGLE_CHANNEL_CENTERED); - cbModeCurrent = - PHY_SINGLE_CHANNEL_CENTERED; - chanWidth = CH_WIDTH_20MHZ; + ch_width = CH_WIDTH_20MHZ; /* continue to start of do loop */ continue; } @@ -1629,12 +1579,7 @@ static uint8_t sap_random_channel_sel(ptSapContext sapContext) target_channel = avail_dfs_chan_list[i]; } - pMac->sap.SapDfsInfo.new_chanWidth = chanWidth; - pMac->sap.SapDfsInfo.new_cbMode = cbModeCurrent; - CDF_TRACE(CDF_MODULE_ID_SAP, - CDF_TRACE_LEVEL_INFO_LOW, - FL("sapdfs: New CB mode = %d"), - pMac->sap.SapDfsInfo.new_cbMode); + pMac->sap.SapDfsInfo.new_chanWidth = ch_width; CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_INFO_LOW, FL("sapdfs: New Channel width = %d"), diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c index 83658309b097..40fcc28bd150 100644 --- a/core/sap/src/sap_module.c +++ b/core/sap/src/sap_module.c @@ -1425,7 +1425,6 @@ static CDF_STATUS wlansap_update_csa_channel_params(ptSapContext sap_context, { void *hal; tpAniSirGlobal mac_ctx; - tSmeConfigParams *sme_config; uint8_t bw; hal = CDS_GET_HAL_CB(sap_context->p_cds_gctx); @@ -1437,23 +1436,12 @@ static CDF_STATUS wlansap_update_csa_channel_params(ptSapContext sap_context, mac_ctx = PMAC_STRUCT(hal); - sme_config = cdf_mem_malloc(sizeof(*sme_config)); - if (!sme_config) { - CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_ERROR, - FL("memory allocation failed for sme_config")); - return CDF_STATUS_E_NOMEM; - } - - sme_get_config_param(mac_ctx, sme_config); if (channel <= RF_CHAN_14) { /* * currently OBSS scan is done in hostapd, so to avoid * SAP coming up in HT40 on channel switch we are * disabling channel bonding in 2.4Ghz. */ - sme_config->csrConfig.channelBondingMode24GHz = - eCSR_INI_SINGLE_CHANNEL_CENTERED; - mac_ctx->sap.SapDfsInfo.new_cbMode = 0; mac_ctx->sap.SapDfsInfo.new_chanWidth = 0; } else { @@ -1475,37 +1463,23 @@ static CDF_STATUS wlansap_update_csa_channel_params(ptSapContext sap_context, continue; if (bw == BW80) { - wlansap_update_bw80_cbmode(channel, sme_config); - mac_ctx->sap.SapDfsInfo.new_cbMode = - sme_config->csrConfig.channelBondingMode5GHz; mac_ctx->sap.SapDfsInfo.new_chanWidth = CH_WIDTH_80MHZ; } else if (bw == BW40_HIGH_PRIMARY) { mac_ctx->sap.SapDfsInfo.new_chanWidth = CH_WIDTH_40MHZ; - sme_config->csrConfig.channelBondingMode5GHz = - mac_ctx->sap.SapDfsInfo.new_cbMode = - eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY; } else if (bw == BW40_LOW_PRIMARY) { mac_ctx->sap.SapDfsInfo.new_chanWidth = CH_WIDTH_40MHZ; - sme_config->csrConfig.channelBondingMode5GHz = - mac_ctx->sap.SapDfsInfo.new_cbMode = - eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY; } else { mac_ctx->sap.SapDfsInfo.new_chanWidth = CH_WIDTH_20MHZ; - sme_config->csrConfig.channelBondingMode5GHz = - mac_ctx->sap.SapDfsInfo.new_cbMode = - eCSR_INI_SINGLE_CHANNEL_CENTERED; } break; } } - sme_update_config(mac_ctx, sme_config); - cdf_mem_free(sme_config); return CDF_STATUS_SUCCESS; } @@ -1599,6 +1573,13 @@ wlansap_set_channel_change_with_csa(void *p_cds_gctx, uint32_t targetChannel) * to sap context. */ pMac->sap.SapDfsInfo.target_channel = targetChannel; + pMac->sap.SapDfsInfo.new_ch_params.ch_width = + pMac->sap.SapDfsInfo.new_chanWidth; + sme_set_ch_params(hHal, + sapContext->csr_roamProfile.phyMode, + targetChannel, + 0, + &pMac->sap.SapDfsInfo.new_ch_params); /* * Set the CSA IE required flag. */ @@ -2307,8 +2288,6 @@ wlansap_channel_change_request(void *pSapCtx, uint8_t target_channel) void *hHal = NULL; tpAniSirGlobal mac_ctx = NULL; eCsrPhyMode phy_mode; - uint32_t cb_mode; - uint32_t vht_channel_width; chan_params_t ch_params; sapContext = (ptSapContext) pSapCtx; @@ -2332,18 +2311,16 @@ wlansap_channel_change_request(void *pSapCtx, uint8_t target_channel) * because we've implemented channel width fallback mechanism for DFS * which will result in channel width changing dynamically. */ - cb_mode = mac_ctx->sap.SapDfsInfo.new_cbMode; - vht_channel_width = mac_ctx->sap.SapDfsInfo.new_chanWidth; - ch_params.ch_width = vht_channel_width; + ch_params.ch_width = mac_ctx->sap.SapDfsInfo.new_chanWidth; sme_set_ch_params(hHal, phy_mode, target_channel, 0, &ch_params); - sapContext->ch_params.ch_width = vht_channel_width; + sapContext->ch_params.ch_width = ch_params.ch_width; /* Update the channel as this will be used to * send event to supplicant */ sapContext->channel = target_channel; - sapContext->csr_roamProfile.ch_params.ch_width = vht_channel_width; + sapContext->csr_roamProfile.ch_params.ch_width = ch_params.ch_width; cdf_ret_status = sme_roam_channel_change_req(hHal, sapContext->bssid, - cb_mode, &sapContext->csr_roamProfile); + &ch_params, &sapContext->csr_roamProfile); if (cdf_ret_status == CDF_STATUS_SUCCESS) { sap_signal_hdd_event(sapContext, NULL, @@ -2446,8 +2423,6 @@ CDF_STATUS wlansap_dfs_send_csa_ie_request(void *pSapCtx) CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE; void *hHal = NULL; tpAniSirGlobal pMac = NULL; - uint32_t cbmode, vht_ch_width; - uint8_t ch_bandwidth; sapContext = (ptSapContext) pSapCtx; if (NULL == sapContext) { @@ -2464,38 +2439,11 @@ CDF_STATUS wlansap_dfs_send_csa_ie_request(void *pSapCtx) } pMac = PMAC_STRUCT(hHal); - /* - * We are getting channel bonding mode from sapDfsInfor structure - * because we've implemented channel width fallback mechanism for DFS - * which will result in channel width changing dynamically. - */ - vht_ch_width = pMac->sap.SapDfsInfo.new_chanWidth; - cbmode = pMac->sap.SapDfsInfo.new_cbMode; - - if (pMac->sap.SapDfsInfo.target_channel <= 14 || - vht_ch_width == eHT_CHANNEL_WIDTH_40MHZ || - vht_ch_width == eHT_CHANNEL_WIDTH_20MHZ) { - switch (cbmode) { - case eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY: - ch_bandwidth = BW40_HIGH_PRIMARY; - break; - case eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY: - ch_bandwidth = BW40_LOW_PRIMARY; - break; - case eCSR_INI_SINGLE_CHANNEL_CENTERED: - default: - ch_bandwidth = BW20; - break; - } - } else { - ch_bandwidth = BW80; - } - cdf_ret_status = sme_roam_csa_ie_request(hHal, sapContext->bssid, pMac->sap.SapDfsInfo.target_channel, pMac->sap.SapDfsInfo.csaIERequired, - ch_bandwidth); + &pMac->sap.SapDfsInfo.new_ch_params); if (cdf_ret_status == CDF_STATUS_SUCCESS) { return CDF_STATUS_SUCCESS; diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 1bb5b5c0b9eb..82d3cfcb4ad1 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -40,21 +40,6 @@ #define CSR_INVALID_SCANRESULT_HANDLE (NULL) -typedef enum { - CH_WIDTH_20MHZ = 0, - CH_WIDTH_40MHZ = 1, - CH_WIDTH_80MHZ = 2, - CH_WIDTH_160MHZ = 3, - CH_WIDTH_80P80MHZ = 4 -} phy_ch_width; - -typedef struct ch_params_s { - phy_ch_width ch_width; - uint8_t sec_ch_offset; - uint8_t center_freq_seg0; - uint8_t center_freq_seg1; -} chan_params_t; - typedef enum { /* never used */ eCSR_AUTH_TYPE_NONE, @@ -145,10 +130,8 @@ typedef enum { eCSR_DOT11_MODE_11g_ONLY = 0x0020, eCSR_DOT11_MODE_11n_ONLY = 0x0040, eCSR_DOT11_MODE_11b_ONLY = 0x0080, -#ifdef WLAN_FEATURE_11AC eCSR_DOT11_MODE_11ac = 0x0100, eCSR_DOT11_MODE_11ac_ONLY = 0x0200, -#endif /* * This is for WIFI test. It is same as eWNIAPI_MAC_PROTOCOL_ALL * except when it starts IBSS in 11B of 2.4GHz diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index 1140a54ed4dd..a7e5d4d6f9b1 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -1333,7 +1333,7 @@ bool csr_roam_is_sta_mode(tpAniSirGlobal pMac, uint32_t sessionId); /* Post Channel Change Indication */ CDF_STATUS csr_roam_channel_change_req(tpAniSirGlobal pMac, - struct cdf_mac_addr bssid, uint8_t cb_mode, + struct cdf_mac_addr bssid, chan_params_t *ch_params, tCsrRoamProfile *profile); /* Post Beacon Tx Start Indication */ @@ -1342,7 +1342,8 @@ CDF_STATUS csr_roam_start_beacon_req(tpAniSirGlobal pMac, CDF_STATUS csr_roam_send_chan_sw_ie_request(tpAniSirGlobal pMac, struct cdf_mac_addr bssid, - uint8_t targetChannel, uint8_t csaIeReqd, uint8_t ch_bandwidth); + uint8_t targetChannel, uint8_t csaIeReqd, + chan_params_t *ch_params); CDF_STATUS csr_roam_modify_add_ies(tpAniSirGlobal pMac, tSirModifyIE *pModifyIE, eUpdateIEsType updateType); diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 9ef7599b29ed..413a80152896 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -786,12 +786,13 @@ CDF_STATUS sme_set_auto_shutdown_cb(tHalHandle hHal, void (*pCallbackfn)(void)); CDF_STATUS sme_set_auto_shutdown_timer(tHalHandle hHal, uint32_t timer_value); #endif CDF_STATUS sme_roam_channel_change_req(tHalHandle hHal, - struct cdf_mac_addr bssid, uint32_t cb_mode, + struct cdf_mac_addr bssid, chan_params_t *ch_params, tCsrRoamProfile *profile); CDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct cdf_mac_addr bssid, uint8_t dfsCacWaitStatus); CDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct cdf_mac_addr bssid, - uint8_t targetChannel, uint8_t csaIeReqd, uint8_t ch_bandwidth); + uint8_t targetChannel, uint8_t csaIeReqd, + chan_params_t *ch_params); CDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam); CDF_STATUS sme_set_thermal_level(tHalHandle hHal, uint8_t level); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index a1d4a534a384..1d45f67c78c8 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -11995,32 +11995,28 @@ CDF_STATUS sme_set_mas(uint32_t val) return CDF_STATUS_SUCCESS; } -/* ------------------------------------------------------------------------- - \fn sme_roam_channel_change_req - \brief API to Indicate Channel change to new target channel - \param hHal - The handle returned by mac_open - \param targetChannel - New Channel to move the SAP to. - \return CDF_STATUS - ---------------------------------------------------------------------------*/ +/** + * sme_roam_channel_change_req() - Channel change to new target channel + * @hHal: handle returned by mac_open + * @bssid: mac address of BSS + * @ch_params: target channel information + * @profile: CSR profile + * + * API to Indicate Channel change to new target channel + * + * Return: CDF_STATUS + */ CDF_STATUS sme_roam_channel_change_req(tHalHandle hHal, - struct cdf_mac_addr bssid, uint32_t cb_mode, tCsrRoamProfile *profile) + struct cdf_mac_addr bssid, chan_params_t *ch_params, + tCsrRoamProfile *profile) { CDF_STATUS status = CDF_STATUS_E_FAILURE; tpAniSirGlobal pMac = PMAC_STRUCT(hHal); - uint8_t ch_mode; - - ch_mode = (profile->ChannelInfo.ChannelList[0] <= - CSR_MAX_2_4_GHZ_SUPPORTED_CHANNELS) ? - pMac->roam.configParam.channelBondingMode24GHz : - pMac->roam.configParam.channelBondingMode5GHz; status = sme_acquire_global_lock(&pMac->sme); if (CDF_IS_STATUS_SUCCESS(status)) { - CDF_TRACE(CDF_MODULE_ID_SME, CDF_TRACE_LEVEL_INFO_MED, - FL("sapdfs: requested cbmode=[%d] & new negotiated cbmode[%d]"), - cb_mode, ch_mode); - status = csr_roam_channel_change_req(pMac, bssid, ch_mode, + status = csr_roam_channel_change_req(pMac, bssid, ch_params, profile); sme_release_global_lock(&pMac->sme); } @@ -12109,25 +12105,26 @@ CDF_STATUS sme_roam_start_beacon_req(tHalHandle hHal, struct cdf_mac_addr bssid, return status; } -/* ------------------------------------------------------------------------- - \fn sme_roam_csa_ie_request - \brief API to request CSA IE transmission from PE - \param hHal - The handle returned by mac_open - \param pDfsCsaReq - CSA IE request - \param bssid - SAP bssid - \param ch_bandwidth - Channel offset - \return CDF_STATUS - ---------------------------------------------------------------------------*/ +/** + * sme_roam_csa_ie_request() - request CSA IE transmission from PE + * @hHal: handle returned by mac_open + * @bssid: SAP bssid + * @targetChannel: target channel information + * @csaIeReqd: CSA IE Request + * @ch_params: channel information + * + * Return: CDF_STATUS + */ CDF_STATUS sme_roam_csa_ie_request(tHalHandle hHal, struct cdf_mac_addr bssid, uint8_t targetChannel, uint8_t csaIeReqd, - uint8_t ch_bandwidth) + chan_params_t *ch_params) { CDF_STATUS status = CDF_STATUS_E_FAILURE; tpAniSirGlobal pMac = PMAC_STRUCT(hHal); status = sme_acquire_global_lock(&pMac->sme); if (CDF_IS_STATUS_SUCCESS(status)) { - status = csr_roam_send_chan_sw_ie_request(pMac, bssid, targetChannel, - csaIeReqd, ch_bandwidth); + status = csr_roam_send_chan_sw_ie_request(pMac, bssid, + targetChannel, csaIeReqd, ch_params); sme_release_global_lock(&pMac->sme); } return status; diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 813c2c7a9036..08f422d9db55 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -17964,14 +17964,21 @@ CDF_STATUS csr_roam_read_tsf(tpAniSirGlobal pMac, uint8_t *pTimestamp, } #endif /*FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */ -/* - * Post Channel Change Request to LIM +/** + * csr_roam_channel_change_req() - Post channel change request to LIM + * @pMac: mac context + * @bssid: SAP bssid + * @ch_params: channel information + * @profile: CSR profile + * * This API is primarily used to post * Channel Change Req for SAP + * + * Return: CDF_STATUS */ -CDF_STATUS -csr_roam_channel_change_req(tpAniSirGlobal pMac, struct cdf_mac_addr bssid, - uint8_t cbMode, tCsrRoamProfile *profile) +CDF_STATUS csr_roam_channel_change_req(tpAniSirGlobal pMac, + struct cdf_mac_addr bssid, + chan_params_t *ch_params, tCsrRoamProfile *profile) { CDF_STATUS status = CDF_STATUS_SUCCESS; tSirChanChangeRequest *pMsg; @@ -17988,12 +17995,12 @@ csr_roam_channel_change_req(tpAniSirGlobal pMac, struct cdf_mac_addr bssid, pMsg->messageType = eWNI_SME_CHANNEL_CHANGE_REQ; pMsg->messageLen = sizeof(tSirChanChangeRequest); pMsg->targetChannel = profile->ChannelInfo.ChannelList[0]; - pMsg->cbMode = cbMode; - pMsg->channel_width = profile->ch_params.ch_width; + pMsg->sec_ch_offset = ch_params->sec_ch_offset; + pMsg->ch_width = profile->ch_params.ch_width; pMsg->dot11mode = csr_translate_to_wni_cfg_dot11_mode(pMac, pMac->roam.configParam.uCfgDot11Mode); - pMsg->center_freq_seg_0 = pMsg->targetChannel; - pMsg->center_freq_seg_1 = 0; + pMsg->center_freq_seg_0 = ch_params->center_freq_seg0; + pMsg->center_freq_seg_1 = ch_params->center_freq_seg1; cdf_mem_copy(pMsg->bssid, bssid.bytes, CDF_MAC_ADDR_SIZE); cdf_mem_copy(&pMsg->operational_rateset, ¶m.operationalRateSet, sizeof(pMsg->operational_rateset)); @@ -18194,7 +18201,7 @@ CDF_STATUS csr_send_ext_change_channel(tpAniSirGlobal mac_ctx, uint32_t channel, * @bssid: BSSID * @target_channel: Channel on which to send the IE * @csa_ie_reqd: Include/Exclude CSA IE. - * @ch_bandwidth: Channel offset + * @ch_params: operating Channel related information * * This function sends request to transmit channel switch announcement * IE to lower layers @@ -18204,7 +18211,7 @@ CDF_STATUS csr_send_ext_change_channel(tpAniSirGlobal mac_ctx, uint32_t channel, CDF_STATUS csr_roam_send_chan_sw_ie_request(tpAniSirGlobal mac_ctx, struct cdf_mac_addr bssid, uint8_t target_channel, - uint8_t csa_ie_reqd, uint8_t ch_bandwidth) + uint8_t csa_ie_reqd, chan_params_t *ch_params) { CDF_STATUS status = CDF_STATUS_SUCCESS; tSirDfsCsaIeRequest *msg; @@ -18221,7 +18228,7 @@ csr_roam_send_chan_sw_ie_request(tpAniSirGlobal mac_ctx, msg->targetChannel = target_channel; msg->csaIeRequired = csa_ie_reqd; cdf_mem_copy(msg->bssid, bssid.bytes, CDF_MAC_ADDR_SIZE); - msg->ch_bandwidth = ch_bandwidth; + cdf_mem_copy(&msg->ch_params, ch_params, sizeof(chan_params_t)); status = cds_send_mb_message_to_mac(msg); diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 8d906c2f51a4..4aac03ff2f7f 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1921,32 +1921,6 @@ end: return txrx_vdev_handle; } -/** - * wma_get_center_channel() - get center channel - * @chan: channel number - * @chan_offset: channel offset - * - * Return: center channel - */ -uint8_t wma_get_center_channel(uint8_t chan, uint8_t chan_offset) -{ - uint8_t band_center_chan = 0; - - if ((chan_offset == PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED) || - (chan_offset == PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW)) - band_center_chan = chan + 2; - else if (chan_offset == PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW) - band_center_chan = chan + 6; - else if ((chan_offset == PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH) || - (chan_offset == - PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED)) - band_center_chan = chan - 2; - else if (chan_offset == PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH) - band_center_chan = chan - 6; - - return band_center_chan; -} - /** * wma_vdev_start() - send vdev start request to fw * @wma: wma handle