qcacld-3.0: Add change to support DRV during wow mode

Add changes to support DRV feature during wow mode.

Change-Id: I588dfc5fa1bc419a288f346664c4028ef2d2011b
CRs-Fixed: 2456148
diff --git a/components/pmo/core/src/wlan_pmo_suspend_resume.c b/components/pmo/core/src/wlan_pmo_suspend_resume.c
index b2b5fde..7f03c36 100644
--- a/components/pmo/core/src/wlan_pmo_suspend_resume.c
+++ b/components/pmo/core/src/wlan_pmo_suspend_resume.c
@@ -745,6 +745,13 @@
 		psoc_ctx->wow.wow_state = pmo_wow_state_unified_d0;
 	}
 
+	if (qdf_is_drv_connected()) {
+		pmo_info("drv wow is enabled");
+		param.flags |= WMI_WOW_FLAG_ENABLE_DRV_PCIE_L1SS_SLEEP;
+	} else {
+		pmo_info("non-drv wow is enabled");
+	}
+
 	status = pmo_tgt_psoc_send_wow_enable_req(psoc, &param);
 	if (status != QDF_STATUS_SUCCESS) {
 		pmo_err("Failed to enable wow in fw");
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index e69c578..68d4ed5 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -176,6 +176,21 @@
 	return 0;
 }
 
+static bool cds_is_drv_connected(void)
+{
+	int ret;
+	qdf_device_t qdf_ctx;
+
+	qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
+	if (!qdf_ctx) {
+		cds_err("cds context is invalid");
+		return false;
+	}
+
+	ret = pld_is_drv_connected(qdf_ctx->dev);
+
+	return ((ret > 0) ? true : false);
+}
 
 QDF_STATUS cds_init(void)
 {
@@ -196,6 +211,7 @@
 	qdf_register_self_recovery_callback(__cds_trigger_recovery);
 	qdf_register_fw_down_callback(cds_is_fw_down);
 	qdf_register_recovering_state_query_callback(cds_is_driver_recovering);
+	qdf_register_drv_connected_callback(cds_is_drv_connected);
 
 	return QDF_STATUS_SUCCESS;
 
diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h
index b30ceed..7b22ee2 100644
--- a/core/wma/inc/wma.h
+++ b/core/wma/inc/wma.h
@@ -1138,6 +1138,7 @@
 					uint8_t vdev_id);
 	qdf_wake_lock_t wmi_cmd_rsp_wake_lock;
 	qdf_runtime_lock_t wmi_cmd_rsp_runtime_lock;
+	qdf_runtime_lock_t sap_prevent_runtime_pm_lock;
 	enum active_apf_mode active_uc_apf_mode;
 	enum active_apf_mode active_mc_bc_apf_mode;
 	struct wma_ini_config ini_config;
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index 710629e..21e2143 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -5801,6 +5801,16 @@
 	}
 }
 
+static void wma_sap_prevent_runtime_pm(tp_wma_handle wma)
+{
+	qdf_runtime_pm_prevent_suspend(&wma->sap_prevent_runtime_pm_lock);
+}
+
+static void wma_sap_allow_runtime_pm(tp_wma_handle wma)
+{
+	qdf_runtime_pm_allow_suspend(&wma->sap_prevent_runtime_pm_lock);
+}
+
 /**
  * wma_add_sta() - process add sta request as per opmode
  * @wma: wma handle
@@ -5840,7 +5850,13 @@
 	/* IBSS should share the same code as AP mode */
 	case BSS_OPERATIONAL_MODE_IBSS:
 	case BSS_OPERATIONAL_MODE_AP:
-		htc_vote_link_up(htc_handle);
+		if (qdf_is_drv_connected()) {
+			wma_debug("drv wow enabled prevent runtime pm");
+			wma_sap_prevent_runtime_pm(wma);
+		} else {
+			wma_debug("non-drv wow enabled vote for link up");
+			htc_vote_link_up(htc_handle);
+		}
 		wma_add_sta_req_ap_mode(wma, add_sta);
 		break;
 	case BSS_OPERATIONAL_MODE_NDI:
@@ -5907,7 +5923,13 @@
 
 	case BSS_OPERATIONAL_MODE_IBSS: /* IBSS shares AP code */
 	case BSS_OPERATIONAL_MODE_AP:
-		htc_vote_link_down(htc_handle);
+		if (qdf_is_drv_connected()) {
+			wma_debug("drv wow enabled allow runtime pm");
+			wma_sap_allow_runtime_pm(wma);
+		} else {
+			wma_debug("drv wow disabled vote for link down");
+			htc_vote_link_down(htc_handle);
+		}
 		wma_delete_sta_req_ap_mode(wma, del_sta);
 		/* free the memory here only if sync feature is not enabled */
 		if (!rsp_requested &&
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index 806b346..9c0db99 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -3599,6 +3599,7 @@
 	qdf_wake_lock_create(&wma_handle->wmi_cmd_rsp_wake_lock,
 					"wlan_fw_rsp_wakelock");
 	qdf_runtime_lock_init(&wma_handle->wmi_cmd_rsp_runtime_lock);
+	qdf_runtime_lock_init(&wma_handle->sap_prevent_runtime_pm_lock);
 
 	/* Register peer assoc conf event handler */
 	wmi_unified_register_event_handler(wma_handle->wmi_handle,
@@ -3698,6 +3699,7 @@
 
 err_dbglog_init:
 	qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
+	qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
 	qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
 	qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
 	qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);
@@ -4773,6 +4775,7 @@
 	wma_cleanup_vdev_resp_queue(wma_handle);
 	wma_cleanup_hold_req(wma_handle);
 	qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock);
+	qdf_runtime_lock_deinit(&wma_handle->sap_prevent_runtime_pm_lock);
 	qdf_runtime_lock_deinit(&wma_handle->wmi_cmd_rsp_runtime_lock);
 	qdf_spinlock_destroy(&wma_handle->vdev_respq_lock);
 	qdf_spinlock_destroy(&wma_handle->wma_hold_req_q_lock);