/*
* 版权所有 (c) 华为技术有限公司 2023
* 作 者: 胡峰 00330724
* 生成日期: 2023/04/06
* 功能描述: ACS ZERO CAC扫描处理功能
*/
#include "acs_zero_cac.h"
#include "hw_wifi_common.h"
#include "acs_api.h"
#include "acs_precac.h"
#include "acs_radar.h"
#include "acs_select.h"
#include "acs_debug.h"
#include "acs_message.h"
#define ACS_BAND1_START_CHN 36
#define ACS_BAND1_END_CHN 48
#define ACS_BAND2_START_CHN 52
#define ACS_BAND2_END_CHN 64
#define ACS_BAND3_START_CHN 100
#define ACS_BAND3_MIDDLE_CHN 116
#define ACS_BAND3_END_CHN 128
#define ACS_BAND4_START_CHN 149
#define ACS_BAND4_END_CHN 161
#define ACS_INVALID_CAC_STATE "INVALID_STATE"
#define ACS_INVALID_CAC_SCAN "INVALID_SCAN"
/* ACS有1分钟周期老化定时器,为了满足最小1分钟等待,因此ACS ZERO CAC老化额外等待1分钟 */
#define ACS_AGE_MINUTE_TIME_DELTA 1
/* 等待CAC START出现的最长时间,单位分钟 */
#define ACS_WAIT_CAC_START_TIME (1 + ACS_AGE_MINUTE_TIME_DELTA)
/* 按CE认证标准等待非天气雷达信道,CAC TIMEOUT出现的最长时间,单位分钟 */
#define ACS_WAIT_NON_WEATHER_CAC_TIME (1 + ACS_AGE_MINUTE_TIME_DELTA)
/* 按CE认证标准等待天气雷达信道,CAC TIMEOUT出现的最长时间,单位分钟 */
#define ACS_WAIT_WEATHER_CAC_TIME (10 + ACS_AGE_MINUTE_TIME_DELTA)
typedef enum {
ACS_STOP_CAC, /* 停止ZERO ACS扫描 */
ACS_SET_FIRST_80M, /* 配置BAND3第一段80M频宽扫描 */
ACS_START_FIRST_80M, /* 开始BAND3第一段80M频宽扫描 */
ACS_END_FIRST_80M, /* 结束BAND3第一段80M频宽扫描 */
ACS_SET_SECOND_80M, /* 配置BAND2第二段80M频宽扫描 */
ACS_START_SECOND_80M, /* 开始BAND2第二段80M频宽扫描 */
ACS_END_SECOND_80M, /* 结束BAND2第二段80M频宽扫描 */
ACS_ZERO_CAC_STATE_BUTT
} AcsZeroCacStateType;
typedef enum {
ACS_DFS_TO_BAND3,
ACS_NOP_TO_BAND3,
ACS_ZERO_CAC_SCAN_STOP,
ACS_ZERO_CAC_TYPE_BUTT
} AcsZeroCacScanType;
typedef struct {
AcsZeroCacStateType cacStateType;
const char *stateName;
} AcsZeroStateNameMap;
typedef struct {
AcsZeroCacScanType cacScanType;
const char *scanName;
} AcsZeroScanNameMap;
typedef struct {
CAC_START_STOP_FLAG cacFlag;
AcsZeroCacStateType preState;
uint32_t preChannel;
} AcsZeroCacCondition;
typedef struct {
AcsZeroCacStateType nowState;
uint32_t waitNextTime;
AcsPreCACSwitch cacMode;
AcsZeroCacStateType nextState;
} AcsZeroCacAction;
typedef struct {
AcsZeroCacCondition cacCondition;
AcsZeroCacAction cacAction;
} AcsZeroCacStateMap;
typedef struct {
AcsZeroCacScanType acsZeroScanType; /* 分段ZERO CAC扫描类型 */
AcsZeroCacStateType acsZeroState; /* 分段ZERO CAC扫描状态 */
uint32_t targetChannel; /* 分段ZERO CAC最终生效工作信道 */
uint32_t ageTimeMinute; /* 分段ZERO CAC老化保护倒计时,单位分钟 */
} AcsMultiZeroCacInfo;
typedef struct {
bool isZeroWaitEnable; /* 是否支持zero wait */
bool isDfsToBand3Enable; /* 是否支持160M频宽雷达信道ZERO CAC,主要指BAND3频宽范围 */
bool isWeatherChnEnable; /* 是否存在天气雷达信道 */
bool isExistBand1; /* 是否存在band1信道 */
} AcsZeroCacSwitchInfo;
/* ACS ZERO CAC功能开关状态 */
static AcsZeroCacSwitchInfo g_acsZeroCacSwitch = {0};
/* ACS ZERO CAC扫描数据 */
static AcsMultiZeroCacInfo g_acsMultiZeroCacData = {
.acsZeroScanType = ACS_ZERO_CAC_SCAN_STOP,
.acsZeroState = ACS_STOP_CAC,
.targetChannel = 0,
.ageTimeMinute = 0
};
/* ACS ZERO CAC状态对应的名称 */
static AcsZeroStateNameMap g_acsStateNameList[] = {
{ ACS_STOP_CAC, "STOP_CAC" },
{ ACS_SET_FIRST_80M, "SET_FIRST_80M" },
{ ACS_START_FIRST_80M, "START_FIRST_80M" },
{ ACS_END_FIRST_80M, "END_FIRST_80M" },
{ ACS_SET_SECOND_80M, "SET_SECOND_80M" },
{ ACS_START_SECOND_80M, "START_SECOND_80M" },
{ ACS_END_SECOND_80M, "END_SECOND_80M" }
};
/* ACS分段ZERO CAC类型对应的名称 */
static AcsZeroScanNameMap g_acsScanNameList[] = {
{ ACS_DFS_TO_BAND3, "DFS to band3" },
{ ACS_NOP_TO_BAND3, "NOP to band3" },
{ ACS_ZERO_CAC_SCAN_STOP, "ZERO CAC SCAN STOP" }
};
/*
海思芯片不支持160M频宽 ZERO CAC扫描,因此,需要分2段扫描,支持两种组合
第一段116@80M,第二段100@80M
第一段100@80M,第二段116@80M
注意ZERO CAC上报的是80M频宽里面的第1个信道,和下发指定的信道无关
*/
static AcsZeroCacStateMap g_acsZeroCacMap[] = {
/*
36@160雷达避让期间可选跳转,先扫描116@80-->工作在116@80,扫描100@80,最终生效100@160
NOP回固定信道[100,112],先扫描116@80-->工作在116@80,扫描100@80,最终按实际信道生效[100,112]@160
*/
{
/* 开始第一段80M频宽ZERO CAC 116@80扫描10分钟 */
{ CAC_ZERO_START, ACS_SET_FIRST_80M, ACS_BAND3_MIDDLE_CHN },
{ ACS_START_FIRST_80M, ACS_WAIT_WEATHER_CAC_TIME, ACS_PRECAC_SWITCH_BUTT, ACS_ZERO_CAC_STATE_BUTT }
},
{
/* 完成第一段80M频宽ZERO CAC 116@80扫描,实际信道还未切换完成 */
{ CAC_ZERO_TIMEOUT, ACS_START_FIRST_80M, ACS_BAND3_MIDDLE_CHN },
{ ACS_END_FIRST_80M, ACS_WAIT_CAC_START_TIME, ACS_ZEROWAIT_CAC_SWITCH, ACS_SET_SECOND_80M }
},
{ /* 开始第二段80M频宽ZERO CAC扫描1分钟 */
{ CAC_ZERO_START, ACS_SET_SECOND_80M, ACS_BAND3_START_CHN },
{ ACS_START_SECOND_80M, ACS_WAIT_NON_WEATHER_CAC_TIME, ACS_PRECAC_SWITCH_BUTT, ACS_ZERO_CAC_STATE_BUTT }
},
{ /* 完成BAND2第二段80M频宽ZERO CAC扫描,将扫描状态切换为STOP */
{ CAC_ZERO_TIMEOUT, ACS_START_SECOND_80M, ACS_BAND3_START_CHN },
{ ACS_STOP_CAC, 0, ACS_PRECAC_SWITCH_BUTT, ACS_ZERO_CAC_STATE_BUTT }
},
/* NOP回固定信道[116,128],先扫描100@80-->工作在100@80,扫描116@80,最终按实际信道生效[116,128] */
{
/* 开始第一段80M频宽ZERO CAC 100@80扫描1分钟 */
{ CAC_ZERO_START, ACS_SET_FIRST_80M, ACS_BAND3_START_CHN },
{ ACS_START_FIRST_80M, ACS_WAIT_NON_WEATHER_CAC_TIME, ACS_PRECAC_SWITCH_BUTT, ACS_ZERO_CAC_STATE_BUTT }
},
{
/* 完成第一段80M频宽ZERO CAC 100@80扫描,实际信道还未切换完成 */
{ CAC_ZERO_TIMEOUT, ACS_START_FIRST_80M, ACS_BAND3_START_CHN },
{ ACS_END_FIRST_80M, ACS_WAIT_CAC_START_TIME, ACS_ZEROWAIT_CAC_SWITCH, ACS_SET_SECOND_80M }
},
{ /* 开始第二段80M频宽ZERO CAC 116@80扫描10分钟 */
{ CAC_ZERO_START, ACS_SET_SECOND_80M, ACS_BAND3_MIDDLE_CHN },
{ ACS_START_SECOND_80M, ACS_WAIT_WEATHER_CAC_TIME, ACS_PRECAC_SWITCH_BUTT, ACS_ZERO_CAC_STATE_BUTT }
},
{ /* 完成BAND2第二段80M频宽ZERO CAC 116@80扫描,将扫描状态切换为STOP */
{ CAC_ZERO_TIMEOUT, ACS_START_SECOND_80M, ACS_BAND3_MIDDLE_CHN },
{ ACS_STOP_CAC, 0, ACS_PRECAC_SWITCH_BUTT, ACS_ZERO_CAC_STATE_BUTT }
},
};
/*
* 功能描述: 设置ZERO CAC扫描类型和状态
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE void ACS_SetZeroCacState(AcsZeroCacStateType state)
{
g_acsMultiZeroCacData.acsZeroState = state;
return;
}
/*
* 功能描述: 获取ZERO CAC扫描状态
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE AcsZeroCacStateType ACS_GetZeroCacState(void)
{
return g_acsMultiZeroCacData.acsZeroState;
}
/*
* 功能描述: 设置ZERO CAC扫描最终生效信道
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE void ACS_SetZeroCacTargetChannel(uint32_t channel)
{
g_acsMultiZeroCacData.targetChannel = channel;
return;
}
/*
* 功能描述: 获取ZERO CAC扫描最终生效信道
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE uint32_t ACS_GetZeroCacTargetChannel(void)
{
return g_acsMultiZeroCacData.targetChannel;
}
/*
* 功能描述: 设置ZERO CAC扫描类型和状态
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE void ACS_SetZeroScanType(AcsZeroCacScanType scanType)
{
g_acsMultiZeroCacData.acsZeroScanType = scanType;
return;
}
/*
* 功能描述: 根据ZERO CAC扫描类型
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE AcsZeroCacScanType ACS_GetZeroScanType(void)
{
return g_acsMultiZeroCacData.acsZeroScanType;
}
/*
* 功能描述: 设置分段ZERO CAC老化时间
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE void ACS_SetMultiZeroCacAgeTime(uint32_t ageTimeMinute)
{
g_acsMultiZeroCacData.ageTimeMinute = ageTimeMinute;
return;
}
/*
* 功能描述: 获取分段ZERO CAC老化时间
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE uint32_t ACS_GetMultiZeroCacAgeTime(void)
{
return g_acsMultiZeroCacData.ageTimeMinute;
}
/*
* 功能描述: 判断分段ZERO CAC老化时间
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE bool ACS_IsZeroCacRun(void)
{
return (ACS_GetZeroCacState() != ACS_STOP_CAC);
}
/*
* 功能描述: 根据ZERO CAC扫描状态枚举获取对应名称
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE const char *ACS_GetZeroCacStateNameByType(AcsZeroCacStateType cacStateType)
{
for (uint32_t i = 0; i < (sizeof(g_acsStateNameList) / sizeof(g_acsStateNameList[0])); i++) {
const AcsZeroStateNameMap *stateName = g_acsStateNameList + i;
if (cacStateType == stateName->cacStateType) {
return stateName->stateName;
}
}
return ACS_INVALID_CAC_STATE;
}
/*
* 功能描述: 设置分段ZERO CAC状态和老化时间
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE void ACS_UpdateZeroCacStateAgeTime(AcsZeroCacStateType state, uint32_t ageTimeMinute)
{
ACS_SetZeroCacState(state);
ACS_SetMultiZeroCacAgeTime(ageTimeMinute);
return;
}
/*
* 功能描述: 外部显示调用启动ACS接口,需要重置分段ZERO CAC状态
* 函数作者: 胡峰 00330724 2023/04/21
*/
PUBLIC void ACS_StopMultiZeroCac(uint32_t chipId)
{
if (!ACS_IsZeroWaitEnable()) {
return;
}
if (chipId == ACS_CHIP_2G) {
return;
}
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
return;
}
/*
* 功能描述: 根据ZERO CAC扫描状态名称
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE const char *ACS_GetCurZeroCacStateName(void)
{
return ACS_GetZeroCacStateNameByType(ACS_GetZeroCacState());
}
/*
* 功能描述: 根据ZERO CAC扫描类型获取名称
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE const char *ACS_GetZeroCacScanNameByType(AcsZeroCacScanType cacScanType)
{
for (uint32_t i = 0; i < (sizeof(g_acsScanNameList) / sizeof(g_acsScanNameList[0])); i++) {
const AcsZeroScanNameMap *scanName = g_acsScanNameList + i;
if (cacScanType == scanName->cacScanType) {
return scanName->scanName;
}
}
return ACS_INVALID_CAC_SCAN;
}
/*
* 功能描述: 获取当前ZERO CAC扫描类型名称
* 函数作者: 胡峰 00330724 2023/04/21
*/
PUBLIC const char *ACS_GetCurZeroCacScanName(void)
{
return ACS_GetZeroCacScanNameByType(ACS_GetZeroScanType());
}
/*
* 功能描述: 根据信道列表判断是否存在目标信道
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE bool ACS_IsExistTargetChn(const acs_scan_list *chnList, uint8_t targetChannel)
{
for (uint32_t i = 0; i < (sizeof(chnList->chn_list) / sizeof(chnList->chn_list[0])); i++) {
uint8_t channel = chnList->chn_list[i];
if (channel == targetChannel) {
return true;
}
/* chnList列表中信道号为0表示结尾,可以提前退出 */
if (channel == 0) {
return false;
}
}
return false;
}
/*
* 功能描述: 根据输入信道列表起始,判断是否存在该信道列表
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE bool ACS_IsExistBandByChannel(const acs_scan_list *chnList, uint32_t startChannel, uint32_t endChannel)
{
return (ACS_IsExistTargetChn(chnList, (uint8_t)startChannel) && ACS_IsExistTargetChn(chnList, (uint8_t)endChannel));
}
/*
* 功能描述: 判断当前是否支持天气雷达信道
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE bool ACS_IsSupportWeatherChannel(void)
{
return g_acsZeroCacSwitch.isWeatherChnEnable;
}
/*
* 功能描述: 判断是否支持zero cac扫描160M频宽范围分段扫描
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE bool ACS_IsDfsToBand3Enable(void)
{
return g_acsZeroCacSwitch.isDfsToBand3Enable;
}
/*
* 功能描述: 判断当前存在band1信道
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE bool ACS_IsExistBand1Channel(void)
{
return g_acsZeroCacSwitch.isExistBand1;
}
/*
* 功能描述: 判断是否支持ZERO CAC分段扫描
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsSupportMultiZeroCac(void)
{
return (ACS_IsZeroWaitEnable() && ACS_IsSupportWeatherChannel());
}
/*
* 功能描述: 判断是否支持跳转band3做DFS避让
* 函数作者: 胡峰 00330724 2023/04/21
*/
PRIVATE bool ACS_IsSupportDfsToBand3(void)
{
return (ACS_IsSupportMultiZeroCac() && ACS_IsDfsToBand3Enable());
}
/*
* 功能描述: 判断是否为band1范围信道
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsBand1Channel(uint32_t channel)
{
return ((channel >= ACS_BAND1_START_CHN) && (channel <= ACS_BAND1_END_CHN));
}
/*
* 功能描述: 判断是否为band2范围信道
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsBand2Channel(uint32_t channel)
{
return ((channel >= ACS_BAND2_START_CHN) && (channel <= ACS_BAND2_END_CHN));
}
/*
* 功能描述: 判断是否为band3范围信道
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsBand3Channel(uint32_t channel)
{
return ((channel >= ACS_BAND3_START_CHN) && (channel <= ACS_BAND3_END_CHN));
}
/*
* 功能描述: 判断是否为band4范围信道
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsBand4Channel(uint32_t channel)
{
return ((channel >= ACS_BAND4_START_CHN) && (channel <= ACS_BAND4_END_CHN));
}
/*
* 功能描述: 判断当前输入CAC条件是否匹配ZERO CAC状态机
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsMatchCacCond(const AcsZeroCacCondition *cacCondition, CAC_START_STOP_FLAG cacFlag,
AcsZeroCacStateType cacState, uint32_t cacChannel)
{
return ((cacCondition->cacFlag == cacFlag) && (cacCondition->preState == cacState) &&
(cacCondition->preChannel == cacChannel));
}
/*
* 功能描述: 记录ZERO CAC状态切换调试日志
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE void ACS_RecordZeroCacLog(CAC_START_STOP_FLAG cacFlag, uint32_t cacChannel, AcsZeroCacScanType curScanType,
AcsZeroCacStateType preCacStat, AcsZeroCacStateType nextCacStat)
{
ACS_WriteAcsDebugLog(ACS_GetRadioData(ACS_CHIP_5G_LOW), "cacFlag=%u,cacChannel=%u,scanType=%s,state=%s->%s\n",
cacFlag, cacChannel, ACS_GetZeroCacScanNameByType(curScanType), ACS_GetZeroCacStateNameByType(preCacStat),
ACS_GetZeroCacStateNameByType(nextCacStat));
return;
}
/*
* 功能描述: 根据ZERO CAC状态机做下一步切换,有最终信道配置,需要下发最终ZERO CAC生效信道
* 函数作者: 胡峰 00330724 2023/05/07
*/
PRIVATE void ACS_SetZeroCacAction(CAC_START_STOP_FLAG cacFlag, uint32_t cacChannel, AcsZeroCacStateType curCacState,
AcsZeroCacScanType curScanType, const AcsZeroCacStateMap *acsCacMap)
{
const AcsZeroCacAction *cacAction = &acsCacMap->cacAction;
ACS_UpdateZeroCacStateAgeTime(cacAction->nowState, cacAction->waitNextTime);
ACS_RecordZeroCacLog(cacFlag, cacChannel, curScanType, curCacState, cacAction->nowState);
/* 不需要下发最终信道直接返回 */
if (cacAction->cacMode == ACS_PRECAC_SWITCH_BUTT) {
return;
}
ACS_UpdateZeroCacStateAgeTime(cacAction->nextState, cacAction->waitNextTime);
/* 最终信道下发时按160M信道频宽生效。会先按80M做ZERO CAC,遇到NOP未结束或检测到雷达退出,完成后展频到160M频宽 */
uint32_t ret = ACS_SetChannelInfoWithMode(ACS_CHIP_5G_LOW, ACS_GetZeroCacTargetChannel(),
ACS_BAND_WIDTH_160M, cacAction->cacMode);
if (ret != HW_RET_SUCCESS) {
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
return;
}
ACS_RecordZeroCacLog(cacFlag, cacChannel, curScanType, cacAction->nowState, cacAction->nextState);
return;
}
/*
* 功能描述: 根据ZERO CAC FLAG和CAC信道,做ZERO CAC状态切换
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE void ACS_FindZeroCacAction(CAC_START_STOP_FLAG cacFlag, uint32_t cacChannel)
{
AcsZeroCacStateType curCacState = ACS_GetZeroCacState();
AcsZeroCacScanType curScanType = ACS_GetZeroScanType();
for (uint32_t i = 0; i < (sizeof(g_acsZeroCacMap) / sizeof(g_acsZeroCacMap[0])); i++) {
const AcsZeroCacStateMap *acsCacMap = (const AcsZeroCacStateMap *)(g_acsZeroCacMap + i);
if (ACS_IsMatchCacCond(&acsCacMap->cacCondition, cacFlag, curCacState, cacChannel)) {
ACS_SetZeroCacAction(cacFlag, cacChannel, curCacState, curScanType, acsCacMap);
return;
}
}
HW_WAP_TRACE(HW_MID_ACS_RADAR, "not exist cacFlag=%u,cacChannel=%u,scanType=%u,state=%s",
cacFlag, cacChannel, curScanType, ACS_GetZeroCacStateNameByType(curCacState));
return;
}
/*
* 功能描述: 检查配置信道频宽无雷达禁用,指定CAC信道和频宽启动ZERO CAC扫描
* 函数作者: 胡峰 00330724 2023/04/17
*/
PRIVATE uint32_t ACS_CheckRadarAndStartZeroCac(uint32_t chipId, uint32_t cacChannel, uint32_t cacWidth,
uint32_t fixedWidth)
{
/* band1范围存在雷达禁用标志,那么不做ZERO CAC 160M频宽处理 */
if (ACS_IfChanOnRadar(chipId, cacChannel, fixedWidth)) {
HW_WAP_TRACE(HW_MID_ACS_RADAR, "cacChannel=%u,fixedWidth=%u is mute", cacChannel, fixedWidth);
return HW_RET_FAIL;
}
uint32_t ret = ACS_SetChannelInfoWithMode(chipId, cacChannel, cacWidth, ACS_ZEROWAIT_CAC_SWITCH);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, chipId, cacChannel, cacWidth, fixedWidth);
}
return ret;
}
/*
* 功能描述: 根据扫描类型启动band3 zero cac分段扫描
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE uint32_t ACS_StartBand3MultiZeroCac(uint32_t chipId, AcsZeroCacScanType scanType, uint32_t cacChannel,
uint32_t fixBandWidth, uint32_t targetChannel)
{
/* 获取acs全局变量信息,无需判断空指针 */
const AcsInfo *acsInfo = ACS_GetRadioData(chipId);
if (ACS_IfChanOnRadar(chipId, cacChannel, fixBandWidth)) {
HW_WAP_TRACE(HW_MID_ACS_RADAR, "cacChannel=%u,fixBandWidth=%u is mute", cacChannel, fixBandWidth);
return HW_RET_FAIL;
}
/* 设置zero cac最终生效工作信道 */
ACS_SetZeroCacTargetChannel(targetChannel);
/* 设置zero cac扫描类型 */
ACS_SetZeroScanType(scanType);
/* 设置第一段80M zero cac扫描状态 */
ACS_UpdateZeroCacStateAgeTime(ACS_SET_FIRST_80M, ACS_WAIT_CAC_START_TIME);
uint32_t ret = ACS_SetChannelInfoWithMode(chipId, cacChannel, ACS_BAND_WIDTH_80M, ACS_ZEROWAIT_CAC_SWITCH);
if (ret != HW_RET_SUCCESS) {
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
LAST_WORD(ret, chipId, cacChannel, fixBandWidth);
return ret;
}
ACS_WriteAcsDebugLog(acsInfo, "scanType=%s,cacChannel=%u,targetChannel=%u,fixBandWidth=%u,state=SET_FIRST_80M\n",
ACS_GetZeroCacScanNameByType(scanType), cacChannel, targetChannel, fixBandWidth);
return HW_RET_SUCCESS;
}
/*
* 功能描述: ZERO天线在ZERO CAC期间检测雷达,需要重置分段ZERO CAC扫描状态
* 函数作者: 胡峰 00330724 2023/04/11
*/
PRIVATE bool ACS_IsNeedJumpTo160mOnRadar(uint8_t fixedBandW)
{
/* 当前用户配置为非160M频宽,那么不需要做DFS跳转160M */
if (fixedBandW != ACS_BAND_WIDTH_160M) {
return false;
}
uint8_t curChannel = 0;
uint8_t curBandwith = 0;
uint32_t ret = ACS_GetCurrentChn(ACS_CHIP_5G_LOW, &curChannel, &curBandwith);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret);
return false;
}
/* 当前生效频宽已经是160M,那么不需要做DFS跳转160M */
if (curBandwith == ACS_BAND_WIDTH_160M) {
return false;
}
return true;
}
/*
* 功能描述: 通过ZERO CAC分段扫描返回到BAND3 160M频宽
* 注意事项: 不受160M ZERO CAC特性开关状态影响,正常返回
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE void ACS_GoBackToBand3Channel160M(uint32_t chipId, const AcsChnBW *acsChnInfo, uint8_t curChannel,
uint8_t curBandwith)
{
/* 100@160M信道,根据用户配置信道在前80M,那么先扫描后80M,然后扫描前80M,否则,扫描顺序反过来 */
uint32_t cacChannel = (acsChnInfo->fixedChn < ACS_BAND3_MIDDLE_CHN) ? ACS_BAND3_MIDDLE_CHN : ACS_BAND3_START_CHN;
uint32_t ret = ACS_StartBand3MultiZeroCac(chipId, ACS_NOP_TO_BAND3, cacChannel,
ACS_BAND_WIDTH_160M, acsChnInfo->fixedChn);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, cacChannel);
}
HW_WAP_TRACE(HW_MID_ACS_RADAR, "NOP back zero cac,ret=%u,current=%hhu/%hhu to fixed=%hhu/%hhu\n",
ret, curChannel, curBandwith, acsChnInfo->fixedChn, acsChnInfo->fixedBandW);
return;
}
/*
* 功能描述: 判断固定信道配置和当前生效信道、频宽是否相等
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsFixChnInfoEqualToCurrent(uint8_t fixedChn, uint8_t fixedBandW, uint8_t curChannel,
uint8_t curBandwith)
{
return ((fixedChn == curChannel) && (fixedBandW == curBandwith));
}
/*
* 功能描述: 判断芯片是否支持做NOP回切BAND3 160M频宽
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE bool ACS_IsNeedMultiZeroCacGoBackBand3(uint8_t fixedChn, uint8_t fixedBandW)
{
return (ACS_IsBand3Channel(fixedChn) && (fixedBandW == ACS_BAND_WIDTH_160M));
}
/*
* 功能描述: NOP结束后返回到原始固定信道和频宽
* 函数作者: 胡峰 00330724 2023/04/19
*/
PRIVATE void ACS_GoBackForFixChannel(const AcsInfo *acsInfo, uint8_t curChannel, uint8_t curBandwith)
{
const AcsChnBW *acsChnInfo = (const AcsChnBW *)&(acsInfo->channel);
/* 已经是配置的固定信道和频宽了,无需切换 */
if (ACS_IsFixChnInfoEqualToCurrent(acsChnInfo->fixedChn, acsChnInfo->fixedBandW, curChannel, curBandwith)) {
HW_WAP_TRACE(HW_MID_ACS_RADAR, "current equal to FixChannel=%u,FixBandwith=%u", curChannel, curBandwith);
return;
}
uint32_t chipId = acsInfo->chipId;
/* band3且为160M频宽,需要做分段zero cac切换回原信道和频宽 */
if (ACS_IsNeedMultiZeroCacGoBackBand3(acsChnInfo->fixedChn, acsChnInfo->fixedBandW)) {
ACS_GoBackToBand3Channel160M(chipId, acsChnInfo, curChannel, curBandwith);
return;
}
/* 非band3或者小于160M频宽,直接做zero cac切换回原信道和频宽 */
uint32_t ret = ACS_CheckRadarAndStartZeroCac(chipId, acsChnInfo->fixedChn, acsChnInfo->fixedBandW,
acsChnInfo->fixedBandW);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret);
return; /* NOP回切失败,直接返回,不记录后面的日志 */
}
/* 固定信道NOP有30分钟以上,理论上不会冲突。但是代码逻辑上,增加ZERO CAC状态重置保护,覆盖正在进行的ZERO CAC操作 */
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
ACS_WriteAcsDebugLog(acsInfo, "NOP back zero cac,current=%hhu/%hhu to fixed=%hhu/%hhu\n",
curChannel, curBandwith, acsChnInfo->fixedChn, acsChnInfo->fixedBandW);
return;
}
/*
* 功能描述: 判断是否为雷达信道
* 函数作者: 胡峰 00330724 2023/04/11
*/
PRIVATE bool ACS_IsRadarChannel(uint32_t channel)
{
return ((channel >= ACS_BAND2_START_CHN) && (channel <= ACS_BAND3_END_CHN));
}
/*
* 功能描述: 检查配置目标信道,如果为bane1信道,需要检查信道列表中是否存在该信道。非band1信道直接认为合法。
* 函数作者: 胡峰 00330724 2023/05/23
*/
PRIVATE bool ACS_IsValidBand1Channel(uint32_t channel)
{
if (!ACS_IsBand1Channel(channel)) {
return true;
}
return ACS_IsExistBand1Channel();
}
/*
* 功能描述: 业务天线检测到BAND3雷达时,跳到BAND1避让到非雷达信道
* 注意事项: 由于新选的信道会覆盖雷达信道造成静默,因此,需要先在ACS模块选择最优信道前,先跳转一次
* 函数作者: 胡峰 00330724 2023/04/11
*/
PRIVATE uint32_t ACS_ProcDfsFromBand3Radar(uint32_t chipId, uint32_t radarChannel)
{
/* 收到band3信道内的雷达事件,将band3 ZERO CAC状态为停止 */
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
const AcsInfo *acsInfo = ACS_GetRadioData(chipId);
/* 优先取bestChn,是为了在后面展频160M尽量保持主信道不变 */
uint32_t bestChn = acsInfo->channel.bestChn;
/* ACS选到最优信道为雷达信道时,这里取band1 36信道 */
if (ACS_IsRadarChannel(bestChn)) {
bestChn = ACS_BAND1_START_CHN;
}
/* 如果配置目标信道在band1,但是预配置信道列表无band1,那么不存在band1 160M频宽范围,那么不做此避让处理 */
if (!ACS_IsValidBand1Channel(bestChn)) {
HW_WAP_TRACE(HW_MID_ACS_RADAR, "radarChannel=%u dfs to acs_bestChn=%u,bestChn=%u fail",
radarChannel, acsInfo->channel.bestChn, bestChn);
return HW_RET_FAIL;
}
/* 在160M频宽配置下,需要立刻避让到bestChn@80M生效 */
uint32_t ret = ACS_SetChannelInfoWithMode(chipId, bestChn, ACS_BAND_WIDTH_80M, ACS_NO_PRECAC_SWITCH);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, chipId, radarChannel);
}
ACS_WriteAcsDebugLog(acsInfo, "band3 radar chn=%u dfs to %u/80M,ret=%u\n", radarChannel, bestChn, ret);
return ret;
}
/*
* 功能描述: 判断是否需要处理BAND2检测到雷达,从而可选DFS跳转BAND3做160M ZERO CAC
* 注意事项: band2检测雷达,实际上报的cac flag channel是band1+band2工作信道范围
* 函数作者: 胡峰 00330724 2023/04/11
*/
PRIVATE bool ACS_IsNeedNeedDealBand2Radar(uint32_t radarChannel)
{
return (ACS_IsSupportDfsToBand3() && (ACS_IsBand1Channel(radarChannel) || ACS_IsBand2Channel(radarChannel)));
}
/*
* 功能描述: 在160M频宽下,根据雷达信道判断ZERO CAC消息类型
* 函数作者: 胡峰 00330724 2023/04/11
*/
PRIVATE AcsZeroCacMsgType ACS_GetAndProcDfsZeroCacMsgType(uint32_t chipId, uint32_t radarChannel)
{
/* 当前band2检测到雷达,如果开启了可选跳转,那么进行分段ZERO CAC,切换到100@160M频宽范围 */
if (ACS_IsNeedNeedDealBand2Radar(radarChannel)) {
return ACS_ZERO_CAC_MULTI_SCAN_MSG;
}
/* band3检测到雷达,先跳转BAND1做DFS避让,然后ACS继续做ZERO CAC切换160M频宽 */
if (ACS_IsBand3Channel(radarChannel)) {
/* 如果没有做band1 DFS避让,比如无band1预配置信道列表,那么走老流程 */
return ((ACS_ProcDfsFromBand3Radar(chipId, radarChannel) == HW_RET_SUCCESS) ?
ACS_ZERO_CAC_SINGLE_SCAN_MSG : ACS_NORMAL_CAC_MSG);
}
/* 其它情况,走老流程 */
return ACS_NORMAL_CAC_MSG;
}
/*
* 功能描述: 根据产生的雷达信道和当前配置的频宽,获取CAC消息类型
* 函数作者: 胡峰 00330724 2023/04/11
*/
PUBLIC AcsZeroCacMsgType ACS_GetZeroCacMsgTypeByRadar(uint32_t chipId, uint32_t radarChannel)
{
/* 未开zero wait走老流程 */
if (!ACS_IsZeroWaitEnable()) {
return ACS_NORMAL_CAC_MSG;
}
const AcsInfo *acsInfo = ACS_GetRadioData(chipId);
const AcsChnBW *acsChnInfo = (const AcsChnBW *)&(acsInfo->channel);
/* 非160M频宽直接做DFS避让,走老流程 */
if (acsChnInfo->fixedBandW != ACS_BAND_WIDTH_160M) {
return ACS_NORMAL_CAC_MSG;
}
/* 判断走哪种类型的zero wait消息,并做DFS避让 */
return ACS_GetAndProcDfsZeroCacMsgType(chipId, radarChannel);
}
/*
* 功能描述: 发送启动ACS分段ZERO CAC扫描消息
* 函数作者: 胡峰 00330724 2023/04/11
*/
PUBLIC void ACS_SendStartMultiZeroCacMsg(uint32_t chipId)
{
/* 发送ACS消息启动分段ZERO CAC扫描 */
uint32_t ret = ACS_SendStateMsg(ACS_MSG_DFS_TO_ZERO_CAC, ACS_NORMAL_CAC_MSG, &chipId, sizeof(chipId));
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, chipId);
}
return;
}
/*
* 功能描述: 响应ACS_MSG_DFS_TO_ZERO_CAC消息,DFS避让到BAND3,启动BAND3分段ZERO CAC扫描
* 函数作者: 胡峰 00330724 2023/04/11
*/
PUBLIC void ACS_StartDfsZeroCacMsg(uint32_t chipId)
{
/* band2检测到雷达,跳转到band3做分段ZERO CAC,第一段从116开始启动cac扫描,最终在100信道扫描和生效 */
uint32_t ret = ACS_StartBand3MultiZeroCac(chipId, ACS_DFS_TO_BAND3, ACS_BAND3_MIDDLE_CHN,
ACS_BAND_WIDTH_160M, ACS_BAND3_START_CHN);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, chipId);
}
return;
}
/*
* 功能描述: 上报CAC检测信道在ZERO CAC信道范围,ZERO CAC信道范围内不存在惩罚期才需要处理。CAC_ZERO_INTERRUPTED放在雷达检测中处理。
* 函数作者: 胡峰 00330724 2023/04/09
*/
PRIVATE bool ACS_IsNeedDealCacRadarChannel(uint32_t cacChannel, CAC_START_STOP_FLAG cacFlag)
{
return ((cacFlag != CAC_ZERO_INTERRUPTED) && ACS_IsBand3Channel(cacChannel) &&
(!ACS_IfChanOnRadar(ACS_CHIP_5G_LOW, cacChannel, ACS_BAND_WIDTH_160M)));
}
/*
* 功能描述: 在ACS_API_NotifyCacEvent中调用,用来响应SDK上报CAC FLAG信息,用来处理ZERO CAC分段扫描
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC void ACS_DealZeroCacEvent(uint8_t channelNum, CAC_START_STOP_FLAG cacFlag, uint8_t fixedBandW)
{
/* 检查是否需要做分段扫描,包括DFS可选BAND3和NOP回切BAND3 */
if ((!ACS_IsSupportMultiZeroCac()) || (fixedBandW != ACS_BAND_WIDTH_160M)) {
return;
}
/* 检查上报的CAC CHANNEL和FLAG是否在处理范围 */
if (!ACS_IsNeedDealCacRadarChannel(channelNum, cacFlag)) {
HW_WAP_TRACE(HW_MID_ACS_RADAR, "cacChannel=%u,cacFlag=%u,cac state=%s,cac flag no need to deal",
channelNum, cacFlag, ACS_GetCurZeroCacStateName());
return;
}
/* 根据cac信息做匹配,进入状态机处理 */
ACS_FindZeroCacAction(cacFlag, channelNum);
return;
}
/*
* 功能描述: ZERO天线在ZERO CAC期间BAND3检测雷达,需要重置分段ZERO CAC扫描状态
* 函数作者: 胡峰 00330724 2023/04/11
*/
PUBLIC void ACS_DealRadarByZeroAnt(uint32_t radarChannel)
{
if (ACS_IsSupportMultiZeroCac() && ACS_IsBand3Channel(radarChannel)) {
/* 只有band3区间支持分段ZERO CAC扫描,检测到雷达需要重置 */
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
}
return;
}
/*
* 功能描述: 获取自动信道配置时,NOP回切生效信道
* 函数作者: 胡峰 00330724 2023/04/11
*/
PRIVATE uint32_t ACS_GetNopAutoCacChannel(uint32_t bestChn, uint8_t fixedBandW)
{
if ((fixedBandW == ACS_BAND_WIDTH_160M) && ACS_IsBand4Channel(bestChn)) {
/* 配置为160M频宽,ACS选择为band4信道,在NOP回切160M频宽时,需要选到band1信道 */
return ACS_BAND1_START_CHN;
}
/* 选择ACS最近一次的最优信道作为NOP回切信道 */
return bestChn;
}
/*
* 功能描述: NOP结束后,自动信道回切频宽。ACS未重新扫描,无新打分,回到上一次的最优信道和频宽
* 在用户配置160M频宽下,自动信道扫描结束,会有以下几种可能:
* 最优信道@160M频宽,最优信道@80M频宽(打干扰时),最优信道@80M频宽(雷达避让)
* 函数作者: 胡峰 00330724 2023/04/11
*/
PRIVATE void ACS_GoBackForAutoChannel(const AcsInfo *acsInfo, uint8_t curChannel, uint8_t curBandwith)
{
/* 自动信道通频宽和配置一样,无需回切 */
const AcsChnBW *acsChnInfo = (const AcsChnBW *)&(acsInfo->channel);
if (curBandwith == acsChnInfo->fixedBandW) {
HW_WAP_TRACE(HW_MID_ACS_RADAR, "equal to auto bandw,curChannel=%u,curBandwith=%u,bestChn=%u",
curChannel, curBandwith, acsChnInfo->bestChn);
return;
}
/* 选择ACS最近一次的最优信道作为NOP回切信道 */
uint32_t cacChannel = ACS_GetNopAutoCacChannel(acsChnInfo->bestChn, acsChnInfo->fixedBandW);
/* 如果配置目标信道在band1,但是预配置信道列表无band1,那么不做处理 */
if (!ACS_IsValidBand1Channel(cacChannel)) {
HW_WAP_TRACE(HW_MID_ACS_RADAR, "nop end,channel=%u to acs_bestChn=%u,cacChannel=%u fail",
curChannel, acsChnInfo->bestChn, cacChannel);
return;
}
/* 自动信道只会选择36@80,149@80,因此36@160直接扩频宽。前面雷达避让到149@80,回160必须到36@160 */
uint32_t ret = ACS_CheckRadarAndStartZeroCac(acsInfo->chipId, cacChannel, acsChnInfo->fixedBandW,
acsChnInfo->fixedBandW);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, cacChannel);
return; /* 下发失败,不记录后面的日志 */
}
/* 固定信道NOP有30分钟以上,理论上不会冲突。但是代码逻辑上,增加ZERO CAC状态重置保护,覆盖正在进行的ZERO CAC操作 */
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
ACS_WriteAcsDebugLog(acsInfo, "NOP back zero cac,current %hhu/%hhu to fixed %hhu/%hhu,bestChn=%u\n",
curChannel, curBandwith, cacChannel, acsChnInfo->fixedBandW, acsChnInfo->bestChn);
return;
}
/*
* 功能描述: 雷达禁用解除,回切信道和频宽。回切时间在30分钟+惩罚时间之后
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC void ACS_UndoChannelMute(void)
{
if (!ACS_IsZeroWaitEnable()) {
return;
}
uint32_t chipId = ACS_CHIP_5G_LOW;
uint32_t ret = ACS_SendStateMsg(ACS_MSG_NOP_END_ZERO_CAC, ACS_NORMAL_CAC_MSG, &chipId, sizeof(chipId));
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, chipId);
}
return;
}
/*
* 功能描述: NOP结束(30分钟+惩罚时间)后启动ZERO CAC回切
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC void ACS_StartBackZeroCac(uint32_t chipId)
{
uint8_t curChannel = 0;
uint8_t curBandwith = 0;
uint32_t ret = ACS_GetCurrentChn(chipId, &curChannel, &curBandwith);
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret);
return;
}
AcsInfo *acsInfo = ACS_GetRadioData(chipId);
if (ACS_CheckFixChannel(acsInfo)) {
/* 固定信道回切 */
ACS_GoBackForFixChannel(acsInfo, curChannel, curBandwith);
return;
}
/* 自动信道回切band1 */
ACS_GoBackForAutoChannel(acsInfo, curChannel, curBandwith);
return;
}
/*
* 功能描述: 根据输入信道列表设置存在天气雷达信道标志
* 函数作者: 胡峰 00330724 2023/04/21
*/
PUBLIC void ACS_SetWeatherChannelFlag(const acs_scan_list *chnList)
{
if (chnList == NULL) {
LAST_WORD(HW_RET_FAIL);
return;
}
if (chnList->chip == ACS_CHIP_2G) {
return;
}
g_acsZeroCacSwitch.isWeatherChnEnable = ACS_IsExistBandByChannel(chnList, ACS_BAND3_START_CHN, ACS_BAND3_END_CHN);
g_acsZeroCacSwitch.isExistBand1 = ACS_IsExistBandByChannel(chnList, ACS_BAND1_START_CHN, ACS_BAND1_END_CHN);
return;
}
/*
* 功能描述: 指定芯片号判断ACS分段ZERO CAC是否停止
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC bool ACS_IsMultiZeroCacRunningByIndex(uint32_t chipIndex)
{
if (!ACS_IsZeroWaitEnable()) {
return false;
}
return ((chipIndex != ACS_CHIP_2G) && ACS_IsZeroCacRun());
}
/*
* 功能描述: 判断ZERO CAC是否和ACS扫描操作有冲突
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC bool ACS_IsConflictWithZeroCacByMode(uint32_t chipIndex, HW_WIFI_ACS_TRIGGER_MODE_E mode)
{
return (ACS_IsMultiZeroCacRunningByIndex(chipIndex) && (mode == HW_WIFI_ACS_TRIGGER_PERIODIC));
}
/*
* 功能描述: 判断是否支持zero wait特性
* 函数作者: 胡峰 00330724 2023/04/21
*/
PUBLIC bool ACS_IsZeroWaitEnable(void)
{
return g_acsZeroCacSwitch.isZeroWaitEnable;
}
/*
* 功能描述: 判断是否仅通过芯片实现ZERO CAC功能
* 函数作者: 胡峰 00330724 2022/06/27
*/
PUBLIC bool ACS_IsChipSupportZeroCac(void)
{
const WifiChipInfo *wifiInfo = WIFI_DB_GetChipInfo();
if (wifiInfo == NULL) {
return false;
}
for (uint32_t i = 0; i < sizeof(wifiInfo->chipCap) / sizeof(wifiInfo->chipCap[0]); i++) {
if (wifiInfo->chipCap[i].wifiType == WIFI_TYPE_HI1153_5G_E) {
return true;
}
}
return false;
}
/*
* 功能描述: 根据ZERO CAC消息获取对应的下发best channel的switch mode
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC uint32_t ACS_GetZeroSwitchMode(uint32_t zeroCacMsg)
{
return ((zeroCacMsg == ACS_ZERO_CAC_SINGLE_SCAN_MSG) ? ACS_ZEROWAIT_CAC_SWITCH : ACS_NO_PRECAC_SWITCH);
}
/*
* 功能描述: 判断是否需要处理分段ZERO CAC老化
* 函数作者: 胡峰 00330724 2023/05/11
*/
PRIVATE bool ACS_IsNeedMultiZeroCacAge(void)
{
return (ACS_IsZeroWaitEnable() && ACS_IsZeroCacRun());
}
/*
* 功能描述: 发送分段ZERO CAC老化处理消息
* 函数作者: 胡峰 00330724 2023/05/11
*/
PUBLIC void ACS_SendMultiZeroCacAgeMsg(void)
{
if (!ACS_IsNeedMultiZeroCacAge()) {
return;
}
uint32_t chipId = ACS_CHIP_5G_LOW;
uint32_t ret = ACS_SendStateMsg(ACS_MSG_AGE_ZERO_CAC, ACS_NORMAL_CAC_MSG, &chipId, sizeof(chipId));
if (ret != HW_RET_SUCCESS) {
LAST_WORD(ret, chipId);
}
return;
}
/*
* 功能描述: 处理分段ZERO CAC老化
* 函数作者: 胡峰 00330724 2023/05/11
*/
PUBLIC void ACS_ProcMultiZeroCacAge(void)
{
uint32_t oldAgeTime = ACS_GetMultiZeroCacAgeTime();
if (oldAgeTime == 0) {
return;
}
oldAgeTime--;
ACS_SetMultiZeroCacAgeTime(oldAgeTime);
if (oldAgeTime != 0) {
return;
}
/* cac flag等待超时,重置分段ZERO CAC状态 */
ACS_UpdateZeroCacStateAgeTime(ACS_STOP_CAC, 0);
const AcsInfo *acsInfo = ACS_GetRadioData(ACS_CHIP_5G_LOW);
ACS_WriteAcsDebugLog(acsInfo, "zero cac reset state\n");
return;
}
/*
* 功能描述: 输出ZERO CAC调试信息
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC void ACS_PrintZeroCacDInfo(void)
{
HW_WAP_PRINTF("zero wait enable=%u,dfs to band3 enable=%u,support weather channel=%u,exist band1=%u\n"
"zero cac scan type=%s,state=%s,target channel=%u,left age time=%u\n",
ACS_IsZeroWaitEnable(), ACS_IsDfsToBand3Enable(), ACS_IsSupportWeatherChannel(), ACS_IsExistBand1Channel(),
ACS_GetCurZeroCacScanName(), ACS_GetCurZeroCacStateName(), ACS_GetZeroCacTargetChannel(),
ACS_GetMultiZeroCacAgeTime());
return;
}
/*
* 功能描述: ZERO CAC初始化
* 函数作者: 胡峰 00330724 2023/04/19
*/
PUBLIC void ACS_InitZeroCac(void)
{
bool isDyZeroCacChip = ACS_IsChipSupportZeroCac();
/* 是否支持ZERO WAIT */
g_acsZeroCacSwitch.isZeroWaitEnable =
(HW_Feature_IsSupportByFeatureName("FT_WLAN_SUPPORT_ZERO_WAIT") == HW_TRUE) && isDyZeroCacChip;
/* 初始化支持100@160M信道ZERO CAC可选使能开关 */
g_acsZeroCacSwitch.isDfsToBand3Enable =
(HW_Feature_IsSupportByFeatureName("FT_WLAN_SUPPORT_DFS_TO_BAND3") == HW_TRUE) && isDyZeroCacChip;
return;
}
复用扫描结果的四个条件的具体代码在哪里
最新发布