|
@@ -1022,6 +1022,13 @@ wlan_mgmt_rx_reo_algo_calculate_wait_count(
|
|
|
pdev = wlan_get_pdev_from_mlo_link_id(link,
|
|
|
WLAN_MGMT_RX_REO_ID);
|
|
|
|
|
|
+ /* No need to wait for any frames if the pdev is not found */
|
|
|
+ if (!pdev) {
|
|
|
+ mgmt_rx_reo_debug("pdev is null for link %d", link);
|
|
|
+ frames_pending = 0;
|
|
|
+ goto update_pending_frames;
|
|
|
+ }
|
|
|
+
|
|
|
rx_reo_pdev_ctx = wlan_mgmt_rx_reo_get_priv_object(pdev);
|
|
|
if (!rx_reo_pdev_ctx) {
|
|
|
mgmt_rx_reo_err("Mgmt reo context empty for pdev %pK",
|
|
@@ -1030,6 +1037,14 @@ wlan_mgmt_rx_reo_algo_calculate_wait_count(
|
|
|
return QDF_STATUS_E_FAILURE;
|
|
|
}
|
|
|
|
|
|
+ if (!rx_reo_pdev_ctx->init_complete) {
|
|
|
+ mgmt_rx_reo_debug("REO init in progress for link %d",
|
|
|
+ link);
|
|
|
+ wlan_objmgr_pdev_release_ref(pdev, WLAN_MGMT_RX_REO_ID);
|
|
|
+ frames_pending = 0;
|
|
|
+ goto update_pending_frames;
|
|
|
+ }
|
|
|
+
|
|
|
host_ss = &rx_reo_pdev_ctx->host_snapshot;
|
|
|
desc->host_snapshot[link] = rx_reo_pdev_ctx->host_snapshot;
|
|
|
|
|
@@ -5130,6 +5145,52 @@ mgmt_rx_reo_initialize_snapshot_value(struct wlan_objmgr_pdev *pdev)
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * mgmt_rx_reo_set_initialization_complete() - Set initialization completion
|
|
|
+ * for management Rx REO pdev component private object
|
|
|
+ * @pdev: pointer to pdev object
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+mgmt_rx_reo_set_initialization_complete(struct wlan_objmgr_pdev *pdev)
|
|
|
+{
|
|
|
+ struct mgmt_rx_reo_pdev_info *mgmt_rx_reo_pdev_ctx;
|
|
|
+
|
|
|
+ mgmt_rx_reo_pdev_ctx = wlan_mgmt_rx_reo_get_priv_object(pdev);
|
|
|
+ if (!mgmt_rx_reo_pdev_ctx) {
|
|
|
+ mgmt_rx_reo_err("Mgmt Rx REO priv object is null");
|
|
|
+ return QDF_STATUS_E_NULL_VALUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_rx_reo_pdev_ctx->init_complete = true;
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * mgmt_rx_reo_clear_initialization_complete() - Clear initialization completion
|
|
|
+ * for management Rx REO pdev component private object
|
|
|
+ * @pdev: pointer to pdev object
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+mgmt_rx_reo_clear_initialization_complete(struct wlan_objmgr_pdev *pdev)
|
|
|
+{
|
|
|
+ struct mgmt_rx_reo_pdev_info *mgmt_rx_reo_pdev_ctx;
|
|
|
+
|
|
|
+ mgmt_rx_reo_pdev_ctx = wlan_mgmt_rx_reo_get_priv_object(pdev);
|
|
|
+ if (!mgmt_rx_reo_pdev_ctx) {
|
|
|
+ mgmt_rx_reo_err("Mgmt Rx REO priv object is null");
|
|
|
+ return QDF_STATUS_E_NULL_VALUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ mgmt_rx_reo_pdev_ctx->init_complete = false;
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* mgmt_rx_reo_initialize_snapshots() - Initialize management Rx reorder
|
|
|
* snapshot related data structures for a given pdev
|
|
@@ -5192,6 +5253,12 @@ mgmt_rx_reo_attach(struct wlan_objmgr_pdev *pdev)
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+ status = mgmt_rx_reo_set_initialization_complete(pdev);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ mgmt_rx_reo_err("Failed to set initialization complete");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
@@ -5203,6 +5270,12 @@ mgmt_rx_reo_detach(struct wlan_objmgr_pdev *pdev)
|
|
|
if (!wlan_mgmt_rx_reo_is_feature_enabled_at_pdev(pdev))
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
|
|
|
+ status = mgmt_rx_reo_clear_initialization_complete(pdev);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ mgmt_rx_reo_err("Failed to clear initialization complete");
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
status = mgmt_rx_reo_clear_snapshots(pdev);
|
|
|
if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
mgmt_rx_reo_err("Failed to clear mgmt Rx REO snapshots");
|