int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm *mvm, struct ieee80211_vif *vif, bool enable, u32 flags) { int ret; struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); struct iwl_mac_power_cmd cmd = {}; if (vif->type != NL80211_IFTYPE_STATION || vif->p2p) return 0; if (!vif->bss_conf.assoc) return 0; iwl_mvm_power_build_cmd(mvm, vif, &cmd); if (enable) { /* configure skip over dtim up to 306TU - 314 msec */ int dtimper = vif->bss_conf.dtim_period ?: 1; int dtimper_tu = dtimper * vif->bss_conf.beacon_int; bool radar_detect = iwl_mvm_power_is_radar(vif); if (WARN_ON(!dtimper_tu)) return 0; /* Check skip over DTIM conditions */ /* TODO: check that multicast wake lock is off */ if (!radar_detect && (dtimper < 10)) { cmd.skip_dtim_periods = 306 / dtimper_tu; if (cmd.skip_dtim_periods) cmd.flags |= cpu_to_le16( POWER_FLAGS_SKIP_OVER_DTIM_MSK); } } iwl_mvm_power_log(mvm, &cmd); #ifdef CONFIG_IWLWIFI_DEBUGFS memcpy(&mvmvif->mac_pwr_cmd, &cmd, sizeof(cmd)); #endif ret = iwl_mvm_send_cmd_pdu(mvm, MAC_PM_POWER_TABLE, flags, sizeof(cmd), &cmd); if (ret) return ret; /* configure beacon filtering */ if (mvmvif != mvm->bf_allowed_vif) return 0; if (enable) { struct iwl_beacon_filter_cmd cmd_bf = { IWL_BF_CMD_CONFIG_D0I3, .bf_enable_beacon_filter = cpu_to_le32(1), }; ret = _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd_bf, flags, true); } else { if (mvmvif->bf_data.bf_enabled)
int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm, struct ieee80211_vif *vif, u32 flags) { struct iwl_beacon_filter_cmd cmd = { IWL_BF_CMD_CONFIG_DEFAULTS, .bf_enable_beacon_filter = cpu_to_le32(1), }; return _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd, flags, false); }
int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm *mvm, struct ieee80211_vif *vif, bool enable, u32 flags) { int ret; struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); struct iwl_mac_power_cmd cmd = {}; if (vif->type != NL80211_IFTYPE_STATION || vif->p2p) return 0; if (!vif->bss_conf.assoc) return 0; iwl_mvm_power_build_cmd(mvm, vif, &cmd); if (enable) { /* configure skip over dtim up to 300 msec */ int dtimper = mvm->hw->conf.ps_dtim_period ?: 1; int dtimper_msec = dtimper * vif->bss_conf.beacon_int; if (WARN_ON(!dtimper_msec)) return 0; cmd.skip_dtim_periods = 300 / dtimper_msec; if (cmd.skip_dtim_periods) cmd.flags |= cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK); } iwl_mvm_power_log(mvm, &cmd); #ifdef CONFIG_IWLWIFI_DEBUGFS memcpy(&mvmvif->mac_pwr_cmd, &cmd, sizeof(cmd)); #endif ret = iwl_mvm_send_cmd_pdu(mvm, MAC_PM_POWER_TABLE, flags, sizeof(cmd), &cmd); if (ret) return ret; /* configure beacon filtering */ if (mvmvif != mvm->bf_allowed_vif) return 0; if (enable) { struct iwl_beacon_filter_cmd cmd_bf = { IWL_BF_CMD_CONFIG_D0I3, .bf_enable_beacon_filter = cpu_to_le32(1), }; ret = _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd_bf, flags, true); } else { if (mvmvif->bf_data.bf_enabled)
static int iwl_mvm_update_beacon_abort(struct iwl_mvm *mvm, struct ieee80211_vif *vif, bool enable) { struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); struct iwl_beacon_filter_cmd cmd = { IWL_BF_CMD_CONFIG_DEFAULTS, .bf_enable_beacon_filter = cpu_to_le32(1), }; if (!mvmvif->bf_data.bf_enabled) return 0; if (mvm->cur_ucode == IWL_UCODE_WOWLAN) cmd.ba_escape_timer = cpu_to_le32(IWL_BA_ESCAPE_TIMER_D3); mvmvif->bf_data.ba_enabled = enable; return _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd, 0, false); }