From 094d6e53e9c654144d1fba484965fc63c9493282 Mon Sep 17 00:00:00 2001 From: Sowmiya Sree Elavalagan Date: Mon, 18 Jan 2021 13:11:29 +0530 Subject: [PATCH] ath11k:add mod param support to skip radio during boot Added a module param which skip qcn6122-5G or 6G or both during device boot up. This will boot only unskipped radios. Signed-off-by: Sowmiya Sree Elavalagan --- drivers/net/wireless/ath/ath11k/ahb.c | 27 +++++++++++++++++++++++++-- drivers/net/wireless/ath/ath11k/ahb.h | 2 ++ drivers/net/wireless/ath/ath11k/core.c | 4 ++++ 3 files changed, 31 insertions(+), 2 deletions(-) --- a/drivers/net/wireless/ath/ath11k/ahb.c +++ b/drivers/net/wireless/ath/ath11k/ahb.c @@ -1091,6 +1091,23 @@ static int ath11k_get_userpd_id(struct d return userpd_id; } +static bool ath11k_skip_target_probe(int userpd_id, const struct of_device_id *of_id) +{ + int hw_rev = (enum ath11k_hw_rev)of_id->data; + + if (ath11k_skip_radio & SKIP_QCN6122_0) { + if (hw_rev == ATH11K_HW_QCN6122 && + userpd_id == QCN6122_USERPD_0) + return true; + } else if (ath11k_skip_radio & SKIP_QCN6122_1) { + if (hw_rev == ATH11K_HW_QCN6122 && + userpd_id == QCN6122_USERPD_1) + return true; + } + + return false; +} + static int ath11k_ahb_probe(struct platform_device *pdev) { struct ath11k_base *ab; @@ -1099,7 +1116,7 @@ static int ath11k_ahb_probe(struct platf const struct ath11k_hif_ops *hif_ops; const struct ath11k_pci_ops *pci_ops; enum ath11k_hw_rev hw_rev; - int ret, userpd_id; + int ret = 0, userpd_id; u32 hw_mode_id; of_id = of_match_device(ath11k_ahb_of_match, &pdev->dev); @@ -1131,6 +1148,9 @@ static int ath11k_ahb_probe(struct platf } userpd_id = ath11k_get_userpd_id(dev); + if (ath11k_skip_target_probe(userpd_id, of_id)) + goto end; + ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); if (ret) { dev_err(&pdev->dev, "failed to set 32-bit consistent dma\n"); @@ -1236,8 +1256,8 @@ err_fw_deinit: err_core_free: ath11k_core_free(ab); +end: platform_set_drvdata(pdev, NULL); - return ret; } @@ -1246,6 +1266,9 @@ static int ath11k_ahb_remove(struct plat struct ath11k_base *ab = platform_get_drvdata(pdev); unsigned long left; + if (!ab) + return 0; + if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { ath11k_ahb_power_down(ab); ath11k_debugfs_soc_destroy(ab); --- a/drivers/net/wireless/ath/ath11k/ahb.h +++ b/drivers/net/wireless/ath/ath11k/ahb.h @@ -8,6 +8,8 @@ #include "core.h" #define ATH11K_AHB_RECOVERY_TIMEOUT (3 * HZ) +#define SKIP_QCN6122_0 0x2 +#define SKIP_QCN6122_1 0x4 struct ath11k_base; struct ath11k_ahb { --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -57,6 +57,12 @@ unsigned int ath11k_ftm_mode; module_param_named(ftm_mode, ath11k_ftm_mode, uint, 0644); MODULE_PARM_DESC(ftm_mode, "Boots up in factory test mode"); +module_param_named(skip_radio_bmap, ath11k_skip_radio, uint, 0644); +MODULE_PARM_DESC(skip_radio_bmap, "Bitmap to skip device probe"); +unsigned int ath11k_skip_radio; +EXPORT_SYMBOL(ath11k_skip_radio); + + struct ath11k_base *ath11k_soc[MAX_SOCS]; static const struct ath11k_hw_params ath11k_hw_params[] = { --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -39,6 +39,8 @@ extern wait_queue_head_t ath11k_ssr_dump extern bool ath11k_collect_dump; #endif +extern unsigned int ath11k_skip_radio; + #define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK) #define ATH11K_TX_MGMT_NUM_PENDING_MAX 512