From 68ee2e4c50d3232a2fb8abb9d7504f8bab9d3189 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Mon, 19 Nov 2018 21:15:14 +0530 Subject: [PATCH] qcacld-3.0: Reset wow pattern on vdev destroy Currently if a vdev is destroyed, wow patterns are not getting cleared for that vdev, so when a new vdev is created, host tries to configure new wow patterns for this new vdev but due to FW limitations on number of wow patterns that can be maintained at FW, FW is not able to act on this filter and will not maintain this new wow filter. To resolve this issue, clear the wow patterns for the vdev before it gets destroyed. Change-Id: Iae7ad8b683c95d8eaf11355bc0e36b91cece2202 CRs-Fixed: 2344337 --- components/pmo/core/inc/wlan_pmo_wow.h | 16 ++++++++-- components/pmo/core/src/wlan_pmo_wow.c | 29 +++++++++++++++++++ .../pmo/dispatcher/inc/wlan_pmo_ucfg_api.h | 15 ++++++++++ .../pmo/dispatcher/src/wlan_pmo_ucfg_api.c | 6 ++++ core/hdd/src/wlan_hdd_main.c | 2 ++ 5 files changed, 65 insertions(+), 3 deletions(-) diff --git a/components/pmo/core/inc/wlan_pmo_wow.h b/components/pmo/core/inc/wlan_pmo_wow.h index b3a01896a142..6ea9d5537a4b 100644 --- a/components/pmo/core/inc/wlan_pmo_wow.h +++ b/components/pmo/core/inc/wlan_pmo_wow.h @@ -301,10 +301,20 @@ static inline uint8_t pmo_get_wow_user_ptrn( } void pmo_dump_wow_ptrn(struct pmo_wow_add_pattern *ptrn); +/** + * pmo_core_del_wow_pattern() - Function which will delete the WoWL pattern + * @vdev: pointer to the vdev + * + * This function deletes all the user WoWl patterns and default WoWl patterns + * + * Return: error if any errors encountered, QDF_STATUS_SUCCESS otherwise + */ + +QDF_STATUS pmo_core_del_wow_pattern(struct wlan_objmgr_vdev *vdev); /** - * pmo_core_add_wow_pattern() - Function which will add the WoWL pattern to be - * used when PBM filtering is enabled + * pmo_core_add_wow_user_pattern() - Function which will add the WoWL pattern + * to be used when PBM filtering is enabled * @vdev: pointer to the vdev * @ptrn: pointer to the pattern string to be added * @@ -314,7 +324,7 @@ QDF_STATUS pmo_core_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev, struct pmo_wow_add_pattern *ptrn); /** - * pmo_core_del_wow_pattern() - Function which will delete the WoWL pattern + * pmo_core_del_wow_user_pattern() - Function which will delete the WoWL pattern * @vdev: pointer to the vdev * @ptrn: pointer to the pattern string to be delete * diff --git a/components/pmo/core/src/wlan_pmo_wow.c b/components/pmo/core/src/wlan_pmo_wow.c index a36d44f03eca..8becfcfa08e7 100644 --- a/components/pmo/core/src/wlan_pmo_wow.c +++ b/components/pmo/core/src/wlan_pmo_wow.c @@ -44,6 +44,35 @@ void pmo_set_wow_event_bitmap(WOW_WAKE_EVENT_TYPE event, bitmask[idx] |= 1 << bit_idx; } +QDF_STATUS pmo_core_del_wow_pattern(struct wlan_objmgr_vdev *vdev) +{ + QDF_STATUS status; + uint8_t id; + uint8_t pattern_count; + struct pmo_vdev_priv_obj *vdev_ctx; + + pmo_enter(); + status = pmo_vdev_get_ref(vdev); + if (QDF_IS_STATUS_ERROR(status)) + goto out; + + vdev_ctx = pmo_vdev_get_priv(vdev); + pattern_count = pmo_get_wow_default_ptrn(vdev_ctx); + /* clear all default patterns cofigured by pmo */ + for (id = 0; id < pattern_count; id++) + status = pmo_tgt_del_wow_pattern(vdev, id, false); + + /* clear all user patterns cofigured by pmo */ + pattern_count = pmo_get_wow_user_ptrn(vdev_ctx); + for (id = 0; id < pattern_count; id++) + status = pmo_tgt_del_wow_pattern(vdev, id, true); + + pmo_vdev_put_ref(vdev); +out: + pmo_exit(); + return status; +} + QDF_STATUS pmo_core_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev, struct pmo_wow_add_pattern *ptrn) { diff --git a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h index e8f6e8bdad79..b759d3a6c6ee 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h @@ -818,6 +818,15 @@ QDF_STATUS ucfg_pmo_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev, struct pmo_wow_add_pattern *ptrn); +/** + * ucfg_pmo_del_wow_pattern() - Delete WoWl patterns + * @vdev: objmgr vdev + * + * Return:QDF_STATUS_SUCCESS on success else error code + */ +QDF_STATUS +ucfg_pmo_del_wow_pattern(struct wlan_objmgr_vdev *vdev); + QDF_STATUS ucfg_pmo_del_wow_user_pattern(struct wlan_objmgr_vdev *vdev, uint8_t pattern_id); @@ -1395,6 +1404,12 @@ ucfg_pmo_del_wow_user_pattern( return QDF_STATUS_SUCCESS; } +QDF_STATUS +ucfg_pmo_del_wow_pattern(struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_SUCCESS; +} + static inline QDF_STATUS ucfg_pmo_psoc_bus_resume_req( struct wlan_objmgr_psoc *psoc, diff --git a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c index daf1d2ce026f..b9d4a6c67105 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c +++ b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c @@ -414,6 +414,12 @@ ucfg_pmo_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev, return pmo_core_add_wow_user_pattern(vdev, ptrn); } +QDF_STATUS +ucfg_pmo_del_wow_pattern(struct wlan_objmgr_vdev *vdev) +{ + return pmo_core_del_wow_pattern(vdev); +} + QDF_STATUS ucfg_pmo_del_wow_user_pattern(struct wlan_objmgr_vdev *vdev, uint8_t pattern_id) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 3651eda32927..4e4ad329b5a7 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -3988,6 +3988,8 @@ int hdd_vdev_destroy(struct hdd_adapter *adapter) vdev = hdd_objmgr_get_vdev(adapter); if (!vdev) return -EINVAL; + + ucfg_pmo_del_wow_pattern(vdev); status = ucfg_reg_11d_vdev_delete_update(vdev); ucfg_scan_set_vdev_del_in_progress(vdev); hdd_objmgr_put_vdev(adapter);