qcacmn: Add support for DataStall Events

Register and de-register DataStall callback which posts
DataStall Events.

Change-Id: I078e34b0d476c350f175b797fd54a79789ca56f5
CRs-Fixed: 2561193
diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c
index 74407cc..1cc9660 100644
--- a/dp/wifi3.0/dp_main.c
+++ b/dp/wifi3.0/dp_main.c
@@ -9555,6 +9555,105 @@
 	return tx_success;
 }
 
+#ifdef WLAN_SUPPORT_DATA_STALL
+/**
+ * dp_register_data_stall_detect_cb() - register data stall callback
+ * @soc_hdl: Datapath soc handle
+ * @pdev_id: id of data path pdev handle
+ * @data_stall_detect_callback: data stall callback function
+ *
+ * Return: QDF_STATUS Enumeration
+ */
+static
+QDF_STATUS dp_register_data_stall_detect_cb(
+			struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
+			data_stall_detect_cb data_stall_detect_callback)
+{
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
+	struct dp_pdev *pdev;
+
+	pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
+	if (!pdev) {
+		dp_err("pdev NULL!");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	pdev->data_stall_detect_callback = data_stall_detect_callback;
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * dp_deregister_data_stall_detect_cb() - de-register data stall callback
+ * @soc_hdl: Datapath soc handle
+ * @pdev_id: id of data path pdev handle
+ * @data_stall_detect_callback: data stall callback function
+ *
+ * Return: QDF_STATUS Enumeration
+ */
+static
+QDF_STATUS dp_deregister_data_stall_detect_cb(
+			struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
+			data_stall_detect_cb data_stall_detect_callback)
+{
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
+	struct dp_pdev *pdev;
+
+	pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
+	if (!pdev) {
+		dp_err("pdev NULL!");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	pdev->data_stall_detect_callback = NULL;
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * dp_txrx_post_data_stall_event() - post data stall event
+ * @soc_hdl: Datapath soc handle
+ * @indicator: Module triggering data stall
+ * @data_stall_type: data stall event type
+ * @pdev_id: pdev id
+ * @vdev_id_bitmap: vdev id bitmap
+ * @recovery_type: data stall recovery type
+ *
+ * Return: None
+ */
+static void
+dp_txrx_post_data_stall_event(struct cdp_soc_t *soc_hdl,
+			      enum data_stall_log_event_indicator indicator,
+			      enum data_stall_log_event_type data_stall_type,
+			      uint32_t pdev_id, uint32_t vdev_id_bitmap,
+			      enum data_stall_log_recovery_type recovery_type)
+{
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
+	struct data_stall_event_info data_stall_info;
+	struct dp_pdev *pdev;
+
+	pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
+	if (!pdev) {
+		dp_err("pdev NULL!");
+		return;
+	}
+
+	if (!pdev->data_stall_detect_callback) {
+		dp_err("data stall cb not registered!");
+		return;
+	}
+
+	dp_info("data_stall_type: %x pdev_id: %d",
+		data_stall_type, pdev_id);
+
+	data_stall_info.indicator = indicator;
+	data_stall_info.data_stall_type = data_stall_type;
+	data_stall_info.vdev_id_bitmap = vdev_id_bitmap;
+	data_stall_info.pdev_id = pdev_id;
+	data_stall_info.recovery_type = recovery_type;
+
+	pdev->data_stall_detect_callback(&data_stall_info);
+}
+#endif /* WLAN_SUPPORT_DATA_STALL */
+
 #ifdef DP_PEER_EXTENDED_API
 static struct cdp_misc_ops dp_ops_misc = {
 #ifdef FEATURE_WLAN_TDLS
@@ -9569,6 +9668,11 @@
 	.pkt_log_con_service = dp_pkt_log_con_service,
 	.get_num_rx_contexts = dp_get_num_rx_contexts,
 	.get_tx_ack_stats = dp_tx_get_success_ack_stats,
+#ifdef WLAN_SUPPORT_DATA_STALL
+	.txrx_data_stall_cb_register = dp_register_data_stall_detect_cb,
+	.txrx_data_stall_cb_deregister = dp_deregister_data_stall_detect_cb,
+	.txrx_post_data_stall_event = dp_txrx_post_data_stall_event,
+#endif
 };
 #endif
 
diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h
index 25466e8..068bdd0 100644
--- a/dp/wifi3.0/dp_types.h
+++ b/dp/wifi3.0/dp_types.h
@@ -1738,6 +1738,10 @@
 	/* TSO Id to index into TSO packet information */
 	qdf_atomic_t tso_idx;
 #endif /* FEATURE_TSO_STATS */
+
+#ifdef WLAN_SUPPORT_DATA_STALL
+	data_stall_detect_cb data_stall_detect_callback;
+#endif /* WLAN_SUPPORT_DATA_STALL */
 };
 
 struct dp_peer;