From fb1c40c225cbc413d82c872dd8c8af3469b2b921 Mon Sep 17 00:00:00 2001 From: Robert Marko 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 --- 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 @@ -36,7 +36,7 @@ bool ath11k_ftm_mode; module_param_named(ftm_mode, ath11k_ftm_mode, bool, 0444); MODULE_PARM_DESC(ftm_mode, "Boots up in factory test mode"); -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", @@ -1953,7 +1953,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]; @@ -1969,7 +1970,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; }