Beispiel #1
0
int iwl_mvm_power_update_mac(struct iwl_mvm *mvm)
{
    struct iwl_power_vifs vifs = {
        .mvm = mvm,
    };
    int ret;

    lockdep_assert_held(&mvm->mutex);

    /* get vifs info */
    ieee80211_iterate_active_interfaces_atomic(mvm->hw,
            IEEE80211_IFACE_ITER_NORMAL,
            iwl_mvm_power_get_vifs_iterator, &vifs);

    iwl_mvm_power_set_pm(mvm, &vifs);

    ret = iwl_mvm_power_set_ps(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;
    }

    return iwl_mvm_power_set_ba(mvm, &vifs);
}
Beispiel #2
0
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);
}