Эх сурвалжийг харах

qcacmn: Add target if APIs to schedule/cancel delivery of frames

Add target if APIs to schedule/cancel the delivery of management
frames..

CRs-Fixed: 3408279
Change-Id: I2063541648f3257994909fed63ce171fdc97b784
Edayilliam Jayadev 2 жил өмнө
parent
commit
f4f7014f11

+ 10 - 1
target_if/mgmt_txrx/inc/target_if_mgmt_txrx_rx_reo.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -129,6 +129,15 @@ target_if_mgmt_rx_reo_extract_reo_params(wmi_unified_t wmi_handle,
 QDF_STATUS
 target_if_mgmt_rx_reo_host_drop_handler(struct wlan_objmgr_pdev *pdev,
 					struct mgmt_rx_event_params *params);
+
+/**
+ * target_if_mgmt_rx_reo_release_frames() - API to release the management
+ * frames of a given psoc
+ * @arg: Pointer to void * argument
+ *
+ * Return: void
+ */
+void target_if_mgmt_rx_reo_release_frames(void *arg);
 #else
 /**
  * target_if_mgmt_rx_reo_register_event_handlers() - Register management

+ 86 - 0
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -606,6 +606,62 @@ target_if_mgmt_rx_reo_extract_reo_params(
 					      params->reo_params);
 }
 
+/**
+ * target_if_mgmt_rx_reo_schedule_delivery() - Schedule the delivery of
+ * management frames of the given psoc
+ * @soc: Pointer to psoc object
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+target_if_mgmt_rx_reo_schedule_delivery(struct wlan_objmgr_psoc *psoc)
+{
+	struct hif_opaque_softc *hif_handle;
+	struct wmi_unified *wmi_handle;
+
+	hif_handle = lmac_get_hif_hdl(psoc);
+	if (!hif_handle) {
+		mgmt_rx_reo_err("HIF handle is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
+	if (!wmi_handle) {
+		mgmt_rx_reo_err("wmi_handle is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * target_if_mgmt_rx_reo_cancel_scheduled_delivery() - Cancel the scheduled
+ * delivery of management frames of the given psoc
+ * @soc: Pointer to psoc object
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+target_if_mgmt_rx_reo_cancel_scheduled_delivery(struct wlan_objmgr_psoc *psoc)
+{
+	struct hif_opaque_softc *hif_handle;
+	struct wmi_unified *wmi_handle;
+
+	hif_handle = lmac_get_hif_hdl(psoc);
+	if (!hif_handle) {
+		mgmt_rx_reo_err("HIF handle is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
+	if (!wmi_handle) {
+		mgmt_rx_reo_err("wmi_handle is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS
 target_if_mgmt_rx_reo_tx_ops_register(
 			struct wlan_lmac_if_mgmt_txrx_tx_ops *mgmt_txrx_tx_ops)
@@ -627,6 +683,10 @@ target_if_mgmt_rx_reo_tx_ops_register(
 				target_if_mgmt_rx_reo_get_snapshot_info;
 	mgmt_rx_reo_tx_ops->mgmt_rx_reo_filter_config =
 					target_if_mgmt_rx_reo_filter_config;
+	mgmt_rx_reo_tx_ops->schedule_delivery =
+				target_if_mgmt_rx_reo_schedule_delivery;
+	mgmt_rx_reo_tx_ops->cancel_scheduled_delivery =
+				target_if_mgmt_rx_reo_cancel_scheduled_delivery;
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -656,3 +716,29 @@ target_if_mgmt_rx_reo_host_drop_handler(struct wlan_objmgr_pdev *pdev,
 
 	return mgmt_rx_reo_rx_ops->host_drop_handler(pdev, params->reo_params);
 }
+
+void target_if_mgmt_rx_reo_release_frames(void *arg)
+{
+	ol_scn_t scn = arg;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_lmac_if_mgmt_rx_reo_rx_ops *mgmt_rx_reo_rx_ops;
+	QDF_STATUS status;
+
+	psoc = target_if_get_psoc_from_scn_hdl(scn);
+	if (!psoc) {
+		mgmt_rx_reo_err("null psoc");
+		return;
+	}
+
+	mgmt_rx_reo_rx_ops = target_if_mgmt_rx_reo_get_rx_ops(psoc);
+	if (!mgmt_rx_reo_rx_ops) {
+		mgmt_rx_reo_err("rx_ops of MGMT Rx REO module is NULL");
+		return;
+	}
+
+	status = mgmt_rx_reo_rx_ops->release_frames(psoc);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mgmt_rx_reo_err("Failed to release entries, ret = %d", status);
+		return;
+	}
+}

+ 6 - 0
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -317,6 +317,8 @@ struct wlan_lmac_if_mgmt_rx_reo_low_level_ops {
  * @read_mgmt_rx_reo_snapshot: Read rx-reorder snapshots
  * @get_mgmt_rx_reo_snapshot_info: Get rx-reorder snapshot info
  * @mgmt_rx_reo_filter_config:  Configure MGMT Rx REO filter
+ * @schedule_delivery: Schedule delivery of management frames
+ * @cancel_scheduled_delivery: Cancel schedule delivery of management frames
  * @low_level_ops:  Low level operations of MGMT Rx REO module
  */
 struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
@@ -338,6 +340,8 @@ struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
 	QDF_STATUS (*mgmt_rx_reo_filter_config)(
 					struct wlan_objmgr_pdev *pdev,
 					struct mgmt_rx_reo_filter *filter);
+	QDF_STATUS (*schedule_delivery)(struct wlan_objmgr_psoc *psoc);
+	QDF_STATUS (*cancel_scheduled_delivery)(struct wlan_objmgr_psoc *psoc);
 	struct wlan_lmac_if_mgmt_rx_reo_low_level_ops low_level_ops;
 };
 
@@ -347,6 +351,7 @@ struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
  * @fw_consumed_event_handler: FW consumed event handler
  * @host_drop_handler: Handler for the frames that gets dropped in Host before
  * entering REO algorithm
+ * @release_frames: Release management frames
  */
 struct wlan_lmac_if_mgmt_rx_reo_rx_ops {
 	QDF_STATUS (*fw_consumed_event_handler)(
@@ -355,6 +360,7 @@ struct wlan_lmac_if_mgmt_rx_reo_rx_ops {
 	QDF_STATUS (*host_drop_handler)(
 			struct wlan_objmgr_pdev *pdev,
 			struct mgmt_rx_reo_params *params);
+	QDF_STATUS (*release_frames)(struct wlan_objmgr_psoc *psoc);
 };
 #endif