uint32_t hmac_zero_dfs_ont_acs_set_channel_handle(mac_vap_stru *mac_vap, uint8_t chan_num, uint8_t bandwidth,
uint32_t switch_mode)
{
hmac_zero_dfs_mode_enum zero_dfs_mode;
mac_channel_stru new_channel = { 0 };
uint32_t ret;
if (OAL_UNLIKELY(mac_vap == NULL)) {
OAM_ERROR_LOG0(0, OAM_SF_ZERO_DFS, "hmac_zero_dfs_ont_acs_set_channel_handle: invalid input param");
return OAL_ERR_CODE_PTR_NULL;
}
zero_dfs_mode = hmac_zero_dfs_get_mode(mac_vap);
if (zero_dfs_mode == ZERO_DFS_CLOSE) {
OAM_M_WARNING_LOG0(mac_vap->uc_chip_id, mac_vap->uc_vap_id, OAM_SF_MLOG,
"hmac_zero_dfs_ont_acs_set_channel_handle: zero dfs is closed");
return OAL_FAIL;
}
memcpy_s(&new_channel, sizeof(mac_channel_stru), &mac_vap->st_channel, sizeof(mac_channel_stru));
new_channel.en_bandwidth = bandwidth;
new_channel.uc_chan_number = chan_num;
ret = mac_get_channel_idx_from_num(mac_vap->st_channel.en_band, chan_num, &new_channel.uc_chan_idx);
if (OAL_UNLIKELY(ret != OAL_SUCC || bandwidth >= WLAN_BAND_WIDTH_BUTT)) {
OAM_M_ERROR_LOG2(mac_vap->uc_chip_id, mac_vap->uc_vap_id, OAM_SF_MLOG,
"hmac_zero_dfs_ont_acs_set_channel_handle: invalid chan_num[%u] or bandwidth[%u]", chan_num, bandwidth);
return OAL_ERR_CODE_INVALID_CONFIG;
}
if (switch_mode == HW_ACS_SWITCH_DONE_PRECAC && zero_dfs_mode == ZERO_DFS_PRE_CAC) {
if (hmac_dfs_need_for_cac(mac_vap, &new_channel) == OAL_TRUE) {
OAM_M_ERROR_LOG1(mac_vap->uc_chip_id, mac_vap->uc_vap_id, OAM_SF_MLOG,
"hmac_zero_dfs_ont_acs_set_channel_handle: unable to switch to radar channel[%u]", chan_num);
return OAL_FAIL;
}
return hmac_zero_dfs_switch_channel(mac_vap, chan_num, bandwidth, CHAN_ZERO_DIRECT);
} else if (switch_mode == HW_ACS_SWITCH_ZERO_CAC && zero_dfs_mode != ZERO_DFS_PRE_CAC) {
if (hmac_zero_dfs_need_cac(mac_vap, &new_channel) == OAL_FALSE) {
OAM_M_WARNING_LOG0(mac_vap->uc_chip_id, mac_vap->uc_vap_id, OAM_SF_MLOG,
"hmac_zero_dfs_ont_acs_set_channel_handle: don't need zero cac");
return OAL_FAIL;
}
hmac_zero_dfs_record_channel(mac_vap, &new_channel, OAL_TRUE);
return hmac_zero_dfs_try_cac(mac_vap, &new_channel, SCAN_FLAG_TARGET, 0);
} else {
OAM_M_WARNING_LOG2(mac_vap->uc_chip_id, mac_vap->uc_vap_id, OAM_SF_MLOG,
"hmac_zero_dfs_ont_acs_set_channel_handle: invalid switch_mode[%u] for zero_dfs_mode[%u]",
switch_mode, zero_dfs_mode);
return OAL_FAIL;
}
}
#endif
oal_bool_enum_uint8 hmac_dfs_need_for_cac(const mac_vap_stru *mac_vap, const mac_channel_stru *channel)
{
hmac_band_stru *hmac_band = NULL;
#ifdef _PRE_WLAN_FEATURE_MULTIAP
uint8_t ret;
#endif
if (OAL_IS_NULL_PTR2(mac_vap, channel)) {
OAM_ERROR_LOG0(0, OAM_SF_DFS, "hmac_dfs_need_for_cac::input param is NULL");
return OAL_ERR_CODE_PTR_NULL;
}
hmac_band = hmac_band_get_by_vap_id(mac_vap->uc_chip_id, mac_vap->uc_vap_id);
if (OAL_IS_NULL_PTR1(hmac_band)) {
OAM_ERROR_LOG0(0, OAM_SF_DFS, "hmac_dfs_need_for_cac::hmac_band is NULL");
return OAL_ERR_CODE_PTR_NULL;
}
/* dfs使能位 */
if (hmac_vap_get_dfs_enable(mac_vap) == OAL_FALSE) {
OAM_WARNING_LOG0(0, OAM_SF_DFS, "hmac_dfs_need_for_cac::dfs not enable");
return OAL_FALSE;
}
/* CAC使能位 */
if (mac_dfs_get_cac_enable(&(hmac_band->st_feature.st_dfs_info)) == OAL_FALSE) {
OAM_WARNING_LOG0(0, OAM_SF_DFS, "hmac_dfs_need_for_cac::cac not enabled");
return OAL_FALSE;
}
/* 定时器使能位 */
if (hmac_band->st_feature.st_dfs.st_dfs_cac_timer.en_is_enabled == OAL_TRUE) {
/* 如果已经开始CAC检测,原则上可以不再重启定时器,此处可以返回false */
OAM_WARNING_LOG0(0, OAM_SF_DFS, "hmac_dfs_need_for_cac::dfs tiemer enabled, need restart");
}
if (channel->en_band != WLAN_BAND_5G) {
OAM_WARNING_LOG0(0, OAM_SF_DFS, "hmac_dfs_need_for_cac::dfs no need on 2G channel");
return OAL_FALSE;
}
#ifdef _PRE_WLAN_FEATURE_6G_EXTEND
if (IS_6G_BAND_VAP(mac_vap) != OAL_FALSE) {
OAM_WARNING_LOG0(0, OAM_SF_DFS, "hmac_dfs_need_for_cac::dfs no need on 6G channel");
return OAL_FALSE;
}
#endif
/* 检查子信道状态 */
if (hmac_dfs_check_channel_need_cac(hmac_band, channel) == OAL_FALSE) {
return OAL_FALSE;
}
#ifdef _PRE_WLAN_FEATURE_MULTIAP
ret = hmac_multiap_check_ctrl_dfs_chn_clear_indication(hmac_band, channel->uc_chan_idx, channel->en_bandwidth);
if (ret == OAL_TRUE) {
return OAL_FALSE;
}
#endif
return OAL_TRUE;
}
oal_bool_enum_uint8 hmac_zero_dfs_need_cac(const mac_vap_stru *mac_vap, const mac_channel_stru *channel)
{
const hmac_band_stru *hmac_band = NULL;
mac_channel_stru radar_channel = { 0 };
if (OAL_IS_NULL_PTR2(mac_vap, channel)) {
OAM_ERROR_LOG0(0, OAM_SF_ZERO_DFS, "hmac_zero_dfs_need_cac::input param is NULL");
return OAL_FALSE;
}
hmac_band = hmac_band_get_by_vap_id(mac_vap->uc_chip_id, mac_vap->uc_vap_id);
if ((OAL_IS_NULL_PTR1(hmac_band))) {
OAM_ERROR_LOG0(mac_vap->uc_vap_id, OAM_SF_ZERO_DFS, "hmac_zero_dfs_need_cac::hmac_band is NULL");
return OAL_FALSE;
}
/* 检查zero dfs特性是否使能 */
if (hmac_zero_dfs_get_mode(mac_vap) == ZERO_DFS_CLOSE) {
OAM_WARNING_LOG0(mac_vap->uc_vap_id, OAM_SF_ZERO_DFS, "hmac_zero_dfs_need_cac: zero dfs is closed");
return OAL_FALSE;
}
/* 检查带宽内子信道是否需要做cac */
if (hmac_dfs_check_channel_need_cac(hmac_band, channel) == OAL_FALSE) {
return OAL_FALSE;
}
hmac_zero_dfs_get_radar_covered_channel(channel, hmac_band, &radar_channel);
if (radar_channel.en_bandwidth > get_wlan_zero_dfs_max_phy_bw(mac_vap->chip_type)) {
OAM_WARNING_LOG0(mac_vap->uc_vap_id, OAM_SF_ZERO_DFS, "hmac_zero_dfs_need_cac::don't support over max bw cac");
return OAL_FALSE;
}
return OAL_TRUE;
}
typedef enum {
HW_ACS_SWITCH_NO_PRECAC, /* 未检测preCAC,选择雷达信道需要静默CAC */
HW_ACS_SWITCH_DONE_PRECAC, /* 检测过preCAC,无论是否为雷达信道,直接切换 */
HW_ACS_SWITCH_ZERO_CAC, /* 未检测preCAC,选择雷达信道需要先做preCAC,未检测到雷达再切换信道 */
HW_ACS_SWITCH_BUTT
} hw_acs_switch_mode;
#ifdef _PRE_WLAN_FEATURE_ZERO_DFS
typedef enum {
ZERO_DFS_CLOSE, /* 特性关闭 */
ZERO_DFS_INIT_MUTE, /* 上电静默 */
ZERO_DFS_INIT_WORK, /* 上电工作 */
ZERO_DFS_PRE_CAC, /* preCAC直切 */
ZERO_DFS_MODE_BUTT
} hmac_zero_dfs_mode_enum;
根据上面代码解释工作流程
最新发布