diff --git a/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c b/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c index 685e2c2658..2e1dec8a07 100644 --- a/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c +++ b/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c @@ -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"); diff --git a/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo_i.h b/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo_i.h index be59121af3..7d734feeaa 100644 --- a/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo_i.h +++ b/umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo_i.h @@ -93,6 +93,8 @@ * @host_target_shared_snapshot_info: Array of meta information related to * snapshots(for snapshots shared between host and target) * @filter: MGMT Rx REO filter + * @init_complete: Flag to indicate initialization completion of the + * mgmt_rx_reo_pdev_info object */ struct mgmt_rx_reo_pdev_info { struct mgmt_rx_reo_snapshot_params host_snapshot; @@ -105,6 +107,7 @@ struct mgmt_rx_reo_pdev_info { [MGMT_RX_REO_SHARED_SNAPSHOT_MAX] [MGMT_RX_REO_SNAPSHOT_READ_RETRY_LIMIT] [MGMT_RX_REO_SNAPSHOT_B2B_READ_SWAR_RETRY_LIMIT]; + bool init_complete; }; /**