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

qcacmn: Add handlers for FW consumed and Host dropped MGMT frames

Consider the management frames that are consumed/dropped in the FW and also
the frames that are received at the Host but dropped in lower layers.
The host has the MGMT Rx REO parameters about these frames via WMI events.

There could be frames waiting in the MGMT Rx REO list for the above-said
frames. If we update the waiting frames with the MGMT Rx REO parameters of
the above-said frames, the waiting frames could be released and sent for
processing. Add the logic for the same.

Change-Id: I6be4577d30c4aefe2e964aefbb56472749a90cb4
CRs-Fixed: 2987941
Shiva Krishna Pittala 4 жил өмнө
parent
commit
01c079b17b

+ 29 - 0
target_if/mgmt_txrx/inc/target_if_mgmt_txrx_rx_reo.h

@@ -102,6 +102,18 @@ QDF_STATUS
 target_if_mgmt_rx_reo_extract_reo_params(wmi_unified_t wmi_handle,
 					 void *evt_buf,
 					 struct mgmt_rx_event_params *params);
+/**
+ * target_if_mgmt_rx_reo_host_drop_handler() - MGMT Rx REO handler for the
+ * management Rx frames that gets dropped in the Host before entering
+ * MGMT Rx REO algorithm
+ * @pdev: pdev for which this frame was intended
+ * @params: MGMT Rx event parameters
+ *
+ * Return: QDF_STATUS of operation
+ */
+QDF_STATUS
+target_if_mgmt_rx_reo_host_drop_handler(struct wlan_objmgr_pdev *pdev,
+					struct mgmt_rx_event_params *params);
 #else
 /**
  * target_if_mgmt_rx_reo_register_event_handlers() - Register management
@@ -159,5 +171,22 @@ target_if_mgmt_rx_reo_extract_reo_params(wmi_unified_t wmi_handle,
 {
 	return QDF_STATUS_SUCCESS;
 }
+
+/**
+ * target_if_mgmt_rx_reo_host_drop_handler() - MGMT Rx REO handler for the
+ * management Rx frames that gets dropped in the Host before entering
+ * MGMT Rx REO algorithm
+ * @pdev: pdev for which this frame was intended
+ * @params: MGMT Rx event parameters
+ *
+ * Return: QDF_STATUS of operation
+ */
+static inline QDF_STATUS
+target_if_mgmt_rx_reo_host_drop_handler(struct wlan_objmgr_pdev *pdev,
+					struct mgmt_rx_event_params *params)
+{
+	/* Nothing to do when REO is compiled off */
+	return QDF_STATUS_SUCCESS;
+}
 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
 #endif /* _TARGET_IF_MGMT_TXRX_RX_REO_H_ */

+ 40 - 1
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -20,6 +20,7 @@
  */
 
 #include <wlan_objmgr_psoc_obj.h>
+#include <wlan_objmgr_pdev_obj.h>
 #include <qdf_status.h>
 #include <target_if.h>
 #include <wlan_mgmt_txrx_rx_reo_public_structs.h>
@@ -41,6 +42,7 @@ target_if_mgmt_rx_reo_fw_consumed_event_handler(
 	ol_scn_t scn, uint8_t *data, uint32_t datalen)
 {
 	struct wlan_objmgr_psoc *psoc;
+	struct wlan_objmgr_pdev *pdev;
 	struct wmi_unified *wmi_handle;
 	QDF_STATUS status;
 	struct mgmt_rx_reo_params params;
@@ -75,12 +77,23 @@ target_if_mgmt_rx_reo_fw_consumed_event_handler(
 		return -EINVAL;
 	}
 
-	status = mgmt_rx_reo_rx_ops->fw_consumed_event_handler(psoc, &params);
+	/* Take the pdev reference */
+	pdev = wlan_objmgr_get_pdev_by_id(psoc, params.pdev_id,
+					  WLAN_MGMT_SB_ID);
+	if (!pdev) {
+		mgmt_rx_reo_err("Couldn't get pdev for pdev_id: %d"
+				"on psoc: %pK", params.pdev_id, psoc);
+		return -EINVAL;
+	}
+
+	status = mgmt_rx_reo_rx_ops->fw_consumed_event_handler(pdev, &params);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mgmt_rx_reo_err("FW consumed event handling failed");
+		wlan_objmgr_pdev_release_ref(pdev, WLAN_MGMT_SB_ID);
 		return -EINVAL;
 	}
 
+	wlan_objmgr_pdev_release_ref(pdev, WLAN_MGMT_SB_ID);
 	return 0;
 }
 
@@ -324,3 +337,29 @@ target_if_mgmt_rx_reo_tx_ops_register(
 
 	return QDF_STATUS_SUCCESS;
 }
+
+QDF_STATUS
+target_if_mgmt_rx_reo_host_drop_handler(struct wlan_objmgr_pdev *pdev,
+					struct mgmt_rx_event_params *params)
+{
+	struct wlan_lmac_if_mgmt_rx_reo_rx_ops *mgmt_rx_reo_rx_ops;
+
+	if (!pdev) {
+		mgmt_rx_reo_err("pdev is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!params) {
+		mgmt_rx_reo_err("mgmt rx event params are null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	mgmt_rx_reo_rx_ops = target_if_mgmt_rx_reo_get_rx_ops(
+					wlan_pdev_get_psoc(pdev));
+	if (!mgmt_rx_reo_rx_ops) {
+		mgmt_rx_reo_err("rx_ops of MGMT Rx REO module is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	return mgmt_rx_reo_rx_ops->host_drop_handler(pdev, params->reo_params);
+}

+ 16 - 2
umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_rx_reo_tgt_api.h

@@ -87,16 +87,17 @@ tgt_mgmt_rx_reo_read_snapshot(
 			struct mgmt_rx_reo_snapshot *address,
 			enum mgmt_rx_reo_shared_snapshot_id id,
 			struct mgmt_rx_reo_snapshot_params *value);
+
 /**
  * tgt_mgmt_rx_reo_fw_consumed_event_handler() - MGMT Rx REO FW consumed
  * event handler
- * @psoc: Pointer to psoc objmgr
+ * @pdev: pdev for which this event is intended
  * @params: Pointer to MGMT Rx REO parameters
  *
  * Return: QDF_STATUS of operation
  */
 QDF_STATUS
-tgt_mgmt_rx_reo_fw_consumed_event_handler(struct wlan_objmgr_psoc *psoc,
+tgt_mgmt_rx_reo_fw_consumed_event_handler(struct wlan_objmgr_pdev *pdev,
 					  struct mgmt_rx_reo_params *params);
 
 /**
@@ -137,6 +138,19 @@ QDF_STATUS tgt_mgmt_rx_reo_frame_handler(
 			struct wlan_objmgr_pdev *pdev,
 			qdf_nbuf_t buf,
 			struct mgmt_rx_event_params *mgmt_rx_params);
+
+/**
+ * tgt_mgmt_rx_reo_host_drop_handler() - MGMT Rx REO handler for the
+ * management Rx frames that gets dropped in the Host before entering
+ * MGMT Rx REO algorithm
+ * @pdev: pdev for which this frame was intended
+ * @params: MGMT Rx event parameters
+ *
+ * Return: QDF_STATUS of operation
+ */
+QDF_STATUS
+tgt_mgmt_rx_reo_host_drop_handler(struct wlan_objmgr_pdev *pdev,
+				  struct mgmt_rx_reo_params *params);
 #else
 /**
  * tgt_mgmt_rx_reo_frame_handler() - REO handler for management Rx frames.

+ 61 - 2
umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_rx_reo_tgt_api.c

@@ -45,11 +45,70 @@ tgt_mgmt_rx_reo_read_snapshot(
 	return mgmt_rx_reo_txops->read_mgmt_rx_reo_snapshot(address, id, value);
 }
 
+/**
+ * tgt_mgmt_rx_reo_enter_algo_without_buffer() - Entry point to the MGMT Rx REO
+ * algorithm when there is no frame buffer
+ * @pdev: pdev for which this frame/event is intended
+ * @reo_params: MGMT Rx REO parameters corresponding to this frame/event
+ * @type: Type of the MGMT Rx REO frame/event descriptor
+ *
+ * Return: QDF_STATUS of operation
+ */
+static QDF_STATUS
+tgt_mgmt_rx_reo_enter_algo_without_buffer(
+				struct wlan_objmgr_pdev *pdev,
+				struct mgmt_rx_reo_params *reo_params,
+				enum mgmt_rx_reo_frame_descriptor_type type)
+{
+	struct mgmt_rx_event_params mgmt_rx_params;
+	struct mgmt_rx_reo_frame_descriptor desc;
+	bool is_frm_queued;
+	QDF_STATUS status;
+
+	if (!pdev) {
+		mgmt_rx_reo_err("pdev is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	if (!reo_params) {
+		mgmt_rx_reo_err("mgmt rx reo params are null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	mgmt_rx_params.reo_params = reo_params;
+
+	desc.nbuf = NULL; /* No frame buffer */
+	desc.rx_params = &mgmt_rx_params;
+	desc.type = type;
+
+	/** If REO is not required for this descriptor,
+	 *  no need to proceed further
+	 */
+	if (!is_mgmt_rx_reo_required(pdev, &desc))
+		return  QDF_STATUS_SUCCESS;
+
+	/* Enter the REO algorithm */
+	status = wlan_mgmt_rx_reo_algo_entry(pdev, &desc, &is_frm_queued);
+
+	qdf_assert_always(!is_frm_queued);
+
+	return status;
+}
+
 QDF_STATUS
-tgt_mgmt_rx_reo_fw_consumed_event_handler(struct wlan_objmgr_psoc *psoc,
+tgt_mgmt_rx_reo_fw_consumed_event_handler(struct wlan_objmgr_pdev *pdev,
 					  struct mgmt_rx_reo_params *params)
 {
-	return QDF_STATUS_SUCCESS;
+	return tgt_mgmt_rx_reo_enter_algo_without_buffer(
+			pdev, params, MGMT_RX_REO_FRAME_DESC_FW_CONSUMED_FRAME);
+}
+
+QDF_STATUS
+tgt_mgmt_rx_reo_host_drop_handler(struct wlan_objmgr_pdev *pdev,
+				  struct mgmt_rx_reo_params *params)
+{
+	return tgt_mgmt_rx_reo_enter_algo_without_buffer(
+			pdev, params, MGMT_RX_REO_FRAME_DESC_ERROR_FRAME);
 }
 
 QDF_STATUS tgt_mgmt_rx_reo_filter_config(struct wlan_objmgr_pdev *pdev,

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

@@ -238,10 +238,15 @@ struct wlan_lmac_if_mgmt_rx_reo_tx_ops {
  * struct wlan_lmac_if_mgmt_txrx_rx_ops - structure of rx function
  * pointers for mgmt rx reo module
  * @fw_consumed_event_handler: FW consumed event handler
+ * @host_drop_handler: Handler for the frames that gets dropped in Host before
+ * entering REO algorithm
  */
 struct wlan_lmac_if_mgmt_rx_reo_rx_ops {
 	QDF_STATUS (*fw_consumed_event_handler)(
-			struct wlan_objmgr_psoc *psoc,
+			struct wlan_objmgr_pdev *pdev,
+			struct mgmt_rx_reo_params *params);
+	QDF_STATUS (*host_drop_handler)(
+			struct wlan_objmgr_pdev *pdev,
 			struct mgmt_rx_reo_params *params);
 };
 #endif

+ 2 - 0
umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c

@@ -580,6 +580,8 @@ wlan_lmac_if_mgmt_rx_reo_rx_ops_register(
 	mgmt_rx_reo_rx_ops = &mgmt_txrx_rx_ops->mgmt_rx_reo_rx_ops;
 	mgmt_rx_reo_rx_ops->fw_consumed_event_handler =
 			tgt_mgmt_rx_reo_fw_consumed_event_handler;
+	mgmt_rx_reo_rx_ops->host_drop_handler =
+			tgt_mgmt_rx_reo_host_drop_handler;
 
 	return QDF_STATUS_SUCCESS;
 }