Certain regulatory domains could put restrictions on phy mode operation. For example, in a few countries HE/EHT Operation is not allowed. For such countries, firmware indicates this via phy bitmap in each reg rule. Currently, there is no logic to parse this info and then pass it on to the cfg80211/regulatory. Add parsing of this phy bitmap from the regulatory channel change event and then accordingly map it to cfg80211/regulatory flags and pass it on to it. While at it, correct typo in debug print: s/dsf/dfs. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1 Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com> Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://lore.kernel.org/r/20231004092818.25130-1-quic_adisi@quicinc.com
101 lines
2.8 KiB
C
101 lines
2.8 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
|
/*
|
|
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
|
|
#ifndef ATH12K_REG_H
|
|
#define ATH12K_REG_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include <net/regulatory.h>
|
|
|
|
struct ath12k_base;
|
|
struct ath12k;
|
|
|
|
/* DFS regdomains supported by Firmware */
|
|
enum ath12k_dfs_region {
|
|
ATH12K_DFS_REG_UNSET,
|
|
ATH12K_DFS_REG_FCC,
|
|
ATH12K_DFS_REG_ETSI,
|
|
ATH12K_DFS_REG_MKK,
|
|
ATH12K_DFS_REG_CN,
|
|
ATH12K_DFS_REG_KR,
|
|
ATH12K_DFS_REG_MKK_N,
|
|
ATH12K_DFS_REG_UNDEF,
|
|
};
|
|
|
|
enum ath12k_reg_cc_code {
|
|
REG_SET_CC_STATUS_PASS = 0,
|
|
REG_CURRENT_ALPHA2_NOT_FOUND = 1,
|
|
REG_INIT_ALPHA2_NOT_FOUND = 2,
|
|
REG_SET_CC_CHANGE_NOT_ALLOWED = 3,
|
|
REG_SET_CC_STATUS_NO_MEMORY = 4,
|
|
REG_SET_CC_STATUS_FAIL = 5,
|
|
};
|
|
|
|
struct ath12k_reg_rule {
|
|
u16 start_freq;
|
|
u16 end_freq;
|
|
u16 max_bw;
|
|
u8 reg_power;
|
|
u8 ant_gain;
|
|
u16 flags;
|
|
bool psd_flag;
|
|
u16 psd_eirp;
|
|
};
|
|
|
|
struct ath12k_reg_info {
|
|
enum ath12k_reg_cc_code status_code;
|
|
u8 num_phy;
|
|
u8 phy_id;
|
|
u16 reg_dmn_pair;
|
|
u16 ctry_code;
|
|
u8 alpha2[REG_ALPHA2_LEN + 1];
|
|
u32 dfs_region;
|
|
u32 phybitmap;
|
|
bool is_ext_reg_event;
|
|
u32 min_bw_2g;
|
|
u32 max_bw_2g;
|
|
u32 min_bw_5g;
|
|
u32 max_bw_5g;
|
|
u32 num_2g_reg_rules;
|
|
u32 num_5g_reg_rules;
|
|
struct ath12k_reg_rule *reg_rules_2g_ptr;
|
|
struct ath12k_reg_rule *reg_rules_5g_ptr;
|
|
enum wmi_reg_6g_client_type client_type;
|
|
bool rnr_tpe_usable;
|
|
bool unspecified_ap_usable;
|
|
/* TODO: All 6G related info can be stored only for required
|
|
* combination instead of all types, to optimize memory usage.
|
|
*/
|
|
u8 domain_code_6g_ap[WMI_REG_CURRENT_MAX_AP_TYPE];
|
|
u8 domain_code_6g_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE];
|
|
u32 domain_code_6g_super_id;
|
|
u32 min_bw_6g_ap[WMI_REG_CURRENT_MAX_AP_TYPE];
|
|
u32 max_bw_6g_ap[WMI_REG_CURRENT_MAX_AP_TYPE];
|
|
u32 min_bw_6g_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE];
|
|
u32 max_bw_6g_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE];
|
|
u32 num_6g_reg_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE];
|
|
u32 num_6g_reg_rules_cl[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE];
|
|
struct ath12k_reg_rule *reg_rules_6g_ap_ptr[WMI_REG_CURRENT_MAX_AP_TYPE];
|
|
struct ath12k_reg_rule *reg_rules_6g_client_ptr
|
|
[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE];
|
|
};
|
|
|
|
/* Phy bitmaps */
|
|
enum ath12k_reg_phy_bitmap {
|
|
ATH12K_REG_PHY_BITMAP_NO11AX = BIT(5),
|
|
ATH12K_REG_PHY_BITMAP_NO11BE = BIT(6),
|
|
};
|
|
|
|
void ath12k_reg_init(struct ath12k *ar);
|
|
void ath12k_reg_free(struct ath12k_base *ab);
|
|
void ath12k_regd_update_work(struct work_struct *work);
|
|
struct ieee80211_regdomain *ath12k_reg_build_regd(struct ath12k_base *ab,
|
|
struct ath12k_reg_info *reg_info,
|
|
bool intersect);
|
|
int ath12k_regd_update(struct ath12k *ar, bool init);
|
|
int ath12k_reg_update_chan_list(struct ath12k *ar);
|
|
|
|
#endif
|