qcacld-3.0: Add check for allowing TDLS 6GHz

Add check for allowing TDLS 6 GHz such as TDLS
is only allowed for channels which supports
VLP Power level.

Change-Id: I32ea3fb61deed2ff236849ef22894d5cb791dd84
CRs-Fixed: 3223617
这个提交包含在:
Utkarsh Bhatnagar
2022-06-01 08:33:06 +05:30
提交者 Madan Koyyalamudi
父节点 e2b4c15a62
当前提交 77afc58054

查看文件

@@ -32,7 +32,8 @@
#include "wlan_policy_mgr_public_struct.h" #include "wlan_policy_mgr_public_struct.h"
#include "wlan_policy_mgr_api.h" #include "wlan_policy_mgr_api.h"
#include "wlan_scan_ucfg_api.h" #include "wlan_scan_ucfg_api.h"
#include "wlan_tdls_ucfg_api.h"
#include "wlan_cm_roam_api.h"
/* Global tdls soc pvt object /* Global tdls soc pvt object
* this is useful for some functions which does not receive either vdev or psoc * this is useful for some functions which does not receive either vdev or psoc
@@ -843,11 +844,64 @@ QDF_STATUS tdls_update_fw_tdls_state(struct tdls_soc_priv_obj *tdls_soc_obj,
return status; return status;
} }
#ifdef WLAN_FEATURE_11AX
static bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev,
qdf_freq_t freq)
{
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
struct regulatory_channel chan[NUM_CHANNELS] = {0};
bool is_allowed = false;
uint8_t country_code[REG_ALPHA2_LEN + 1];
uint8_t chn_idx, num_chan = 0;
uint8_t band_mask = BIT(REG_BAND_6G);
/* No power check is required for non 6 Ghz channel */
if (!wlan_reg_is_6ghz_chan_freq(freq))
goto error;
if (!pdev)
goto error;
wlan_cm_get_country_code(pdev, wlan_vdev_get_id(vdev), country_code);
if (!wlan_reg_ctry_support_vlp(country_code))
goto error;
num_chan = wlan_reg_get_band_channel_list_for_pwrmode(pdev,
band_mask,
chan,
REG_CLI_DEF_VLP);
tdls_debug("Country IE:%c%c freq %d num_chan %d", country_code[0],
country_code[1], freq, num_chan);
if (!num_chan)
goto error;
for (chn_idx = 0; chn_idx < num_chan; chn_idx++) {
if (chan[chn_idx].center_freq == freq) {
tdls_debug("TDLS 6ghz freq: %d supports VLP power",
chan[chn_idx].center_freq);
is_allowed = true;
break;
}
}
error:
return is_allowed;
}
#else
static bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev,
qdf_freq_t freq)
{
return false;
}
#endif
bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev) bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev)
{ {
struct tdls_vdev_priv_obj *tdls_vdev_obj; struct tdls_vdev_priv_obj *tdls_vdev_obj;
struct tdls_soc_priv_obj *tdls_soc_obj; struct tdls_soc_priv_obj *tdls_soc_obj;
bool state = false; bool state = false;
qdf_freq_t ch_freq;
if (QDF_STATUS_SUCCESS != wlan_objmgr_vdev_try_get_ref(vdev, if (QDF_STATUS_SUCCESS != wlan_objmgr_vdev_try_get_ref(vdev,
WLAN_TDLS_NB_ID)) WLAN_TDLS_NB_ID))
@@ -868,6 +922,11 @@ bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev)
/* print session information */ /* print session information */
wlan_objmgr_vdev_release_ref(vdev, wlan_objmgr_vdev_release_ref(vdev,
WLAN_TDLS_NB_ID); WLAN_TDLS_NB_ID);
ch_freq = wlan_get_operation_chan_freq(vdev);
if (wlan_reg_is_6ghz_chan_freq(ch_freq))
state &= tdls_is_6g_freq_allowed(vdev, ch_freq);
return state; return state;
} }