kernel: ath10k-ct: provide a build variant for small RAM devices
authorPaul Fertser <fercerpav@gmail.com>
Sun, 22 Dec 2019 18:20:57 +0000 (21:20 +0300)
committerHauke Mehrtens <hauke@hauke-m.de>
Mon, 23 Dec 2019 23:56:51 +0000 (00:56 +0100)
According to many bugreports [0][1][2] the default ath10k-ct kernel
module is unusable on devices with just 64 MiB RAM or with 128 MiB and
dual ath10k cards. The target boards boot but eventually oom-killer
starts to interfere with normal operation, so the current state is
effectively broken.

Since the two patches in question have a performance impact (and
possibly some other unexpected side-effects) a dedicated build variant
is added so that users of the low RAM devices can still benefit from all
the ath10k-ct advantages.

According to testing [3] results, the issue can be experienced even with
"a 256MB device with three radios". Measured performance impact of
implementing small buffers was lowering "the maximum 5 GHz throughput on
an IPQ40xx device without RPS/XPS optimizations from 494/432 Mbit/s for
TCP transfers (download/upload) to 438/343 Mbit/s"

The patches were apparently inspired by QSDK tweaks used by ODMs for the
affected devices.

[0] http://lists.infradead.org/pipermail/openwrt-devel/2019-December/020573.html
[1] https://github.com/openwrt/openwrt/pull/1077
[2] https://bugs.openwrt.org/index.php?do=details&task_id=2664
[3] https://github.com/freifunk-gluon/gluon/pull/1440#issue-195607701

Signed-off-by: Paul Fertser <fercerpav@gmail.com>
[Remove double CONFIG_ATH10K-CT_LEDS entry]
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
package/kernel/ath10k-ct/Makefile
package/kernel/ath10k-ct/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch [new file with mode: 0644]
package/kernel/ath10k-ct/patches/960-0011-ath10k-limit-pci-buffer-size.patch [new file with mode: 0644]

index dbf75fe1740eef31666df39c5ff56b029c229533..c29d28f41a946843ad38dd2e95248f801ed7c3fb 100644 (file)
@@ -35,6 +35,7 @@ define KernelPackage/ath10k-ct
        $(PKG_BUILD_DIR)/ath10k$(CT_KVER)/ath10k_core.ko
   AUTOLOAD:=$(call AutoProbe,ath10k_pci)
   PROVIDES:=kmod-ath10k
+  VARIANT:=regular
 endef
 
 define KernelPackage/ath10k-ct/config
@@ -42,7 +43,13 @@ define KernelPackage/ath10k-ct/config
        config ATH10K-CT_LEDS
                bool "Enable LED support"
                default y
-               depends on PACKAGE_kmod-ath10k-ct
+               depends on PACKAGE_kmod-ath10k-ct || PACKAGE_kmod-ath10k-ct-smallbuffers
+endef
+
+define KernelPackage/ath10k-ct-smallbuffers
+$(call KernelPackage/ath10k-ct)
+  TITLE+= (small buffers for low-RAM devices)
+  VARIANT:=smallbuffers
 endef
 
 NOSTDINC_FLAGS = \
@@ -90,6 +97,10 @@ ifeq ($(CONFIG_ATH10K-CT_LEDS),y)
   NOSTDINC_FLAGS += -DCONFIG_ATH10K_LEDS
 endif
 
+ifeq ($(BUILD_VARIANT),smallbuffers)
+  NOSTDINC_FLAGS += -DCONFIG_ATH10K_SMALLBUFFERS
+endif
+
 define Build/Configure
        cp $(STAGING_DIR)/usr/include/mac80211/ath/*.h $(PKG_BUILD_DIR)
 endef
@@ -107,3 +118,4 @@ define Build/Compile
 endef
 
 $(eval $(call KernelPackage,ath10k-ct))
+$(eval $(call KernelPackage,ath10k-ct-smallbuffers))
diff --git a/package/kernel/ath10k-ct/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch b/package/kernel/ath10k-ct/patches/960-0010-ath10k-limit-htt-rx-ring-size.patch
new file mode 100644 (file)
index 0000000..a3a9394
--- /dev/null
@@ -0,0 +1,28 @@
+--- a/ath10k-4.19/htt.h
++++ b/ath10k-4.19/htt.h
+@@ -237,7 +237,11 @@ enum htt_rx_ring_flags {
+ };
+ #define HTT_RX_RING_SIZE_MIN 128
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+ #define HTT_RX_RING_SIZE_MAX 2048
++#else
++#define HTT_RX_RING_SIZE_MAX 512
++#endif
+ #define HTT_RX_RING_SIZE HTT_RX_RING_SIZE_MAX
+ #define HTT_RX_RING_FILL_LEVEL (((HTT_RX_RING_SIZE) / 2) - 1)
+ #define HTT_RX_RING_FILL_LEVEL_DUAL_MAC (HTT_RX_RING_SIZE - 1)
+--- a/ath10k-5.2/htt.h
++++ b/ath10k-5.2/htt.h
+@@ -225,7 +225,11 @@ enum htt_rx_ring_flags {
+ };
+ #define HTT_RX_RING_SIZE_MIN 128
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+ #define HTT_RX_RING_SIZE_MAX 2048
++#else
++#define HTT_RX_RING_SIZE_MAX 512
++#endif
+ #define HTT_RX_RING_SIZE HTT_RX_RING_SIZE_MAX
+ #define HTT_RX_RING_FILL_LEVEL (((HTT_RX_RING_SIZE) / 2) - 1)
+ #define HTT_RX_RING_FILL_LEVEL_DUAL_MAC (HTT_RX_RING_SIZE - 1)
diff --git a/package/kernel/ath10k-ct/patches/960-0011-ath10k-limit-pci-buffer-size.patch b/package/kernel/ath10k-ct/patches/960-0011-ath10k-limit-pci-buffer-size.patch
new file mode 100644 (file)
index 0000000..517be89
--- /dev/null
@@ -0,0 +1,100 @@
+--- a/ath10k-4.19/pci.c
++++ b/ath10k-4.19/pci.c
+@@ -142,7 +142,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 2048,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 512,
++#else
++              .dest_nentries = 128,
++#endif
+               .recv_cb = ath10k_pci_htt_htc_rx_cb,
+       },
+@@ -151,7 +155,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 2048,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 128,
++#else
++              .dest_nentries = 64,
++#endif
+               .recv_cb = ath10k_pci_htc_rx_cb,
+       },
+@@ -178,7 +186,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 512,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 512,
++#else
++              .dest_nentries = 128,
++#endif
+               .recv_cb = ath10k_pci_htt_rx_cb,
+       },
+@@ -203,7 +215,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 2048,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 128,
++#else
++              .dest_nentries = 96,
++#endif
+               .recv_cb = ath10k_pci_pktlog_rx_cb,
+       },
+--- a/ath10k-5.2/pci.c
++++ b/ath10k-5.2/pci.c
+@@ -131,7 +131,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 2048,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 512,
++#else
++              .dest_nentries = 128,
++#endif
+               .recv_cb = ath10k_pci_htt_htc_rx_cb,
+       },
+@@ -140,7 +144,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 2048,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 128,
++#else
++              .dest_nentries = 64,
++#endif
+               .recv_cb = ath10k_pci_htc_rx_cb,
+       },
+@@ -167,7 +175,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 512,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 512,
++#else
++              .dest_nentries = 128,
++#endif
+               .recv_cb = ath10k_pci_htt_rx_cb,
+       },
+@@ -192,7 +204,11 @@ static struct ce_attr host_ce_config_wla
+               .flags = CE_ATTR_FLAGS,
+               .src_nentries = 0,
+               .src_sz_max = 2048,
++#ifndef CONFIG_ATH10K_SMALLBUFFERS
+               .dest_nentries = 128,
++#else
++              .dest_nentries = 96,
++#endif
+               .recv_cb = ath10k_pci_pktlog_rx_cb,
+       },