summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYue Ma <yuem@codeaurora.org>2019-10-17 12:30:26 -0700
committerYue Ma <yuem@codeaurora.org>2019-10-22 12:18:15 -0700
commit5ff3c8e36617ec6a80c3b4b79e30bff9b127627a (patch)
treed853509c4d2f23a645f08f6a50580655fc8eb5ef
parentdd4645c977feb6cef4d7f598abd8864cc7b7e878 (diff)
cnss2: Expose PCIe window register lock related APIs
The register window needs to be configed properly before accessing any larger than 4K range PCIe registers. Expose the lock to WLAN driver to avoid race condition when both drivers try to config it. Change-Id: I94ccd963d4fd0a9715330d2e5733346ccd993ae1 Signed-off-by: Yue Ma <yuem@codeaurora.org>
-rw-r--r--drivers/net/wireless/cnss2/pci.c13
-rw-r--r--include/net/cnss2.h3
2 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c
index 7dc419753a80..099aa9d38bb8 100644
--- a/drivers/net/wireless/cnss2/pci.c
+++ b/drivers/net/wireless/cnss2/pci.c
@@ -56,6 +56,7 @@
#ifdef CONFIG_PCI_MSM
static DEFINE_SPINLOCK(pci_link_down_lock);
#endif
+static DEFINE_SPINLOCK(pci_reg_window_lock);
static unsigned int pci_link_down_panic;
module_param(pci_link_down_panic, uint, 0600);
@@ -268,6 +269,18 @@ int cnss_pci_is_device_down(struct device *dev)
}
EXPORT_SYMBOL(cnss_pci_is_device_down);
+void cnss_pci_lock_reg_window(struct device *dev, unsigned long *flags)
+{
+ spin_lock_bh(&pci_reg_window_lock);
+}
+EXPORT_SYMBOL(cnss_pci_lock_reg_window);
+
+void cnss_pci_unlock_reg_window(struct device *dev, unsigned long *flags)
+{
+ spin_unlock_bh(&pci_reg_window_lock);
+}
+EXPORT_SYMBOL(cnss_pci_unlock_reg_window);
+
int cnss_pci_recovery_update_status(struct cnss_pci_data *pci_priv)
{
struct cnss_plat_data *plat_priv;
diff --git a/include/net/cnss2.h b/include/net/cnss2.h
index 5ed1b05277b1..4a541581f9d7 100644
--- a/include/net/cnss2.h
+++ b/include/net/cnss2.h
@@ -245,6 +245,9 @@ extern void cnss_request_pm_qos(struct device *dev, u32 qos_val);
extern void cnss_remove_pm_qos(struct device *dev);
extern void cnss_lock_pm_sem(struct device *dev);
extern void cnss_release_pm_sem(struct device *dev);
+extern void cnss_pci_lock_reg_window(struct device *dev, unsigned long *flags);
+extern void cnss_pci_unlock_reg_window(struct device *dev,
+ unsigned long *flags);
extern int cnss_auto_suspend(struct device *dev);
extern int cnss_auto_resume(struct device *dev);
extern int cnss_pci_is_drv_connected(struct device *dev);