diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index c9a063f8c989..dc66a3469f0f 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -1162,6 +1162,91 @@ sap_is_channel_bonding_etsi_weather_channel(struct sap_context *sap_ctx) return false; } +/* + * sap_get_bonding_channels() - get bonding channels from primary channel. + * @sapContext: Handle to SAP context. + * @channel: Channel to get bonded channels. + * @channels: Bonded channel list + * @size: Max bonded channels + * @chanBondState: The channel bonding mode of the passed channel. + * + * Return: Number of sub channels + */ +static uint8_t sap_get_bonding_channels(struct sap_context *sapContext, + uint8_t channel, + uint8_t *channels, uint8_t size, + ePhyChanBondState chanBondState) +{ + tHalHandle hHal = CDS_GET_HAL_CB(); + tpAniSirGlobal pMac; + uint8_t numChannel; + + if (channels == NULL) + return 0; + + if (size < MAX_BONDED_CHANNELS) + return 0; + + if (NULL != hHal) + pMac = PMAC_STRUCT(hHal); + else + return 0; + + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, + FL("cbmode: %d, channel: %d"), chanBondState, channel); + + switch (chanBondState) { + case PHY_SINGLE_CHANNEL_CENTERED: + numChannel = 1; + channels[0] = channel; + break; + case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: + numChannel = 2; + channels[0] = channel - 4; + channels[1] = channel; + break; + case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: + numChannel = 2; + channels[0] = channel; + channels[1] = channel + 4; + break; + case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW: + numChannel = 4; + channels[0] = channel; + channels[1] = channel + 4; + channels[2] = channel + 8; + channels[3] = channel + 12; + break; + case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW: + numChannel = 4; + channels[0] = channel - 4; + channels[1] = channel; + channels[2] = channel + 4; + channels[3] = channel + 8; + break; + case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH: + numChannel = 4; + channels[0] = channel - 8; + channels[1] = channel - 4; + channels[2] = channel; + channels[3] = channel + 4; + break; + case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH: + numChannel = 4; + channels[0] = channel - 12; + channels[1] = channel - 8; + channels[2] = channel - 4; + channels[3] = channel; + break; + default: + numChannel = 1; + channels[0] = channel; + break; + } + + return numChannel; +} + /** * sap_ch_params_to_bonding_channels() - get bonding channels from channel param * @ch_params: channel params ( bw, pri and sec channel info) @@ -1502,8 +1587,14 @@ sap_dfs_is_channel_in_nol_list(struct sap_context *sap_context, } /* get the bonded channels */ - num_channels = sap_ch_params_to_bonding_channels( + if (channel_number == sap_context->channel && chan_bondState >= + PHY_CHANNEL_BONDING_STATE_MAX) + num_channels = sap_ch_params_to_bonding_channels( &sap_context->ch_params, channels); + else + num_channels = sap_get_bonding_channels(sap_context, + channel_number, channels, + MAX_BONDED_CHANNELS, chan_bondState); pdev = mac_ctx->pdev; if (!pdev) { @@ -2978,7 +3069,6 @@ static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx, { uint32_t msg = sap_event->event; QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; - uint32_t cbmode; bool b_leak_chan = false; #ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION uint8_t temp_chan; @@ -2986,20 +3076,12 @@ static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx, #endif if (msg == eSAP_MAC_SCAN_COMPLETE) { - /* get the bonding mode */ - if (sap_ctx->channel <= 14) - cbmode = sme_get_cb_phy_state_from_cb_ini_value( - sme_get_channel_bonding_mode24_g(hal)); - else - cbmode = sme_get_cb_phy_state_from_cb_ini_value( - sme_get_channel_bonding_mode5_g(hal)); - #ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION temp_chan = sap_ctx->channel; p_nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList; sap_mark_leaking_ch(sap_ctx, - cbmode, p_nol, 1, &temp_chan); + sap_ctx->ch_params.ch_width, p_nol, 1, &temp_chan); /* * if selelcted channel has leakage to channels @@ -3012,7 +3094,7 @@ static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx, * has leakage to the channels in NOL */ if (sap_dfs_is_channel_in_nol_list(sap_ctx, sap_ctx->channel, - cbmode) || b_leak_chan) { + PHY_CHANNEL_BONDING_STATE_MAX) || b_leak_chan) { uint8_t ch; /* find a new available channel */