From d50b45174ef2f74b1bd2fef8233c82a32780b089 Mon Sep 17 00:00:00 2001 From: Ananya Gupta Date: Tue, 2 Aug 2022 13:11:45 +0530 Subject: [PATCH] qcacld-3.0: Drop packets if suspend in progress Currently, there is a race condition where packet gets enqueued when WOW handshake is being done in parallel during bus suspend resulting in assert in FW as Tx is aborted when WOW command is received in FW. To fix this, suspend DP tx path before suspend sequence starts which will drop tx packets. Change-Id: I38a6a6bdf9858f627205f75f75f351f7debbb7f7 CRs-Fixed: 3227752 --- components/dp/core/inc/wlan_dp_priv.h | 2 +- .../dp/core/src/wlan_dp_bus_bandwidth.c | 2 +- components/dp/core/src/wlan_dp_nud_tracking.c | 2 +- components/dp/core/src/wlan_dp_txrx.c | 2 +- .../dp/dispatcher/src/wlan_dp_ucfg_api.c | 26 +++++++++---------- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/components/dp/core/inc/wlan_dp_priv.h b/components/dp/core/inc/wlan_dp_priv.h index a8b51ad2e6..317ac417dc 100644 --- a/components/dp/core/inc/wlan_dp_priv.h +++ b/components/dp/core/inc/wlan_dp_priv.h @@ -386,7 +386,7 @@ struct wlan_dp_psoc_context { uint64_t no_rx_offload_pkt_cnt; uint64_t no_tx_offload_pkt_cnt; - bool wlan_suspended; + bool is_suspend; /* Flag keeps track of wiphy suspend/resume */ bool is_wiphy_suspended; diff --git a/components/dp/core/src/wlan_dp_bus_bandwidth.c b/components/dp/core/src/wlan_dp_bus_bandwidth.c index d50155fc9c..63ff5137b3 100644 --- a/components/dp/core/src/wlan_dp_bus_bandwidth.c +++ b/components/dp/core/src/wlan_dp_bus_bandwidth.c @@ -1726,7 +1726,7 @@ static void __dp_bus_bw_work_handler(struct wlan_dp_psoc_context *dp_ctx) if (wlan_dp_validate_context(dp_ctx)) goto stop_work; - if (dp_ctx->is_wiphy_suspended) + if (dp_ctx->is_suspend) return; bw_interval_us = dp_ctx->dp_cfg.bus_bw_compute_interval * 1000; diff --git a/components/dp/core/src/wlan_dp_nud_tracking.c b/components/dp/core/src/wlan_dp_nud_tracking.c index d35a6546cf..3272723609 100644 --- a/components/dp/core/src/wlan_dp_nud_tracking.c +++ b/components/dp/core/src/wlan_dp_nud_tracking.c @@ -380,7 +380,7 @@ static void dp_nud_filter_netevent(struct qdf_mac_addr *netdev_addr, gw_mac_addr)) return; - if (dp_ctx->wlan_suspended) { + if (dp_ctx->is_wiphy_suspended) { dp_info("wlan is suspended, ignore NUD event"); return; } diff --git a/components/dp/core/src/wlan_dp_txrx.c b/components/dp/core/src/wlan_dp_txrx.c index ee7d20afde..ab0c37e8cb 100644 --- a/components/dp/core/src/wlan_dp_txrx.c +++ b/components/dp/core/src/wlan_dp_txrx.c @@ -565,7 +565,7 @@ dp_start_xmit(struct wlan_dp_intf *dp_intf, qdf_nbuf_t nbuf) goto drop_pkt; } - if (qdf_unlikely(dp_ctx->wlan_suspended)) { + if (qdf_unlikely(dp_ctx->is_suspend)) { dp_err_rl("Device is system suspended, drop pkt"); goto drop_pkt; } diff --git a/components/dp/dispatcher/src/wlan_dp_ucfg_api.c b/components/dp/dispatcher/src/wlan_dp_ucfg_api.c index db7162a410..35248898ab 100644 --- a/components/dp/dispatcher/src/wlan_dp_ucfg_api.c +++ b/components/dp/dispatcher/src/wlan_dp_ucfg_api.c @@ -321,6 +321,7 @@ static QDF_STATUS ucfg_dp_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg) { struct wlan_dp_psoc_context *dp_ctx; + struct wlan_dp_intf *dp_intf, *dp_intf_next = NULL; dp_ctx = dp_psoc_get_priv(psoc); if (!dp_ctx) { @@ -328,7 +329,10 @@ ucfg_dp_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg) return QDF_STATUS_E_FAILURE; } - dp_ctx->is_wiphy_suspended = true; + dp_ctx->is_suspend = true; + dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) { + dp_intf->sap_tx_block_mask |= WLAN_DP_SUSPEND; + } return QDF_STATUS_SUCCESS; } @@ -345,6 +349,7 @@ static QDF_STATUS ucfg_dp_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg) { struct wlan_dp_psoc_context *dp_ctx; + struct wlan_dp_intf *dp_intf, *dp_intf_next = NULL; dp_ctx = dp_psoc_get_priv(psoc); if (!dp_ctx) { @@ -352,7 +357,10 @@ ucfg_dp_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg) return QDF_STATUS_E_FAILURE; } - dp_ctx->is_wiphy_suspended = false; + dp_ctx->is_suspend = false; + dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) { + dp_intf->sap_tx_block_mask &= ~WLAN_DP_SUSPEND; + } return QDF_STATUS_SUCCESS; } @@ -451,7 +459,6 @@ QDF_STATUS ucfg_dp_psoc_close(struct wlan_objmgr_psoc *psoc) void ucfg_dp_suspend_wlan(struct wlan_objmgr_psoc *psoc) { struct wlan_dp_psoc_context *dp_ctx; - struct wlan_dp_intf *dp_intf, *dp_intf_next = NULL; dp_ctx = dp_psoc_get_priv(psoc); if (!dp_ctx) { @@ -459,17 +466,12 @@ void ucfg_dp_suspend_wlan(struct wlan_objmgr_psoc *psoc) return; } - dp_ctx->wlan_suspended = true; - - dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) { - dp_intf->sap_tx_block_mask |= WLAN_DP_SUSPEND; - } + dp_ctx->is_wiphy_suspended = true; } void ucfg_dp_resume_wlan(struct wlan_objmgr_psoc *psoc) { struct wlan_dp_psoc_context *dp_ctx; - struct wlan_dp_intf *dp_intf, *dp_intf_next = NULL; dp_ctx = dp_psoc_get_priv(psoc); if (!dp_ctx) { @@ -477,11 +479,7 @@ void ucfg_dp_resume_wlan(struct wlan_objmgr_psoc *psoc) return; } - dp_ctx->wlan_suspended = false; - - dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) { - dp_intf->sap_tx_block_mask &= ~WLAN_DP_SUSPEND; - } + dp_ctx->is_wiphy_suspended = false; } void ucfg_dp_wait_complete_tasks(void)