Browse Source

qcacmn: Pause CDP timer during bus/runtime suspend

Converged datapath currently uses a polling timer to check for pending
traffic. As part of suspend, pause the polling timer to avoid any
invalid accesses.

Change-Id: I6b4654c6737c08475443d021c04ba9385d084d74
CRs-Fixed: 2047505
Dustin Brown 8 years ago
parent
commit
4a3b96b4f1
3 changed files with 49 additions and 34 deletions
  1. 9 5
      dp/inc/cdp_txrx_bus.h
  2. 2 2
      dp/inc/cdp_txrx_ops.h
  3. 38 27
      dp/wifi3.0/dp_main.c

+ 9 - 5
dp/inc/cdp_txrx_bus.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -34,12 +34,14 @@
 /**
  * cdp_bus_suspend() - suspend bus
  * @soc - data path soc handle
+ * @ppdev: data path pdev handle
  *
  * suspend bus
  *
  * return QDF_STATUS_SUCCESS suspend is not implemented or suspend done
  */
-static inline QDF_STATUS cdp_bus_suspend(ol_txrx_soc_handle soc)
+static inline QDF_STATUS cdp_bus_suspend(ol_txrx_soc_handle soc,
+					 struct cdp_pdev *ppdev)
 {
 	if (!soc || !soc->ops || !soc->ops->bus_ops) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
@@ -48,19 +50,21 @@ static inline QDF_STATUS cdp_bus_suspend(ol_txrx_soc_handle soc)
 	}
 
 	if (soc->ops->bus_ops->bus_suspend)
-		return soc->ops->bus_ops->bus_suspend();
+		return soc->ops->bus_ops->bus_suspend(ppdev);
 	return QDF_STATUS_E_NOSUPPORT;
 }
 
 /**
  * cdp_bus_resume() - resume bus
  * @soc - data path soc handle
+ * @ppdev: data path pdev handle
  *
  * resume bus
  *
  * return QDF_STATUS_SUCCESS resume is not implemented or suspend done
  */
-static inline QDF_STATUS cdp_bus_resume(ol_txrx_soc_handle soc)
+static inline QDF_STATUS cdp_bus_resume(ol_txrx_soc_handle soc,
+					struct cdp_pdev *ppdev)
 {
 	if (!soc || !soc->ops || !soc->ops->bus_ops) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
@@ -69,7 +73,7 @@ static inline QDF_STATUS cdp_bus_resume(ol_txrx_soc_handle soc)
 	}
 
 	if (soc->ops->bus_ops->bus_resume)
-		return soc->ops->bus_ops->bus_resume();
+		return soc->ops->bus_ops->bus_resume(ppdev);
 	return QDF_STATUS_E_NOSUPPORT;
 }
 

+ 2 - 2
dp/inc/cdp_txrx_ops.h

@@ -790,8 +790,8 @@ struct cdp_ipa_ops {
  * @bus_resume:
  */
 struct cdp_bus_ops {
-	QDF_STATUS (*bus_suspend)(void);
-	QDF_STATUS (*bus_resume)(void);
+	QDF_STATUS (*bus_suspend)(struct cdp_pdev *opaque_pdev);
+	QDF_STATUS (*bus_resume)(struct cdp_pdev *opaque_pdev);
 };
 
 /**

+ 38 - 27
dp/wifi3.0/dp_main.c

@@ -3833,9 +3833,45 @@ static struct cdp_pflow_ops dp_ops_pflow = {
 };
 #endif /* CONFIG_WIN */
 
+#ifdef DP_INTR_POLL_BASED
+static QDF_STATUS dp_bus_suspend(struct cdp_pdev *opaque_pdev)
+{
+	struct dp_pdev *pdev = (struct dp_pdev *)opaque_pdev;
+	struct dp_soc *soc = pdev->soc;
+
+	qdf_timer_stop(&soc->int_timer);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS dp_bus_resume(struct cdp_pdev *opaque_pdev)
+{
+	struct dp_pdev *pdev = (struct dp_pdev *)opaque_pdev;
+	struct dp_soc *soc = pdev->soc;
+
+	qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
+
+	return QDF_STATUS_SUCCESS;
+}
+#else
+static QDF_STATUS dp_bus_suspend(struct cdp_pdev *opaque_pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS dp_bus_resume(struct cdp_pdev *opaque_pdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* DP_INTR_POLL_BASED */
+
 #ifndef CONFIG_WIN
 static struct cdp_misc_ops dp_ops_misc = {
 	.get_opmode = dp_get_opmode,
+#ifdef FEATURE_RUNTIME_PM
+	.runtime_suspend = dp_bus_suspend,
+	.runtime_resume = dp_bus_resume,
+#endif
 };
 
 static struct cdp_flowctl_ops dp_ops_flowctl = {
@@ -3850,34 +3886,9 @@ static struct cdp_ipa_ops dp_ops_ipa = {
 	/* WIFI 3.0 DP NOT IMPLEMENTED YET */
 };
 
-/**
- * dp_dummy_bus_suspend() - dummy bus suspend op
- *
- * FIXME - This is a placeholder for the actual logic!
- *
- * Return: QDF_STATUS_SUCCESS
- */
-inline QDF_STATUS dp_dummy_bus_suspend(void)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * dp_dummy_bus_resume() - dummy bus resume
- *
- * FIXME - This is a placeholder for the actual logic!
- *
- * Return: QDF_STATUS_SUCCESS
- */
-inline QDF_STATUS dp_dummy_bus_resume(void)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
 static struct cdp_bus_ops dp_ops_bus = {
-	/* WIFI 3.0 DP NOT IMPLEMENTED YET */
-	.bus_suspend = dp_dummy_bus_suspend,
-	.bus_resume = dp_dummy_bus_resume
+	.bus_suspend = dp_bus_suspend,
+	.bus_resume = dp_bus_resume
 };
 
 static struct cdp_ocb_ops dp_ops_ocb = {