From d60c0b4795463e8714752cfbce0a4497be239975 Mon Sep 17 00:00:00 2001 From: bings Date: Thu, 7 Sep 2017 01:30:29 +0800 Subject: [PATCH] qcacld-3.0: Fix channel selection failure after radar is detected sap_dfs_is_channel_in_nol_list will return true even for the channels which are not in the nol list. When sap_dfs_is_channel_in_nol_list gets bonded channels, it gets the bonded channels of current channel of the sap rather than the input channels, so after radar is detected, the current channel of the sap is in nol list, and sap_dfs_is_channel_in_nol_list returns true for all input channels. sap_dfs_is_channel_in_nol_list should get the bonded channels of input channels. CRs-fixed: 2105496 Change-Id: I7c5fc06c66c004aa5c1a208376d1ab4b88956a6f --- core/sap/src/sap_fsm.c | 106 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 94 insertions(+), 12 deletions(-) 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 */