コード例 #1
0
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)
コード例 #2
0
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);
}
コード例 #3
0
ファイル: power.c プロジェクト: MaxChina/linux
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)
コード例 #4
0
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);
}