Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 581b86b7 authored by Anand Kumar's avatar Anand Kumar Committed by Hardik Kantilal Patel
Browse files

wcnss: Dump WCNSS registers during SSR Timeout



Dump required WCNSS registers which help to debug WCNSS
failure during SSR timeout callback.

Change-Id: Ie8f97043266fbc83d76c85449825539a14801f13
CRs-Fixed: 1045584
Signed-off-by: default avatarAnand Kumar <anandkumar@codeaurora.org>
parent 1446cd5f
Loading
Loading
Loading
Loading
+33 −7
Original line number Diff line number Diff line
@@ -589,13 +589,12 @@ void wcnss_pronto_is_a2xb_bus_stall(void *tst_addr, u32 fifo_mask, char *type)
	}
}

/* Log pronto debug registers before sending reset interrupt */
/* Log pronto debug registers during SSR Timeout CB */
void wcnss_pronto_log_debug_regs(void)
{
	void __iomem *reg_addr, *tst_addr, *tst_ctrl_addr;
	u32 reg = 0, reg2 = 0, reg3 = 0, reg4 = 0;


	reg_addr = penv->msm_wcnss_base + PRONTO_PMU_SPARE_OFFSET;
	reg = readl_relaxed(reg_addr);
	pr_err("PRONTO_PMU_SPARE %08x\n", reg);
@@ -799,6 +798,33 @@ void wcnss_pronto_log_debug_regs(void)
	reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_AHB_CBCR_OFFSET;
	reg3 = readl_relaxed(reg_addr);
	pr_err("PMU_WLAN_AHB_CBCR %08x\n", reg3);
}
EXPORT_SYMBOL(wcnss_pronto_log_debug_regs);

/* Log pronto debug registers before sending reset interrupt */
void wcnss_pronto_dump_regs(void)
{
	void __iomem *reg_addr;
	u32 reg = 0, reg2 = 0, reg3 = 0, reg4 = 0;

	if (!penv || !penv->triggered || !penv->msm_wcnss_base) {
		pr_info(DEVICE " WCNSS driver is not triggered by userspace\n");
		return;
	}

	wcnss_pronto_log_debug_regs();

	reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_BCR_OFFSET;
	reg = readl_relaxed(reg_addr);

	reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_GDSCR_OFFSET;
	reg2 = readl_relaxed(reg_addr);

	reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_AHB_CBCR_OFFSET;
	reg3 = readl_relaxed(reg_addr);

	reg_addr = penv->msm_wcnss_base + PRONTO_PMU_CPU_AHB_CMD_RCGR_OFFSET;
	reg4 = readl_relaxed(reg_addr);

	msleep(50);

@@ -878,7 +904,7 @@ void wcnss_pronto_log_debug_regs(void)
	reg = readl_relaxed(penv->alarms_tactl);
	pr_err("ALARMS_TACTL %08x\n", reg);
}
EXPORT_SYMBOL(wcnss_pronto_log_debug_regs);
EXPORT_SYMBOL(wcnss_pronto_dump_regs);

#ifdef CONFIG_WCNSS_REGISTER_DUMP_ON_BITE

@@ -1095,7 +1121,7 @@ void wcnss_log_debug_regs_on_bite(void)
		pr_debug("wcnss: clock frequency is: %luHz\n", clk_rate);

		if (clk_rate) {
			wcnss_pronto_log_debug_regs();
			wcnss_pronto_dump_regs();
			if (wcnss_get_mux_control())
				wcnss_log_iris_regs();
		} else {
@@ -1115,7 +1141,7 @@ void wcnss_reset_fiq(bool clk_chk_en)
		if (clk_chk_en) {
			wcnss_log_debug_regs_on_bite();
		} else {
			wcnss_pronto_log_debug_regs();
			wcnss_pronto_dump_regs();
			if (wcnss_get_mux_control())
				wcnss_log_iris_regs();
		}
@@ -3161,7 +3187,7 @@ wcnss_trigger_config(struct platform_device *pdev)
			dev_err(&pdev->dev, "Peripheral Loader failed on WCNSS.\n");
			ret = PTR_ERR(penv->pil);
			wcnss_disable_pc_add_req();
			wcnss_pronto_log_debug_regs();
			wcnss_pronto_dump_regs();
		}
	} while (pil_retry++ < WCNSS_MAX_PIL_RETRY && IS_ERR(penv->pil));

@@ -3413,7 +3439,7 @@ static int wcnss_notif_cb(struct notifier_block *this, unsigned long code,
		if (pdev && pwlanconfig)
			wcnss_wlan_power(&pdev->dev, pwlanconfig,
					WCNSS_WLAN_SWITCH_OFF, NULL);
		wcnss_pronto_log_debug_regs();
		wcnss_pronto_dump_regs();
		wcnss_disable_pc_remove_req();
	} else if (SUBSYS_BEFORE_SHUTDOWN == code) {
		wcnss_disable_pc_add_req();
+2 −1
Original line number Diff line number Diff line
/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -124,6 +124,7 @@ void wcnss_suspend_notify(void);
void wcnss_resume_notify(void);
void wcnss_riva_log_debug_regs(void);
void wcnss_pronto_log_debug_regs(void);
void wcnss_pronto_dump_regs(void);
int wcnss_is_hw_pronto_ver3(void);
int wcnss_device_ready(void);
bool wcnss_cbc_complete(void);