Loading components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +91 −91 Original line number Original line Diff line number Diff line Loading @@ -894,6 +894,74 @@ int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev) return vdev_mlme->mgmt.generic.maxregpower; return vdev_mlme->mgmt.generic.maxregpower; } } /** * mlme_get_vdev_types() - get vdev type and subtype from its operation mode * @mode: operation mode of vdev * @type: type of vdev * @sub_type: sub_type of vdev * * This API is called to get vdev type and subtype from its operation mode. * Vdev operation modes are defined in enum QDF_OPMODE. * * Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA, * WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR, * WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI * * Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE, * WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO, * WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH * Return: QDF_STATUS */ static QDF_STATUS mlme_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type, uint8_t *sub_type) { QDF_STATUS status = QDF_STATUS_SUCCESS; *type = 0; *sub_type = 0; switch (mode) { case QDF_STA_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; break; case QDF_SAP_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; break; case QDF_P2P_DEVICE_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE; break; case QDF_P2P_CLIENT_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT; break; case QDF_P2P_GO_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO; break; case QDF_OCB_MODE: *type = WLAN_VDEV_MLME_TYPE_OCB; break; case QDF_IBSS_MODE: *type = WLAN_VDEV_MLME_TYPE_IBSS; break; case QDF_MONITOR_MODE: *type = WMI_HOST_VDEV_TYPE_MONITOR; break; case QDF_NDI_MODE: *type = WLAN_VDEV_MLME_TYPE_NDI; break; case QDF_NAN_DISC_MODE: *type = WLAN_VDEV_MLME_TYPE_NAN; break; default: mlme_err("Invalid device mode %d", mode); status = QDF_STATUS_E_INVAL; break; } return status; } /** /** * vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object * vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object * @vdev_mlme: vdev mlme object * @vdev_mlme: vdev mlme object Loading @@ -903,6 +971,8 @@ int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev) static static QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) { { QDF_STATUS status; mlme_legacy_debug("vdev id = %d ", mlme_legacy_debug("vdev id = %d ", vdev_mlme->vdev->vdev_objmgr.vdev_id); vdev_mlme->vdev->vdev_objmgr.vdev_id); vdev_mlme->ext_vdev_ptr = vdev_mlme->ext_vdev_ptr = Loading @@ -912,7 +982,26 @@ QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) return QDF_STATUS_E_NOMEM; return QDF_STATUS_E_NOMEM; } } return QDF_STATUS_SUCCESS; sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->proto.generic.nss_2g, &vdev_mlme->proto.generic.nss_5g); status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->mgmt.generic.type, &vdev_mlme->mgmt.generic.subtype); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Get vdev type failed; status:%d", status); return status; } status = vdev_mgr_create_send(vdev_mlme); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Failed to create vdev for vdev id %d", wlan_vdev_get_id(vdev_mlme->vdev)); return status; } return status; } } /** /** Loading Loading @@ -1186,99 +1275,10 @@ QDF_STATUS mlme_vdev_self_peer_create(struct wlan_objmgr_vdev *vdev) return wma_vdev_self_peer_create(vdev_mlme); return wma_vdev_self_peer_create(vdev_mlme); } } /** * mlme_get_vdev_types() - get vdev type and subtype from its operation mode * @mode: operation mode of vdev * @type: type of vdev * @sub_type: sub_type of vdev * * This API is called to get vdev type and subtype from its operation mode. * Vdev operation modes are defined in enum QDF_OPMODE. * * Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA, * WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR, * WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI * * Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE, * WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO, * WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH * Return: QDF_STATUS */ static QDF_STATUS mlme_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type, uint8_t *sub_type) { QDF_STATUS status = QDF_STATUS_SUCCESS; *type = 0; *sub_type = 0; switch (mode) { case QDF_STA_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; break; case QDF_SAP_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; break; case QDF_P2P_DEVICE_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE; break; case QDF_P2P_CLIENT_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT; break; case QDF_P2P_GO_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO; break; case QDF_OCB_MODE: *type = WLAN_VDEV_MLME_TYPE_OCB; break; case QDF_IBSS_MODE: *type = WLAN_VDEV_MLME_TYPE_IBSS; break; case QDF_MONITOR_MODE: *type = WMI_HOST_VDEV_TYPE_MONITOR; break; case QDF_NDI_MODE: *type = WLAN_VDEV_MLME_TYPE_NDI; break; case QDF_NAN_DISC_MODE: *type = WLAN_VDEV_MLME_TYPE_NAN; break; default: mlme_err("Invalid device mode %d", mode); status = QDF_STATUS_E_INVAL; break; } return status; } static static QDF_STATUS vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj *vdev_mlme) QDF_STATUS vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj *vdev_mlme) { { QDF_STATUS status; return QDF_STATUS_SUCCESS; sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->proto.generic.nss_2g, &vdev_mlme->proto.generic.nss_5g); status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->mgmt.generic.type, &vdev_mlme->mgmt.generic.subtype); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Get vdev type failed; status:%d", status); return status; } status = vdev_mgr_create_send(vdev_mlme); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Failed to create vdev for vdev id %d", wlan_vdev_get_id(vdev_mlme->vdev)); return status; } return status; } } /** /** Loading components/pmo/core/src/wlan_pmo_main.c +2 −0 Original line number Original line Diff line number Diff line Loading @@ -184,6 +184,8 @@ static void wlan_pmo_init_cfg(struct wlan_objmgr_psoc *psoc, psoc_cfg->sta_mod_dtim = cfg_get(psoc, CFG_PMO_ENABLE_MODULATED_DTIM); psoc_cfg->sta_mod_dtim = cfg_get(psoc, CFG_PMO_ENABLE_MODULATED_DTIM); psoc_cfg->enable_mc_list = cfg_get(psoc, CFG_PMO_MC_ADDR_LIST_ENABLE); psoc_cfg->enable_mc_list = cfg_get(psoc, CFG_PMO_MC_ADDR_LIST_ENABLE); psoc_cfg->power_save_mode = cfg_get(psoc, CFG_PMO_POWERSAVE_MODE); psoc_cfg->power_save_mode = cfg_get(psoc, CFG_PMO_POWERSAVE_MODE); psoc_cfg->is_mod_dtim_on_sys_suspend_enabled = cfg_get(psoc, CFG_PMO_MOD_DTIM_ON_SYS_SUSPEND); psoc_cfg->max_ps_poll = cfg_get(psoc, CFG_PMO_MAX_PS_POLL); psoc_cfg->max_ps_poll = cfg_get(psoc, CFG_PMO_MAX_PS_POLL); psoc_cfg->wow_enable = cfg_get(psoc, CFG_PMO_WOW_ENABLE); psoc_cfg->wow_enable = cfg_get(psoc, CFG_PMO_WOW_ENABLE); Loading components/pmo/core/src/wlan_pmo_suspend_resume.c +20 −2 Original line number Original line Diff line number Diff line Loading @@ -730,16 +730,19 @@ QDF_STATUS pmo_core_psoc_user_space_resume_req(struct wlan_objmgr_psoc *psoc, * @psoc: objmgr psoc handle * @psoc: objmgr psoc handle * @psoc_ctx: pmo psoc private ctx * @psoc_ctx: pmo psoc private ctx * @wow_params: collection of wow enable override parameters * @wow_params: collection of wow enable override parameters * @type: type of wow suspend * * * Return: QDF status * Return: QDF status */ */ static QDF_STATUS static QDF_STATUS pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, struct pmo_psoc_priv_obj *psoc_ctx, struct pmo_psoc_priv_obj *psoc_ctx, struct pmo_wow_enable_params *wow_params) struct pmo_wow_enable_params *wow_params, enum qdf_suspend_type type) { { int host_credits, wmi_pending_cmds; int host_credits, wmi_pending_cmds; struct pmo_wow_cmd_params param = {0}; struct pmo_wow_cmd_params param = {0}; struct pmo_psoc_cfg *psoc_cfg = &psoc_ctx->psoc_cfg; QDF_STATUS status; QDF_STATUS status; pmo_enter(); pmo_enter(); Loading Loading @@ -810,6 +813,19 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, pmo_info("Prevent link down, non-drv wow is enabled"); pmo_info("Prevent link down, non-drv wow is enabled"); } } if (type == QDF_SYSTEM_SUSPEND) { pmo_info("system suspend wow"); param.flags |= WMI_WOW_FLAG_SYSTEM_SUSPEND_WOW; } else { pmo_info("RTPM wow"); } if ((psoc_cfg) && (psoc_cfg->is_mod_dtim_on_sys_suspend_enabled)) { pmo_info("mod DTIM enabled"); param.flags |= WMI_WOW_FLAG_MOD_DTIM_ON_SYS_SUSPEND; } status = pmo_tgt_psoc_send_wow_enable_req(psoc, ¶m); status = pmo_tgt_psoc_send_wow_enable_req(psoc, ¶m); if (status != QDF_STATUS_SUCCESS) { if (status != QDF_STATUS_SUCCESS) { pmo_err("Failed to enable wow in fw"); pmo_err("Failed to enable wow in fw"); Loading Loading @@ -927,7 +943,9 @@ QDF_STATUS pmo_core_psoc_bus_suspend_req(struct wlan_objmgr_psoc *psoc, begin = qdf_get_log_timestamp_usecs(); begin = qdf_get_log_timestamp_usecs(); if (wow_mode_selected) if (wow_mode_selected) status = pmo_core_enable_wow_in_fw(psoc, psoc_ctx, wow_params); status = pmo_core_enable_wow_in_fw(psoc, psoc_ctx, wow_params, type); else else status = pmo_core_psoc_suspend_target(psoc, 0); status = pmo_core_psoc_suspend_target(psoc, 0); end = qdf_get_log_timestamp_usecs(); end = qdf_get_log_timestamp_usecs(); Loading components/pmo/dispatcher/inc/wlan_pmo_common_cfg.h +30 −1 Original line number Original line Diff line number Diff line Loading @@ -219,6 +219,34 @@ CFG_VALUE_OR_DEFAULT, \ CFG_VALUE_OR_DEFAULT, \ "Optimized Power Management") "Optimized Power Management") /* * <ini> * enable_mod_dtim_on_system_suspend - enable modulated DTIM * on system suspend display off case * @Min: 0 * @Max: 1 * @Default: 0 * * This ini is used to set modulated DTIM configuration: * Current values of enable_mod_dtim_on_system_suspend: * 0 -> Modulated DTIM will be enabled for every wow entry * (RTPM wow + System suspend wow) * 1 -> Enable modulated DTIM only for System suspend wow. * For RTPM wow, the device will stay in DTIM 1 (non-modulated DTIM) * * Related: None * * Supported Feature: Modulated DTIM * * Usage: External * * </ini> */ #define CFG_PMO_MOD_DTIM_ON_SYS_SUSPEND CFG_INI_BOOL( \ "enable_mod_dtim_on_system_suspend", \ 0, \ "Modulated DTIM on System suspend wow") /* /* * <ini> * <ini> * gMaxPsPoll - Max powersave poll * gMaxPsPoll - Max powersave poll Loading Loading @@ -433,6 +461,7 @@ CFG(CFG_PMO_ACTIVE_MODE) \ CFG(CFG_PMO_ACTIVE_MODE) \ CFG(CFG_PMO_PWR_FAILURE) \ CFG(CFG_PMO_PWR_FAILURE) \ CFG(CFG_PMO_WOW_DATA_INACTIVITY_TIMEOUT) \ CFG(CFG_PMO_WOW_DATA_INACTIVITY_TIMEOUT) \ CFG(CFG_RA_RATE_LIMIT_INTERVAL) CFG(CFG_RA_RATE_LIMIT_INTERVAL) \ CFG(CFG_PMO_MOD_DTIM_ON_SYS_SUSPEND) #endif /* WLAN_PMO_COMMON_CFG_H__ */ #endif /* WLAN_PMO_COMMON_CFG_H__ */ components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -303,6 +303,8 @@ enum active_apf_mode { * @active_mc_bc_apf_mode: Setting that determines how APF is applied in * @active_mc_bc_apf_mode: Setting that determines how APF is applied in * active mode for MC/BC packets * active mode for MC/BC packets * @ito_repeat_count: Indicates ito repeated count * @ito_repeat_count: Indicates ito repeated count * @is_mod_dtim_on_sys_suspend_enabled: true when mod dtim is enabled for * system suspend wow else false */ */ struct pmo_psoc_cfg { struct pmo_psoc_cfg { bool ptrn_match_enable_all_vdev; bool ptrn_match_enable_all_vdev; Loading Loading @@ -365,6 +367,7 @@ struct pmo_psoc_cfg { enum active_apf_mode active_uc_apf_mode; enum active_apf_mode active_uc_apf_mode; enum active_apf_mode active_mc_bc_apf_mode; enum active_apf_mode active_mc_bc_apf_mode; uint8_t ito_repeat_count; uint8_t ito_repeat_count; bool is_mod_dtim_on_sys_suspend_enabled; }; }; /** /** Loading Loading
components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +91 −91 Original line number Original line Diff line number Diff line Loading @@ -894,6 +894,74 @@ int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev) return vdev_mlme->mgmt.generic.maxregpower; return vdev_mlme->mgmt.generic.maxregpower; } } /** * mlme_get_vdev_types() - get vdev type and subtype from its operation mode * @mode: operation mode of vdev * @type: type of vdev * @sub_type: sub_type of vdev * * This API is called to get vdev type and subtype from its operation mode. * Vdev operation modes are defined in enum QDF_OPMODE. * * Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA, * WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR, * WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI * * Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE, * WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO, * WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH * Return: QDF_STATUS */ static QDF_STATUS mlme_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type, uint8_t *sub_type) { QDF_STATUS status = QDF_STATUS_SUCCESS; *type = 0; *sub_type = 0; switch (mode) { case QDF_STA_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; break; case QDF_SAP_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; break; case QDF_P2P_DEVICE_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE; break; case QDF_P2P_CLIENT_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT; break; case QDF_P2P_GO_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO; break; case QDF_OCB_MODE: *type = WLAN_VDEV_MLME_TYPE_OCB; break; case QDF_IBSS_MODE: *type = WLAN_VDEV_MLME_TYPE_IBSS; break; case QDF_MONITOR_MODE: *type = WMI_HOST_VDEV_TYPE_MONITOR; break; case QDF_NDI_MODE: *type = WLAN_VDEV_MLME_TYPE_NDI; break; case QDF_NAN_DISC_MODE: *type = WLAN_VDEV_MLME_TYPE_NAN; break; default: mlme_err("Invalid device mode %d", mode); status = QDF_STATUS_E_INVAL; break; } return status; } /** /** * vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object * vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object * @vdev_mlme: vdev mlme object * @vdev_mlme: vdev mlme object Loading @@ -903,6 +971,8 @@ int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev) static static QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) { { QDF_STATUS status; mlme_legacy_debug("vdev id = %d ", mlme_legacy_debug("vdev id = %d ", vdev_mlme->vdev->vdev_objmgr.vdev_id); vdev_mlme->vdev->vdev_objmgr.vdev_id); vdev_mlme->ext_vdev_ptr = vdev_mlme->ext_vdev_ptr = Loading @@ -912,7 +982,26 @@ QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme) return QDF_STATUS_E_NOMEM; return QDF_STATUS_E_NOMEM; } } return QDF_STATUS_SUCCESS; sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->proto.generic.nss_2g, &vdev_mlme->proto.generic.nss_5g); status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->mgmt.generic.type, &vdev_mlme->mgmt.generic.subtype); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Get vdev type failed; status:%d", status); return status; } status = vdev_mgr_create_send(vdev_mlme); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Failed to create vdev for vdev id %d", wlan_vdev_get_id(vdev_mlme->vdev)); return status; } return status; } } /** /** Loading Loading @@ -1186,99 +1275,10 @@ QDF_STATUS mlme_vdev_self_peer_create(struct wlan_objmgr_vdev *vdev) return wma_vdev_self_peer_create(vdev_mlme); return wma_vdev_self_peer_create(vdev_mlme); } } /** * mlme_get_vdev_types() - get vdev type and subtype from its operation mode * @mode: operation mode of vdev * @type: type of vdev * @sub_type: sub_type of vdev * * This API is called to get vdev type and subtype from its operation mode. * Vdev operation modes are defined in enum QDF_OPMODE. * * Type of vdev are WLAN_VDEV_MLME_TYPE_AP, WLAN_VDEV_MLME_TYPE_STA, * WLAN_VDEV_MLME_TYPE_IBSS, ,WLAN_VDEV_MLME_TYPE_MONITOR, * WLAN_VDEV_MLME_TYPE_NAN, WLAN_VDEV_MLME_TYPE_OCB, WLAN_VDEV_MLME_TYPE_NDI * * Sub_types of vdev are WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE, * WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT, WLAN_VDEV_MLME_SUBTYPE_P2P_GO, * WLAN_VDEV_MLME_SUBTYPE_PROXY_STA, WLAN_VDEV_MLME_SUBTYPE_MESH * Return: QDF_STATUS */ static QDF_STATUS mlme_get_vdev_types(enum QDF_OPMODE mode, uint8_t *type, uint8_t *sub_type) { QDF_STATUS status = QDF_STATUS_SUCCESS; *type = 0; *sub_type = 0; switch (mode) { case QDF_STA_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; break; case QDF_SAP_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; break; case QDF_P2P_DEVICE_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE; break; case QDF_P2P_CLIENT_MODE: *type = WLAN_VDEV_MLME_TYPE_STA; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT; break; case QDF_P2P_GO_MODE: *type = WLAN_VDEV_MLME_TYPE_AP; *sub_type = WLAN_VDEV_MLME_SUBTYPE_P2P_GO; break; case QDF_OCB_MODE: *type = WLAN_VDEV_MLME_TYPE_OCB; break; case QDF_IBSS_MODE: *type = WLAN_VDEV_MLME_TYPE_IBSS; break; case QDF_MONITOR_MODE: *type = WMI_HOST_VDEV_TYPE_MONITOR; break; case QDF_NDI_MODE: *type = WLAN_VDEV_MLME_TYPE_NDI; break; case QDF_NAN_DISC_MODE: *type = WLAN_VDEV_MLME_TYPE_NAN; break; default: mlme_err("Invalid device mode %d", mode); status = QDF_STATUS_E_INVAL; break; } return status; } static static QDF_STATUS vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj *vdev_mlme) QDF_STATUS vdevmgr_mlme_ext_post_hdl_create(struct vdev_mlme_obj *vdev_mlme) { { QDF_STATUS status; return QDF_STATUS_SUCCESS; sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->proto.generic.nss_2g, &vdev_mlme->proto.generic.nss_5g); status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev), &vdev_mlme->mgmt.generic.type, &vdev_mlme->mgmt.generic.subtype); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Get vdev type failed; status:%d", status); return status; } status = vdev_mgr_create_send(vdev_mlme); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("Failed to create vdev for vdev id %d", wlan_vdev_get_id(vdev_mlme->vdev)); return status; } return status; } } /** /** Loading
components/pmo/core/src/wlan_pmo_main.c +2 −0 Original line number Original line Diff line number Diff line Loading @@ -184,6 +184,8 @@ static void wlan_pmo_init_cfg(struct wlan_objmgr_psoc *psoc, psoc_cfg->sta_mod_dtim = cfg_get(psoc, CFG_PMO_ENABLE_MODULATED_DTIM); psoc_cfg->sta_mod_dtim = cfg_get(psoc, CFG_PMO_ENABLE_MODULATED_DTIM); psoc_cfg->enable_mc_list = cfg_get(psoc, CFG_PMO_MC_ADDR_LIST_ENABLE); psoc_cfg->enable_mc_list = cfg_get(psoc, CFG_PMO_MC_ADDR_LIST_ENABLE); psoc_cfg->power_save_mode = cfg_get(psoc, CFG_PMO_POWERSAVE_MODE); psoc_cfg->power_save_mode = cfg_get(psoc, CFG_PMO_POWERSAVE_MODE); psoc_cfg->is_mod_dtim_on_sys_suspend_enabled = cfg_get(psoc, CFG_PMO_MOD_DTIM_ON_SYS_SUSPEND); psoc_cfg->max_ps_poll = cfg_get(psoc, CFG_PMO_MAX_PS_POLL); psoc_cfg->max_ps_poll = cfg_get(psoc, CFG_PMO_MAX_PS_POLL); psoc_cfg->wow_enable = cfg_get(psoc, CFG_PMO_WOW_ENABLE); psoc_cfg->wow_enable = cfg_get(psoc, CFG_PMO_WOW_ENABLE); Loading
components/pmo/core/src/wlan_pmo_suspend_resume.c +20 −2 Original line number Original line Diff line number Diff line Loading @@ -730,16 +730,19 @@ QDF_STATUS pmo_core_psoc_user_space_resume_req(struct wlan_objmgr_psoc *psoc, * @psoc: objmgr psoc handle * @psoc: objmgr psoc handle * @psoc_ctx: pmo psoc private ctx * @psoc_ctx: pmo psoc private ctx * @wow_params: collection of wow enable override parameters * @wow_params: collection of wow enable override parameters * @type: type of wow suspend * * * Return: QDF status * Return: QDF status */ */ static QDF_STATUS static QDF_STATUS pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, struct pmo_psoc_priv_obj *psoc_ctx, struct pmo_psoc_priv_obj *psoc_ctx, struct pmo_wow_enable_params *wow_params) struct pmo_wow_enable_params *wow_params, enum qdf_suspend_type type) { { int host_credits, wmi_pending_cmds; int host_credits, wmi_pending_cmds; struct pmo_wow_cmd_params param = {0}; struct pmo_wow_cmd_params param = {0}; struct pmo_psoc_cfg *psoc_cfg = &psoc_ctx->psoc_cfg; QDF_STATUS status; QDF_STATUS status; pmo_enter(); pmo_enter(); Loading Loading @@ -810,6 +813,19 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, pmo_info("Prevent link down, non-drv wow is enabled"); pmo_info("Prevent link down, non-drv wow is enabled"); } } if (type == QDF_SYSTEM_SUSPEND) { pmo_info("system suspend wow"); param.flags |= WMI_WOW_FLAG_SYSTEM_SUSPEND_WOW; } else { pmo_info("RTPM wow"); } if ((psoc_cfg) && (psoc_cfg->is_mod_dtim_on_sys_suspend_enabled)) { pmo_info("mod DTIM enabled"); param.flags |= WMI_WOW_FLAG_MOD_DTIM_ON_SYS_SUSPEND; } status = pmo_tgt_psoc_send_wow_enable_req(psoc, ¶m); status = pmo_tgt_psoc_send_wow_enable_req(psoc, ¶m); if (status != QDF_STATUS_SUCCESS) { if (status != QDF_STATUS_SUCCESS) { pmo_err("Failed to enable wow in fw"); pmo_err("Failed to enable wow in fw"); Loading Loading @@ -927,7 +943,9 @@ QDF_STATUS pmo_core_psoc_bus_suspend_req(struct wlan_objmgr_psoc *psoc, begin = qdf_get_log_timestamp_usecs(); begin = qdf_get_log_timestamp_usecs(); if (wow_mode_selected) if (wow_mode_selected) status = pmo_core_enable_wow_in_fw(psoc, psoc_ctx, wow_params); status = pmo_core_enable_wow_in_fw(psoc, psoc_ctx, wow_params, type); else else status = pmo_core_psoc_suspend_target(psoc, 0); status = pmo_core_psoc_suspend_target(psoc, 0); end = qdf_get_log_timestamp_usecs(); end = qdf_get_log_timestamp_usecs(); Loading
components/pmo/dispatcher/inc/wlan_pmo_common_cfg.h +30 −1 Original line number Original line Diff line number Diff line Loading @@ -219,6 +219,34 @@ CFG_VALUE_OR_DEFAULT, \ CFG_VALUE_OR_DEFAULT, \ "Optimized Power Management") "Optimized Power Management") /* * <ini> * enable_mod_dtim_on_system_suspend - enable modulated DTIM * on system suspend display off case * @Min: 0 * @Max: 1 * @Default: 0 * * This ini is used to set modulated DTIM configuration: * Current values of enable_mod_dtim_on_system_suspend: * 0 -> Modulated DTIM will be enabled for every wow entry * (RTPM wow + System suspend wow) * 1 -> Enable modulated DTIM only for System suspend wow. * For RTPM wow, the device will stay in DTIM 1 (non-modulated DTIM) * * Related: None * * Supported Feature: Modulated DTIM * * Usage: External * * </ini> */ #define CFG_PMO_MOD_DTIM_ON_SYS_SUSPEND CFG_INI_BOOL( \ "enable_mod_dtim_on_system_suspend", \ 0, \ "Modulated DTIM on System suspend wow") /* /* * <ini> * <ini> * gMaxPsPoll - Max powersave poll * gMaxPsPoll - Max powersave poll Loading Loading @@ -433,6 +461,7 @@ CFG(CFG_PMO_ACTIVE_MODE) \ CFG(CFG_PMO_ACTIVE_MODE) \ CFG(CFG_PMO_PWR_FAILURE) \ CFG(CFG_PMO_PWR_FAILURE) \ CFG(CFG_PMO_WOW_DATA_INACTIVITY_TIMEOUT) \ CFG(CFG_PMO_WOW_DATA_INACTIVITY_TIMEOUT) \ CFG(CFG_RA_RATE_LIMIT_INTERVAL) CFG(CFG_RA_RATE_LIMIT_INTERVAL) \ CFG(CFG_PMO_MOD_DTIM_ON_SYS_SUSPEND) #endif /* WLAN_PMO_COMMON_CFG_H__ */ #endif /* WLAN_PMO_COMMON_CFG_H__ */
components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -303,6 +303,8 @@ enum active_apf_mode { * @active_mc_bc_apf_mode: Setting that determines how APF is applied in * @active_mc_bc_apf_mode: Setting that determines how APF is applied in * active mode for MC/BC packets * active mode for MC/BC packets * @ito_repeat_count: Indicates ito repeated count * @ito_repeat_count: Indicates ito repeated count * @is_mod_dtim_on_sys_suspend_enabled: true when mod dtim is enabled for * system suspend wow else false */ */ struct pmo_psoc_cfg { struct pmo_psoc_cfg { bool ptrn_match_enable_all_vdev; bool ptrn_match_enable_all_vdev; Loading Loading @@ -365,6 +367,7 @@ struct pmo_psoc_cfg { enum active_apf_mode active_uc_apf_mode; enum active_apf_mode active_uc_apf_mode; enum active_apf_mode active_mc_bc_apf_mode; enum active_apf_mode active_mc_bc_apf_mode; uint8_t ito_repeat_count; uint8_t ito_repeat_count; bool is_mod_dtim_on_sys_suspend_enabled; }; }; /** /** Loading