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);