diff --git a/components/pmo/core/inc/wlan_pmo_wow.h b/components/pmo/core/inc/wlan_pmo_wow.h index 35c4954b34..8540a1803d 100644 --- a/components/pmo/core/inc/wlan_pmo_wow.h +++ b/components/pmo/core/inc/wlan_pmo_wow.h @@ -118,9 +118,15 @@ static inline uint8_t pmo_get_and_increment_wow_default_ptrn( { uint8_t count; - qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - count = vdev_ctx->num_wow_default_patterns++; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) { + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + count = vdev_ctx->num_wow_default_patterns++; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + } else { + qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + count = vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def++; + qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + } return count; } @@ -136,9 +142,15 @@ static inline uint8_t pmo_get_and_increment_wow_default_ptrn( static inline void pmo_increment_wow_default_ptrn( struct pmo_vdev_priv_obj *vdev_ctx) { - qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - vdev_ctx->num_wow_default_patterns++; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) { + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + vdev_ctx->num_wow_default_patterns++; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + } else { + qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def++; + qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + } } /** @@ -152,9 +164,15 @@ static inline void pmo_increment_wow_default_ptrn( static inline void pmo_decrement_wow_default_ptrn( struct pmo_vdev_priv_obj *vdev_ctx) { - qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - vdev_ctx->num_wow_default_patterns--; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) { + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + vdev_ctx->num_wow_default_patterns--; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + } else { + qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def--; + qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + } } /** @@ -168,9 +186,15 @@ static inline void pmo_decrement_wow_default_ptrn( static inline void pmo_increment_wow_user_ptrn( struct pmo_vdev_priv_obj *vdev_ctx) { - qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - vdev_ctx->num_wow_user_patterns++; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) { + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + vdev_ctx->num_wow_user_patterns++; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + } else { + qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_usr++; + qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + } } /** @@ -184,9 +208,15 @@ static inline void pmo_increment_wow_user_ptrn( static inline void pmo_decrement_wow_user_ptrn( struct pmo_vdev_priv_obj *vdev_ctx) { - qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); - vdev_ctx->num_wow_user_patterns--; - qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) { + qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock); + vdev_ctx->num_wow_user_patterns--; + qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock); + } else { + qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_usr--; + qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock); + } } void pmo_dump_wow_ptrn(struct pmo_wow_add_pattern *ptrn); diff --git a/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h b/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h index 31b9edbd93..89c941b37c 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h @@ -242,6 +242,7 @@ enum pmo_offload_trigger { /** * struct pmo_psoc_cfg - user configuration required for pmo * @ptrn_match_enable_all_vdev: true when pattern match is enable for all vdev + * @ptrn_id_per_vdev: true when pattern id can be same for different vdev * @bpf_enable: true if psoc supports bpf else false * @arp_offload_enable: true if arp offload is supported for psoc else false * @hw_filter_mode: which mode the hardware filter should use during DTIM @@ -269,6 +270,7 @@ enum pmo_offload_trigger { */ struct pmo_psoc_cfg { bool ptrn_match_enable_all_vdev; + bool ptrn_id_per_vdev; bool bpf_enable; bool arp_offload_enable; enum pmo_hw_filter_mode hw_filter_mode; diff --git a/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h b/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h index fc9cb8fce8..0c71dc68c2 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h @@ -185,6 +185,8 @@ enum pmo_wow_action_wakeup_opertion { * @lphb_cb_ctx: callback context for lphb, kept as void* as * osif structures are opaque to pmo. * @pmo_lphb_callback: registered os if calllback function + * @ptrn_id_def: default pattern id counter for legacy firmware + * @ptrn_id_usr: user pattern id counter for legacy firmware * * This structure stores wow patterns and * wow related parameters in host. @@ -205,6 +207,9 @@ struct pmo_wow { struct pmo_lphb_req lphb_cache[2]; void *lphb_cb_ctx; pmo_lphb_callback lphb_cb; + + uint8_t ptrn_id_def; + uint8_t ptrn_id_usr; }; /* WOW related structures */ diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 96ce3f9f30..ee520f5f10 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -11912,6 +11912,8 @@ static int hdd_update_pmo_config(struct hdd_context *hdd_ctx) (hdd_ctx->config->wowEnable & 0x01) ? true : false; psoc_cfg.ptrn_match_enable_all_vdev = (hdd_ctx->config->wowEnable & 0x02) ? true : false; + psoc_cfg.ptrn_id_per_vdev = wma_is_service_enabled( + WMI_SERVICE_UNIFIED_WOW_CAPABILITY); psoc_cfg.bpf_enable = hdd_ctx->config->bpf_packet_filter_enable; psoc_cfg.arp_offload_enable = hdd_ctx->config->fhostArpOffload;