mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 13:44:26 -04:00
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
This commit is contained in:
parent
5651117a90
commit
d60c0b4795
1 changed files with 94 additions and 12 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in a new issue