Qualcomm wifi adapters are utilized in systems that support AMD's WBRF
interference mitigation mechanism. For this mechanism to work frequencies
utilized use must be notified to an ACPI device.
If the kernel is configured with CONFIG_ACPI_WBRF then notify this ACPI
device accordingly.
Change based on code review, not tested due to lack of hardware.
Signed-off-by: Evan Quan <evan.quan@amd.com>
---
v1->v2:
- drop unnecessary EXPORT_SYMBOL_GPL(Mario)
---
drivers/net/wireless/ath/ath12k/core.c | 21 +++++++++++++++++++++
drivers/net/wireless/ath/ath12k/core.h | 14 ++++++++++++++
drivers/net/wireless/ath/ath12k/mac.c | 4 ++++
drivers/net/wireless/ath/ath12k/pci.c | 3 +++
4 files changed, 42 insertions(+)
@@ -14,6 +14,7 @@
#include "dp_rx.h"
#include "debug.h"
#include "hif.h"
+#include "../ath.h"
unsigned int ath12k_debug_mask;
module_param_named(debug_mask, ath12k_debug_mask, uint, 0644);
@@ -935,5 +936,25 @@ struct ath12k_base *ath12k_core_alloc(struct device *dev, size_t priv_size,
return NULL;
}
+#if defined(CONFIG_ACPI_WBRF)
+int ath12k_add_wbrf(struct ath12k_base *ab,
+ struct cfg80211_chan_def *chandef)
+{
+ if (!ab->wbrf)
+ return 0;
+
+ return ath_add_wbrf(ab->dev, chandef);
+}
+
+int ath12k_remove_wbrf(struct ath12k_base *ab,
+ struct cfg80211_chan_def *chandef)
+{
+ if (!ab->wbrf)
+ return 0;
+
+ return ath_remove_wbrf(ab->dev, chandef);
+}
+#endif
+
MODULE_DESCRIPTION("Core module for Qualcomm Atheros 802.11be wireless LAN cards.");
MODULE_LICENSE("Dual BSD/GPL");
@@ -736,6 +736,8 @@ struct ath12k_base {
u64 fw_soc_drop_count;
bool static_window_map;
+ bool wbrf;
+
/* must be last */
u8 drv_priv[] __aligned(sizeof(void *));
};
@@ -820,4 +822,16 @@ static inline const char *ath12k_bus_str(enum ath12k_bus bus)
return "unknown";
}
+#ifdef CONFIG_ACPI_WBRF
+int ath12k_add_wbrf(struct ath12k_base *ab, struct cfg80211_chan_def *chandef);
+int ath12k_remove_wbrf(struct ath12k_base *ab, struct cfg80211_chan_def *chandef);
+#else
+static inline
+int ath12k_add_wbrf(struct ath12k_base *ab,
+ struct cfg80211_chan_def *chandef) { return 0; }
+static inline
+int ath12k_remove_wbrf(struct ath12k_base *ab0,
+ struct cfg80211_chan_def *chandef) { return 0; }
+#endif /* CONFIG_ACPI_WBRF */
+
#endif /* _CORE_H_ */
@@ -5396,6 +5396,8 @@ static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
mutex_lock(&ar->conf_mutex);
+ ath12k_add_wbrf(ab, &ctx->def);
+
spin_lock_bh(&ar->data_lock);
/* TODO: In case of multiple channel context, populate rx_channel from
* Rx PPDU desc information.
@@ -5420,6 +5422,8 @@ static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
mutex_lock(&ar->conf_mutex);
+ ath12k_remove_wbrf(ab, &ctx->def);
+
spin_lock_bh(&ar->data_lock);
/* TODO: In case of there is one more channel context left, populate
* rx_channel with the channel of that remaining channel context.
@@ -13,6 +13,7 @@
#include "hif.h"
#include "mhi.h"
#include "debug.h"
+#include "../ath.h"
#define ATH12K_PCI_BAR_NUM 0
#define ATH12K_PCI_DMA_MASK 32
@@ -1272,6 +1273,8 @@ static int ath12k_pci_probe(struct pci_dev *pdev,
goto err_ce_free;
}
+ ab->wbrf = ath_check_wbrf_support(ab->dev);
+
ret = ath12k_core_init(ab);
if (ret) {
ath12k_err(ab, "failed to init core: %d\n", ret);