From 3db21c0a2e3ca2c732b26318127867442d4958f3 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Tue, 15 Dec 2020 12:57:45 -0800 Subject: [PATCH] cnss2: Make sure the write to remap window register take effect Since PCIe remap window register access and actual PCIe device register access may go through different NoCs, read it back after writing to remap window register to make sure it has taken effect. This is able to avoid NOC errors when accessing the actual device register which the remap window value applies to. Change-Id: I65848758250fb9e6e1cbe513932c64b8303a8e98 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index baddb51e90fc..f88c76d13301 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -393,15 +393,24 @@ int cnss_pci_check_link_status(struct cnss_pci_data *pci_priv) static void cnss_pci_select_window(struct cnss_pci_data *pci_priv, u32 offset) { u32 window = (offset >> WINDOW_SHIFT) & WINDOW_VALUE_MASK; + u32 window_enable = WINDOW_ENABLE_BIT | window; + u32 val; - writel_relaxed(WINDOW_ENABLE_BIT | window, - QCA6390_PCIE_REMAP_BAR_CTRL_OFFSET + - pci_priv->bar); + writel_relaxed(window_enable, pci_priv->bar + + QCA6390_PCIE_REMAP_BAR_CTRL_OFFSET); if (window != pci_priv->remap_window) { pci_priv->remap_window = window; cnss_pr_dbg("Config PCIe remap window register to 0x%x\n", - WINDOW_ENABLE_BIT | window); + window_enable); + } + + /* Read it back to make sure the write has taken effect */ + val = readl_relaxed(pci_priv->bar + QCA6390_PCIE_REMAP_BAR_CTRL_OFFSET); + if (val != window_enable) { + cnss_pr_err("Failed to config window register to 0x%x, current value: 0x%x\n", + window_enable, val); + CNSS_ASSERT(0); } }