From 75cc51399859e0a98c6bab60dee46d89d4b2fdd1 Mon Sep 17 00:00:00 2001 From: Jianmin Zhu Date: Tue, 11 Jan 2022 17:11:17 +0800 Subject: [PATCH] qcacld-3.0: Fix arp offload not sent when suspend When host resume, check arp offload status wrongly, so arp offload disable cmd isn't sent to F/W. when next suspend comes, arp offload enable cmd isn't sent too. Change-Id: I06ea617df49287ee87e7b5bf8b20971b581dedf1 CRs-Fixed: 3106172 --- components/pmo/core/src/wlan_pmo_arp.c | 23 ++++++++++++++++++----- components/pmo/core/src/wlan_pmo_ns.c | 22 +++++++++++++++++++--- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/components/pmo/core/src/wlan_pmo_arp.c b/components/pmo/core/src/wlan_pmo_arp.c index c40e4a2e8fe5..7f8594819a3a 100644 --- a/components/pmo/core/src/wlan_pmo_arp.c +++ b/components/pmo/core/src/wlan_pmo_arp.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -230,13 +231,13 @@ QDF_STATUS pmo_core_arp_check_offload(struct wlan_objmgr_psoc *psoc, vdev_ctx = pmo_vdev_get_priv(vdev); psoc_ctx = vdev_ctx->pmo_psoc_ctx; + active_offload_cond = psoc_ctx->psoc_cfg.active_mode_offload; - if (trigger == pmo_apps_suspend || trigger == pmo_apps_resume) { - active_offload_cond = psoc_ctx->psoc_cfg.active_mode_offload; - + if (trigger == pmo_apps_suspend) { qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - is_applied_cond = vdev_ctx->vdev_arp_req.enable && - vdev_ctx->vdev_arp_req.is_offload_applied; + is_applied_cond = + vdev_ctx->vdev_arp_req.enable == PMO_OFFLOAD_ENABLE && + vdev_ctx->vdev_arp_req.is_offload_applied; qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); if (active_offload_cond && is_applied_cond) { @@ -244,6 +245,18 @@ QDF_STATUS pmo_core_arp_check_offload(struct wlan_objmgr_psoc *psoc, wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); return QDF_STATUS_E_INVAL; } + } else if (trigger == pmo_apps_resume) { + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + is_applied_cond = + vdev_ctx->vdev_arp_req.enable == PMO_OFFLOAD_DISABLE && + !vdev_ctx->vdev_arp_req.is_offload_applied; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + + if (active_offload_cond && is_applied_cond) { + pmo_debug("active offload is enabled and offload already disabled"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); + return QDF_STATUS_E_INVAL; + } } wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); out: diff --git a/components/pmo/core/src/wlan_pmo_ns.c b/components/pmo/core/src/wlan_pmo_ns.c index eaf58ff33413..4325450f40ed 100644 --- a/components/pmo/core/src/wlan_pmo_ns.c +++ b/components/pmo/core/src/wlan_pmo_ns.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -270,12 +271,13 @@ QDF_STATUS pmo_core_ns_check_offload(struct wlan_objmgr_psoc *psoc, vdev_ctx = pmo_vdev_get_priv(vdev); psoc_ctx = vdev_ctx->pmo_psoc_ctx; - if (trigger == pmo_apps_suspend || trigger == pmo_apps_resume) { + if (trigger == pmo_apps_suspend) { active_offload_cond = psoc_ctx->psoc_cfg.active_mode_offload; qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - is_applied_cond = vdev_ctx->vdev_ns_req.enable && - vdev_ctx->vdev_ns_req.is_offload_applied; + is_applied_cond = + vdev_ctx->vdev_ns_req.enable == PMO_OFFLOAD_ENABLE && + vdev_ctx->vdev_ns_req.is_offload_applied; qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); if (active_offload_cond && is_applied_cond) { @@ -283,6 +285,20 @@ QDF_STATUS pmo_core_ns_check_offload(struct wlan_objmgr_psoc *psoc, wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); return QDF_STATUS_E_INVAL; } + } else if (trigger == pmo_apps_resume) { + active_offload_cond = psoc_ctx->psoc_cfg.active_mode_offload; + + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + is_applied_cond = + vdev_ctx->vdev_ns_req.enable == PMO_OFFLOAD_DISABLE && + !vdev_ctx->vdev_ns_req.is_offload_applied; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + + if (active_offload_cond && is_applied_cond) { + pmo_debug("active offload is enabled and offload already disabled"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); + return QDF_STATUS_E_INVAL; + } } wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); out: