static int iwl_mvm_power_mac_update_mode(struct iwl_mvm *mvm, struct ieee80211_vif *vif) { int ret; bool ba_enable; struct iwl_mac_power_cmd cmd = {}; if (vif->type != NL80211_IFTYPE_STATION || vif->p2p) return 0; /* * TODO: The following vif_count verification is temporary condition. * Avoid power mode update if more than one interface is currently * active. Remove this condition when FW will support power management * on multiple MACs. */ IWL_DEBUG_POWER(mvm, "Currently %d interfaces active\n", mvm->vif_count); if (mvm->vif_count > 1) return 0; iwl_mvm_power_build_cmd(mvm, vif, &cmd); iwl_mvm_power_log(mvm, &cmd); ret = iwl_mvm_send_cmd_pdu(mvm, MAC_PM_POWER_TABLE, CMD_SYNC, sizeof(cmd), &cmd); if (ret) return ret; ba_enable = !!(cmd.flags & cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK)); return iwl_mvm_update_beacon_abort(mvm, vif, ba_enable); }
static int iwl_mvm_power_mac_update_mode(struct iwl_mvm *mvm, struct ieee80211_vif *vif) { int ret; bool ba_enable; struct iwl_mac_power_cmd cmd = {}; if (vif->type != NL80211_IFTYPE_STATION) return 0; if (vif->p2p && !(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_P2P_PS)) return 0; iwl_mvm_power_build_cmd(mvm, vif, &cmd); iwl_mvm_power_log(mvm, &cmd); ret = iwl_mvm_send_cmd_pdu(mvm, MAC_PM_POWER_TABLE, CMD_SYNC, sizeof(cmd), &cmd); if (ret) return ret; ba_enable = !!(cmd.flags & cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK)); return iwl_mvm_update_beacon_abort(mvm, vif, ba_enable); }
int iwl_mvm_power_update_mac(struct iwl_mvm *mvm) { struct iwl_mvm_vif *mvmvif; struct iwl_power_vifs vifs = {}; bool ba_enable; int ret; lockdep_assert_held(&mvm->mutex); iwl_mvm_power_set_pm(mvm, &vifs); /* disable PS if CAM */ if (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM) { mvm->ps_disabled = true; } else { /* don't update device power state unless we add / remove monitor */ if (vifs.monitor_vif) { if (vifs.monitor_active) mvm->ps_disabled = true; ret = iwl_mvm_power_update_device(mvm); if (ret) return ret; } } if (vifs.bss_vif) { ret = iwl_mvm_power_send_cmd(mvm, vifs.bss_vif); if (ret) return ret; } if (vifs.p2p_vif) { ret = iwl_mvm_power_send_cmd(mvm, vifs.p2p_vif); if (ret) return ret; } if (!vifs.bf_vif) return 0; mvmvif = iwl_mvm_vif_from_mac80211(vifs.bf_vif); ba_enable = !(!mvmvif->pm_enabled || mvm->ps_disabled || !vifs.bf_vif->bss_conf.ps || iwl_mvm_vif_low_latency(mvmvif)); return iwl_mvm_update_beacon_abort(mvm, vifs.bf_vif, ba_enable); }
static int iwl_mvm_power_set_ba(struct iwl_mvm *mvm, struct iwl_power_vifs *vifs) { struct iwl_mvm_vif *mvmvif; bool ba_enable; if (!vifs->bf_vif) return 0; mvmvif = iwl_mvm_vif_from_mac80211(vifs->bf_vif); ba_enable = !(!mvmvif->pm_enabled || mvm->ps_disabled || !vifs->bf_vif->bss_conf.ps || iwl_mvm_vif_low_latency(mvmvif)); return iwl_mvm_update_beacon_abort(mvm, vifs->bf_vif, ba_enable); }