mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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
 | |
| @@ -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",
 | |
| @@ -1954,7 +1954,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];
 | |
| @@ -1970,7 +1971,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;
 | |
|  }
 |