qcacld-3.0: Check and skip Radar event for SAP

Use the new API wlan_reg_chan_has_dfs_attribute
to check dfs channel or not. The old API may return
CHANNEL_STATE_DISABLE if the dfs chan is added to
NOL.
If SAP is not on dfs channel, skip the Radar event
process.

Change-Id: Ie5c87e6fa416658df64da54c276fb87f23ed7efb
CRs-Fixed: 2324649
This commit is contained in:
Liangwei Dong
2018-09-28 04:16:03 -04:00
committed by nshrivas
parent c0c915d060
commit 3fb0016526
3 changed files with 70 additions and 6 deletions

View File

@@ -777,7 +777,6 @@ wlansap_roam_callback(void *ctx, struct csr_roam_info *csr_roam_info,
tpAniSirGlobal mac_ctx = NULL;
uint8_t intf;
bool sta_sap_scc_on_dfs_chan;
enum channel_state chan_state;
if (QDF_IS_STATUS_ERROR(wlansap_context_get(ctx)))
return QDF_STATUS_E_FAILURE;
@@ -897,12 +896,12 @@ wlansap_roam_callback(void *ctx, struct csr_roam_info *csr_roam_info,
goto EXIT;
}
chan_state = wlan_reg_get_channel_state(
mac_ctx->pdev, sap_ctx->channel);
if (chan_state != CHANNEL_STATE_DFS) {
if (!sap_chan_bond_dfs_sub_chan(
sap_ctx, sap_ctx->channel,
PHY_CHANNEL_BONDING_STATE_MAX)) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
"Ignore Radar event for sap ch %d state %d",
sap_ctx->channel, chan_state);
"Ignore Radar event for sap ch %d",
sap_ctx->channel);
goto EXIT;
}

View File

@@ -741,6 +741,56 @@ sap_dfs_is_channel_in_nol_list(struct sap_context *sap_context,
return false;
}
bool
sap_chan_bond_dfs_sub_chan(struct sap_context *sap_context,
uint8_t channel_number,
ePhyChanBondState bond_state)
{
int i;
tHalHandle h_hal = CDS_GET_HAL_CB();
tpAniSirGlobal mac_ctx;
uint8_t channels[MAX_BONDED_CHANNELS];
uint8_t num_channels;
struct wlan_objmgr_pdev *pdev;
if (!h_hal) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
FL("invalid h_hal"));
return false;
}
mac_ctx = PMAC_STRUCT(h_hal);
pdev = mac_ctx->pdev;
if (!pdev) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
FL("null pdev"));
return false;
}
if (wlan_reg_chan_has_dfs_attribute(pdev, channel_number))
return true;
/* get the bonded channels */
if (channel_number == sap_context->channel && bond_state >=
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, bond_state);
for (i = 0; i < num_channels; i++) {
if (wlan_reg_chan_has_dfs_attribute(pdev, channels[i])) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
FL("sub ch num=%d is dfs in %d"),
channels[i], channel_number);
return true;
}
}
return false;
}
uint8_t sap_select_default_oper_chan(struct sap_acs_cfg *acs_cfg)
{
uint8_t channel;

View File

@@ -510,6 +510,21 @@ uint8_t sap_channel_in_acs_channel_list(uint8_t channel_num,
struct sap_context *sap_ctx,
tSapChSelSpectInfo *spect_info_params);
/**
* sap_chan_bond_dfs_sub_chan - check bonded channel includes dfs sub chan
* @sap_context: Handle to SAP context.
* @channel_number: chan whose bonded chan will be checked
* @bond_state: The channel bonding mode of the passed channel.
*
* This function checks if a given bonded channel includes dfs sub chan.
*
* Return: true if at least one dfs sub chan is bonded, otherwise false
*/
bool
sap_chan_bond_dfs_sub_chan(struct sap_context *sap_context,
uint8_t channel_number,
ePhyChanBondState bond_state);
/**
* sap_acquire_vdev_ref() - Increment reference count for vdev object
* @mac: mac handle