mac80211: add ath11k AHB support
authorRobert Marko <robimarko@gmail.com>
Tue, 13 Dec 2022 22:55:26 +0000 (23:55 +0100)
committerRobert Marko <robimarko@gmail.com>
Mon, 16 Jan 2023 11:42:23 +0000 (12:42 +0100)
This is the follow up to the PCI support commit now providing support for
AHB variant as well, though currently only for ipq807x as that is only
OpenWrt supported SoC ath11k supports as well.

Currently, we are disabling coldboot calibration on ipq807x as it does not
work, there is a remoteproc bug that makes it come late out of reset so
disable coldboot until that is fixed.

Also, as ath11k is quite memory hungry, we are introducing a config option
to use the limits for 512MB of RAM, similar to what QCA does downstream but
in way simpler and cleaner way so that 512MB save some RAM.
512MB profile is also set as the default for now.

Signed-off-by: Robert Marko <robimarko@gmail.com>
package/kernel/mac80211/Makefile
package/kernel/mac80211/ath.mk
package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch [new file with mode: 0644]
package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch [new file with mode: 0644]

index 1344b9f8e2c1fd8862dcd2de1724d0450ea35671..b7059fe636cd68e4bf4258cb03ed607c098680d0 100644 (file)
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 PKG_NAME:=mac80211
 
 PKG_VERSION:=6.1-rc8
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 # PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.58/
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources/
 PKG_HASH:=7f3d96c2573183cd79d6a3ebe5e1b7b73c19d1326d443c85b69c4181f14e6e2b
index 83228311cc4514b869a98c921c1a40a4de5dee81..4f14fec8e26e9403bf88619ffcd6876d1fe52dc9 100644 (file)
@@ -1,6 +1,6 @@
 PKG_DRIVERS += \
        ath ath5k ath6kl ath6kl-sdio ath6kl-usb ath9k ath9k-common ath9k-htc ath10k ath10k-smallbuffers \
-       ath11k ath11k-pci carl9170 owl-loader ar5523 wil6210
+       ath11k ath11k-ahb ath11k-pci carl9170 owl-loader ar5523 wil6210
 
 PKG_CONFIG_DEPENDS += \
        CONFIG_PACKAGE_ATH_DEBUG \
@@ -61,6 +61,7 @@ config-$(call config_package,ath9k-htc) += ATH9K_HTC
 config-$(call config_package,ath10k) += ATH10K ATH10K_PCI
 config-$(call config_package,ath10k-smallbuffers) += ATH10K ATH10K_PCI ATH10K_SMALLBUFFERS
 config-$(call config_package,ath11k) += ATH11K
+config-$(call config_package,ath11k-ahb) += ATH11K_AHB
 config-$(call config_package,ath11k-pci) += ATH11K_PCI
 
 config-$(call config_package,ath5k) += ATH5K
@@ -316,9 +317,24 @@ define KernelPackage/ath11k/config
        config ATH11K_THERMAL
                bool "Enable thermal sensors and throttling support"
                depends on PACKAGE_kmod-ath11k
+               default y if TARGET_ipq807x
 
 endef
 
+define KernelPackage/ath11k-ahb
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Qualcomm 802.11ax AHB wireless chipset support
+  URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k
+  DEPENDS+= @TARGET_ipq807x +kmod-ath11k +kmod-qrtr-smd
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k_ahb.ko
+  AUTOLOAD:=$(call AutoProbe,ath11k_ahb)
+endef
+
+define KernelPackage/ath11k-ahb/description
+This module adds support for Qualcomm Technologies 802.11ax family of
+chipsets with AHB bus.
+endef
+
 define KernelPackage/ath11k-pci
   $(call KernelPackage/mac80211/Default)
   TITLE:=Qualcomm 802.11ax PCI wireless chipset support
diff --git a/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch b/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch
new file mode 100644 (file)
index 0000000..bf51c01
--- /dev/null
@@ -0,0 +1,24 @@
+From dd3b9c59cfa1e9e0b73a575f4646be905691eaef Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Sat, 16 Oct 2021 19:34:10 +0200
+Subject: [PATCH 241/241] ath11k: Disable coldboot calibration for IPQ8074
+
+There is a bug with the remoteproc reset after coldboot calibration,
+so until that is resolved disabled it to allow using the radio.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ drivers/net/wireless/ath/ath11k/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/ath/ath11k/core.c
++++ b/drivers/net/wireless/ath/ath11k/core.c
+@@ -81,7 +81,7 @@ static const struct ath11k_hw_params ath
+               .supports_shadow_regs = false,
+               .idle_ps = false,
+               .supports_sta_ps = false,
+-              .cold_boot_calib = true,
++              .cold_boot_calib = false,
+               .cbcal_restart_fw = true,
+               .fw_mem_mode = 0,
+               .num_vdevs = 16 + 1,
diff --git a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
new file mode 100644 (file)
index 0000000..c854de5
--- /dev/null
@@ -0,0 +1,74 @@
+From fb1c40c225cbc413d82c872dd8c8af3469b2b921 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Fri, 16 Dec 2022 17:17:52 +0100
+Subject: [PATCH] ath11k: support setting FW memory mode via DT
+
+ath11k is really memory intensive for devices with less that 1GB of RAM,
+so lets allow saving a significant amount of memory by setting the FW to
+Mode-1 via DTS for devices that need it.
+
+However the drawback is reduced number of VDEV-s and peers which is a
+reasonable tradeoff.
+
+Mode-2 allows for further reduction, but it has further restrictions.
+
+While we are here, lets add a print to be able to easily determine what
+FW memory mode is being used.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ drivers/net/wireless/ath/ath11k/core.c | 28 ++++++++++++++++++++++++--
+ 1 file changed, 26 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath11k/core.c
++++ b/drivers/net/wireless/ath/ath11k/core.c
+@@ -32,7 +32,7 @@ module_param_named(frame_mode, ath11k_fr
+ MODULE_PARM_DESC(frame_mode,
+                "Datapath frame mode (0: raw, 1: native wifi (default), 2: ethernet)");
+-static const struct ath11k_hw_params ath11k_hw_params[] = {
++static struct ath11k_hw_params ath11k_hw_params[] = {
+       {
+               .hw_rev = ATH11K_HW_IPQ8074,
+               .name = "ipq8074 hw2.0",
+@@ -1826,7 +1826,8 @@ static void ath11k_core_reset(struct wor
+ static int ath11k_init_hw_params(struct ath11k_base *ab)
+ {
+       const struct ath11k_hw_params *hw_params = NULL;
+-      int i;
++      u32 fw_mem_mode;
++      int i, ret;
+       for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
+               hw_params = &ath11k_hw_params[i];
+@@ -1842,7 +1843,30 @@ static int ath11k_init_hw_params(struct
+       ab->hw_params = *hw_params;
++      ret = of_property_read_u32(ab->dev->of_node,
++                                 "qcom,ath11k-fw-memory-mode",
++                                 &fw_mem_mode);
++      if (!ret) {
++              if (fw_mem_mode == 0) {
++                      ab->hw_params.fw_mem_mode = 0;
++                      ab->hw_params.num_vdevs = 16 + 1;
++                      ab->hw_params.num_peers = 512;
++              }
++              else if (fw_mem_mode == 1) {
++                      ab->hw_params.fw_mem_mode = 1;
++                      ab->hw_params.num_vdevs = 8;
++                      ab->hw_params.num_peers = 128;
++              } else if (fw_mem_mode == 2) {
++                      ab->hw_params.fw_mem_mode = 2;
++                      ab->hw_params.num_vdevs = 8;
++                      ab->hw_params.num_peers = 128;
++                      ab->hw_params.cold_boot_calib = false;
++              } else
++                      ath11k_info(ab, "Unsupported FW memory mode: %u\n", fw_mem_mode);
++      }
++
+       ath11k_info(ab, "%s\n", ab->hw_params.name);
++      ath11k_info(ab, "FW memory mode: %d\n", ab->hw_params.fw_mem_mode);
+       return 0;
+ }