瀏覽代碼

qcacmn: Cleanup assert in mgmt rx reo - Part 6

Cleanup asserts in management Rx reorder module.

Change-Id: Ief86560bab36a59c7e82707a4c0b58ff4ce954a8
CRs-Fixed: 3593933
Edayilliam Jayadev 1 年之前
父節點
當前提交
105a5fc213

+ 9 - 0
qdf/inc/qdf_types.h

@@ -1601,6 +1601,12 @@ enum qdf_suspend_type {
  * suspended
  * suspended
  * @QDF_VDEV_MAC_ADDR_UPDATE_RESPONSE_TIMED_OUT: VDEV MAC address update
  * @QDF_VDEV_MAC_ADDR_UPDATE_RESPONSE_TIMED_OUT: VDEV MAC address update
  * request for Link switch timedout.
  * request for Link switch timedout.
+ * @QDF_MGMT_RX_REO_INCONSISTENT_SNAPSHOT: Inconsistent management Rx reorder
+ * snapshots
+ * @QDF_MGMT_RX_REO_OUT_OF_ORDER_PKT: Reception of management packet with out
+ * of order packet counter values
+ * @QDF_MGMT_RX_REO_ZERO_DURATION_PKT: Reception of management packet with zero
+ * packet duration
  */
  */
 enum qdf_hang_reason {
 enum qdf_hang_reason {
 	QDF_REASON_UNSPECIFIED,
 	QDF_REASON_UNSPECIFIED,
@@ -1639,6 +1645,9 @@ enum qdf_hang_reason {
 	QDF_FLUSH_LOGS,
 	QDF_FLUSH_LOGS,
 	QDF_WMI_CMD_SENT_DURING_SUSPEND,
 	QDF_WMI_CMD_SENT_DURING_SUSPEND,
 	QDF_VDEV_MAC_ADDR_UPDATE_RESPONSE_TIMED_OUT,
 	QDF_VDEV_MAC_ADDR_UPDATE_RESPONSE_TIMED_OUT,
+	QDF_MGMT_RX_REO_INCONSISTENT_SNAPSHOT,
+	QDF_MGMT_RX_REO_OUT_OF_ORDER_PKT,
+	QDF_MGMT_RX_REO_ZERO_DURATION_PKT,
 };
 };
 
 
 /**
 /**

+ 19 - 5
target_if/mgmt_txrx/src/target_if_mgmt_txrx_rx_reo.c

@@ -29,6 +29,7 @@
 #include <wlan_lmac_if_api.h>
 #include <wlan_lmac_if_api.h>
 #include <init_deinit_lmac.h>
 #include <init_deinit_lmac.h>
 #include <wlan_mlo_mgr_setup.h>
 #include <wlan_mlo_mgr_setup.h>
+#include <qdf_platform.h>
 
 
 /**
 /**
  * target_if_mgmt_rx_reo_fw_consumed_event_handler() - WMI event handler to
  * target_if_mgmt_rx_reo_fw_consumed_event_handler() - WMI event handler to
@@ -280,6 +281,7 @@ target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
 /**
 /**
  * target_if_mgmt_rx_reo_read_snapshot_raw() - Read raw value of management
  * target_if_mgmt_rx_reo_read_snapshot_raw() - Read raw value of management
  * rx-reorder snapshot
  * rx-reorder snapshot
+ * @pdev: pointer to pdev object
  * @snapshot_address: snapshot address
  * @snapshot_address: snapshot address
  * @mgmt_rx_reo_snapshot_low: Pointer to lower 32 bits of snapshot value
  * @mgmt_rx_reo_snapshot_low: Pointer to lower 32 bits of snapshot value
  * @mgmt_rx_reo_snapshot_high: Pointer to higher 32 bits of snapshot value
  * @mgmt_rx_reo_snapshot_high: Pointer to higher 32 bits of snapshot value
@@ -292,7 +294,8 @@ target_if_mgmt_rx_reo_get_valid_hw_link_bitmap(struct wlan_objmgr_psoc *psoc,
  */
  */
 static QDF_STATUS
 static QDF_STATUS
 target_if_mgmt_rx_reo_read_snapshot_raw
 target_if_mgmt_rx_reo_read_snapshot_raw
-			(struct mgmt_rx_reo_shared_snapshot *snapshot_address,
+			(struct wlan_objmgr_pdev *pdev,
+			 struct mgmt_rx_reo_shared_snapshot *snapshot_address,
 			 uint32_t *mgmt_rx_reo_snapshot_low,
 			 uint32_t *mgmt_rx_reo_snapshot_low,
 			 uint32_t *mgmt_rx_reo_snapshot_high,
 			 uint32_t *mgmt_rx_reo_snapshot_high,
 			 uint8_t snapshot_version,
 			 uint8_t snapshot_version,
@@ -343,8 +346,14 @@ target_if_mgmt_rx_reo_read_snapshot_raw
 		prev_snapshot_high = cur_snapshot_high;
 		prev_snapshot_high = cur_snapshot_high;
 	}
 	}
 
 
-	qdf_assert_always(retry_count !=
-			  (MGMT_RX_REO_SNAPSHOT_B2B_READ_SWAR_RETRY_LIMIT - 1));
+	if (retry_count ==
+	    (MGMT_RX_REO_SNAPSHOT_B2B_READ_SWAR_RETRY_LIMIT - 1)) {
+		enum qdf_hang_reason reason;
+
+		reason = QDF_MGMT_RX_REO_INCONSISTENT_SNAPSHOT;
+		mgmt_rx_reo_err("Triggering self recovery, inconsistent SS");
+		qdf_trigger_self_recovery(wlan_pdev_get_psoc(pdev), reason);
+	}
 
 
 	*mgmt_rx_reo_snapshot_low = cur_snapshot_low;
 	*mgmt_rx_reo_snapshot_low = cur_snapshot_low;
 	*mgmt_rx_reo_snapshot_high = cur_snapshot_high;
 	*mgmt_rx_reo_snapshot_high = cur_snapshot_high;
@@ -426,7 +435,7 @@ target_if_mgmt_rx_reo_read_snapshot(
 		for (; retry_count < MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT;
 		for (; retry_count < MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT;
 		     retry_count++) {
 		     retry_count++) {
 			status = target_if_mgmt_rx_reo_read_snapshot_raw
 			status = target_if_mgmt_rx_reo_read_snapshot_raw
-					(snapshot_address,
+					(pdev, snapshot_address,
 					 &mgmt_rx_reo_snapshot_low,
 					 &mgmt_rx_reo_snapshot_low,
 					 &mgmt_rx_reo_snapshot_high,
 					 &mgmt_rx_reo_snapshot_high,
 					 snapshot_version,
 					 snapshot_version,
@@ -481,13 +490,18 @@ target_if_mgmt_rx_reo_read_snapshot(
 		}
 		}
 
 
 		if (retry_count == MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT) {
 		if (retry_count == MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT) {
+			enum qdf_hang_reason reason;
+
 			mgmt_rx_reo_err("Read retry limit, id = %d, ver = %u",
 			mgmt_rx_reo_err("Read retry limit, id = %d, ver = %u",
 					id, snapshot_version);
 					id, snapshot_version);
 			snapshot_value->valid = false;
 			snapshot_value->valid = false;
 			snapshot_value->mgmt_pkt_ctr = 0xFFFF;
 			snapshot_value->mgmt_pkt_ctr = 0xFFFF;
 			snapshot_value->global_timestamp = 0xFFFFFFFF;
 			snapshot_value->global_timestamp = 0xFFFFFFFF;
 			snapshot_value->retry_count = retry_count;
 			snapshot_value->retry_count = retry_count;
-			qdf_assert_always(0);
+			reason = QDF_MGMT_RX_REO_INCONSISTENT_SNAPSHOT;
+			mgmt_rx_reo_err("Triggering self recovery, retry fail");
+			qdf_trigger_self_recovery(wlan_pdev_get_psoc(pdev),
+						  reason);
 			return QDF_STATUS_E_FAILURE;
 			return QDF_STATUS_E_FAILURE;
 		}
 		}
 
 

+ 18 - 7
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c

@@ -26,6 +26,8 @@
 #include <qdf_util.h>
 #include <qdf_util.h>
 #include <wlan_mlo_mgr_cmn.h>
 #include <wlan_mlo_mgr_cmn.h>
 #include <wlan_mlo_mgr_setup.h>
 #include <wlan_mlo_mgr_setup.h>
+#include <qdf_platform.h>
+#include <qdf_types.h>
 
 
 static struct mgmt_rx_reo_context *g_rx_reo_ctx[WLAN_MAX_MLO_GROUPS];
 static struct mgmt_rx_reo_context *g_rx_reo_ctx[WLAN_MAX_MLO_GROUPS];
 
 
@@ -199,6 +201,7 @@ handle_out_of_order_pkt_ctr(struct mgmt_rx_reo_frame_descriptor *desc,
 
 
 /**
 /**
  * check_and_handle_zero_frame_duration() - Check and handle zero duration error
  * check_and_handle_zero_frame_duration() - Check and handle zero duration error
+ * @pdev: Pointer to pdev object
  * @desc: Pointer to frame descriptor
  * @desc: Pointer to frame descriptor
  *
  *
  * API to check for zero duration management frames. Host will be able to
  * API to check for zero duration management frames. Host will be able to
@@ -208,7 +211,8 @@ handle_out_of_order_pkt_ctr(struct mgmt_rx_reo_frame_descriptor *desc,
  * Return: QDF_STATUS
  * Return: QDF_STATUS
  */
  */
 static QDF_STATUS
 static QDF_STATUS
-check_and_handle_zero_frame_duration(struct mgmt_rx_reo_frame_descriptor *desc)
+check_and_handle_zero_frame_duration(struct wlan_objmgr_pdev *pdev,
+				     struct mgmt_rx_reo_frame_descriptor *desc)
 {
 {
 	struct mgmt_rx_reo_params *reo_params;
 	struct mgmt_rx_reo_params *reo_params;
 
 
@@ -341,6 +345,7 @@ handle_out_of_order_pkt_ctr(struct mgmt_rx_reo_frame_descriptor *desc,
 
 
 /**
 /**
  * check_and_handle_zero_frame_duration() - Check and handle zero duration error
  * check_and_handle_zero_frame_duration() - Check and handle zero duration error
+ * @pdev: Pointer to pdev object
  * @desc: Pointer to frame descriptor
  * @desc: Pointer to frame descriptor
  *
  *
  * API to check for zero duration management frames and assert.
  * API to check for zero duration management frames and assert.
@@ -348,7 +353,8 @@ handle_out_of_order_pkt_ctr(struct mgmt_rx_reo_frame_descriptor *desc,
  * Return: QDF_STATUS
  * Return: QDF_STATUS
  */
  */
 static QDF_STATUS
 static QDF_STATUS
-check_and_handle_zero_frame_duration(struct mgmt_rx_reo_frame_descriptor *desc)
+check_and_handle_zero_frame_duration(struct wlan_objmgr_pdev *pdev,
+				     struct mgmt_rx_reo_frame_descriptor *desc)
 {
 {
 	struct mgmt_rx_reo_params *reo_params;
 	struct mgmt_rx_reo_params *reo_params;
 
 
@@ -374,7 +380,9 @@ check_and_handle_zero_frame_duration(struct mgmt_rx_reo_frame_descriptor *desc)
 				   reo_params->link_id, reo_params->valid,
 				   reo_params->link_id, reo_params->valid,
 				   reo_params->mgmt_pkt_ctr,
 				   reo_params->mgmt_pkt_ctr,
 				   reo_params->global_timestamp);
 				   reo_params->global_timestamp);
-		qdf_assert_always(0);
+		mgmt_rx_reo_err("Triggering self recovery, zero duration pkt");
+		qdf_trigger_self_recovery(wlan_pdev_get_psoc(pdev),
+					  QDF_MGMT_RX_REO_ZERO_DURATION_PKT);
 
 
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;
 	}
 	}
@@ -4307,6 +4315,7 @@ mgmt_rx_reo_egress_list_init(struct mgmt_rx_reo_egress_list *egress_list)
 
 
 /**
 /**
  * check_frame_sanity() - Check the sanity of a given management frame
  * check_frame_sanity() - Check the sanity of a given management frame
+ * @pdev: Pointer to pdev object
  * @desc: Pointer to frame descriptor
  * @desc: Pointer to frame descriptor
  *
  *
  * API to check the sanity of a given management frame. This API checks for the
  * API to check the sanity of a given management frame. This API checks for the
@@ -4318,7 +4327,8 @@ mgmt_rx_reo_egress_list_init(struct mgmt_rx_reo_egress_list *egress_list)
  * Return: QDF_STATUS
  * Return: QDF_STATUS
  */
  */
 static QDF_STATUS
 static QDF_STATUS
-check_frame_sanity(struct mgmt_rx_reo_frame_descriptor *desc)
+check_frame_sanity(struct wlan_objmgr_pdev *pdev,
+		   struct mgmt_rx_reo_frame_descriptor *desc)
 {
 {
 	QDF_STATUS status;
 	QDF_STATUS status;
 
 
@@ -4333,7 +4343,7 @@ check_frame_sanity(struct mgmt_rx_reo_frame_descriptor *desc)
 		return status;
 		return status;
 	}
 	}
 
 
-	status = check_and_handle_zero_frame_duration(desc);
+	status = check_and_handle_zero_frame_duration(pdev, desc);
 	if (QDF_IS_STATUS_ERROR(status)) {
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mgmt_rx_reo_warn_rl("Drop frame with zero duration");
 		mgmt_rx_reo_warn_rl("Drop frame with zero duration");
 		return status;
 		return status;
@@ -4455,7 +4465,8 @@ failure_debug:
 	mgmt_rx_reo_err("Last Pkt valid = %u, pkt_ctr = %u, ts = %u",
 	mgmt_rx_reo_err("Last Pkt valid = %u, pkt_ctr = %u, ts = %u",
 			host_ss->valid, host_ss->mgmt_pkt_ctr,
 			host_ss->valid, host_ss->mgmt_pkt_ctr,
 			host_ss->global_timestamp);
 			host_ss->global_timestamp);
-	qdf_assert_always(0);
+	mgmt_rx_reo_err("Triggering self recovery, out of order pkt");
+	qdf_trigger_self_recovery(psoc, QDF_MGMT_RX_REO_OUT_OF_ORDER_PKT);
 
 
 	return QDF_STATUS_E_FAILURE;
 	return QDF_STATUS_E_FAILURE;
 }
 }
@@ -5353,7 +5364,7 @@ wlan_mgmt_rx_reo_algo_entry(struct wlan_objmgr_pdev *pdev,
 	if (QDF_IS_STATUS_ERROR(ret))
 	if (QDF_IS_STATUS_ERROR(ret))
 		goto failure;
 		goto failure;
 
 
-	ret = check_frame_sanity(desc);
+	ret = check_frame_sanity(pdev, desc);
 	if (QDF_IS_STATUS_ERROR(ret))
 	if (QDF_IS_STATUS_ERROR(ret))
 		goto failure;
 		goto failure;