/******************************************************************************
 *
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/

// A note about the data structure of power management and saving.
//
// * In each MAC interface (the 'struct iwl_mvm_vif'), there are 2 fields related to this:
//
//   - pm_enabled: indicates whether the power management is allowed on this interface.
//                 It is only enabled in some condition (e.g. only one mode is active).
//                 See iwl_mvm_power_set_pm() for details.
//
//   - ps_disabled: indicates that this interface requires power saving to be disabled.
//
// * For an MVM (the 'struct iwl_mvm'), there is also a field called 'ps_disable' to
//   indicate if the power save is allowed. It is obvious that this field aggregates
//   the 'ps_disabled' of all interfaces. If any of interface PS is disabled, the MVM PS
//   is disabled as well.
//

#include "third_party/iwlwifi/fw/api/power.h"

#include <zircon/status.h>

#include "third_party/iwlwifi/platform/ieee80211_include.h"

#include "third_party/iwlwifi/iwl-debug.h"
#include "third_party/iwlwifi/iwl-modparams.h"
#include "third_party/iwlwifi/mvm/constants.h"
#include "third_party/iwlwifi/mvm/mvm.h"

#define POWER_KEEP_ALIVE_PERIOD_SEC 25

static int iwl_mvm_beacon_filter_send_cmd(struct iwl_mvm* mvm, struct iwl_beacon_filter_cmd* cmd,
                                          uint32_t flags) {
  IWL_DEBUG_POWER(mvm, "ba_enable_beacon_abort is: %d\n", le32_to_cpu(cmd->ba_enable_beacon_abort));
  IWL_DEBUG_POWER(mvm, "ba_escape_timer is: %d\n", le32_to_cpu(cmd->ba_escape_timer));
  IWL_DEBUG_POWER(mvm, "bf_debug_flag is: %d\n", le32_to_cpu(cmd->bf_debug_flag));
  IWL_DEBUG_POWER(mvm, "bf_enable_beacon_filter is: %d\n",
                  le32_to_cpu(cmd->bf_enable_beacon_filter));
  IWL_DEBUG_POWER(mvm, "bf_energy_delta is: %d\n", le32_to_cpu(cmd->bf_energy_delta));
  IWL_DEBUG_POWER(mvm, "bf_escape_timer is: %d\n", le32_to_cpu(cmd->bf_escape_timer));
  IWL_DEBUG_POWER(mvm, "bf_roaming_energy_delta is: %d\n",
                  le32_to_cpu(cmd->bf_roaming_energy_delta));
  IWL_DEBUG_POWER(mvm, "bf_roaming_state is: %d\n", le32_to_cpu(cmd->bf_roaming_state));
  IWL_DEBUG_POWER(mvm, "bf_temp_threshold is: %d\n", le32_to_cpu(cmd->bf_temp_threshold));
  IWL_DEBUG_POWER(mvm, "bf_temp_fast_filter is: %d\n", le32_to_cpu(cmd->bf_temp_fast_filter));
  IWL_DEBUG_POWER(mvm, "bf_temp_slow_filter is: %d\n", le32_to_cpu(cmd->bf_temp_slow_filter));

  return iwl_mvm_send_cmd_pdu(mvm, REPLY_BEACON_FILTERING_CMD, flags,
                              sizeof(struct iwl_beacon_filter_cmd), cmd);
}

static void iwl_mvm_beacon_filter_set_cqm_params(struct iwl_mvm_vif* mvmvif,
                                                 struct iwl_beacon_filter_cmd* cmd, bool d0i3) {
#if 0   // NEEDS_PORTING
  if (vif->bss_conf.cqm_rssi_thold && !d0i3) {
    cmd->bf_energy_delta = cpu_to_le32(vif->bss_conf.cqm_rssi_hyst);
    /* fw uses an absolute value for this */
    cmd->bf_roaming_state = cpu_to_le32(-vif->bss_conf.cqm_rssi_thold);
  }
#endif  // NEEDS_PORTING
  cmd->ba_enable_beacon_abort = cpu_to_le32(mvmvif->bf_data.ba_enabled);
}

static void iwl_mvm_power_log(struct iwl_mvm* mvm, struct iwl_mac_power_cmd* cmd) {
  IWL_DEBUG_POWER(mvm,
                  "Sending power table command on mac id 0x%X for power level %d, flags = 0x%X\n",
                  cmd->id_and_color, iwlmvm_mod_params.power_scheme, le16_to_cpu(cmd->flags));
  IWL_DEBUG_POWER(mvm, "Keep alive = %u sec\n", le16_to_cpu(cmd->keep_alive_seconds));

  if (!(cmd->flags & cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK))) {
    IWL_DEBUG_POWER(mvm, "Disable power management\n");
    return;
  }

  IWL_DEBUG_POWER(mvm, "Rx timeout = %u usec\n", le32_to_cpu(cmd->rx_data_timeout));
  IWL_DEBUG_POWER(mvm, "Tx timeout = %u usec\n", le32_to_cpu(cmd->tx_data_timeout));
  if (cmd->flags & cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK)) {
    IWL_DEBUG_POWER(mvm, "DTIM periods to skip = %u\n", cmd->skip_dtim_periods);
  }
  if (cmd->flags & cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK)) {
    IWL_DEBUG_POWER(mvm, "LP RX RSSI threshold = %u\n", cmd->lprx_rssi_threshold);
  }
  if (cmd->flags & cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK)) {
    IWL_DEBUG_POWER(mvm, "uAPSD enabled\n");
    IWL_DEBUG_POWER(mvm, "Rx timeout (uAPSD) = %u usec\n", le32_to_cpu(cmd->rx_data_timeout_uapsd));
    IWL_DEBUG_POWER(mvm, "Tx timeout (uAPSD) = %u usec\n", le32_to_cpu(cmd->tx_data_timeout_uapsd));
    IWL_DEBUG_POWER(mvm, "QNDP TID = %d\n", cmd->qndp_tid);
    IWL_DEBUG_POWER(mvm, "ACs flags = 0x%x\n", cmd->uapsd_ac_flags);
    IWL_DEBUG_POWER(mvm, "Max SP = %d\n", cmd->uapsd_max_sp);
  }
}

#if 0  // NEEDS_PORTING
static void iwl_mvm_power_configure_uapsd(struct iwl_mvm* mvm, struct ieee80211_vif* vif,
                                          struct iwl_mac_power_cmd* cmd) {
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);
  enum ieee80211_ac_numbers ac;
  bool tid_found = false;

#ifdef CPTCFG_IWLWIFI_DEBUGFS
  /* set advanced pm flag with no uapsd ACs to enable ps-poll */
  if (mvmvif->dbgfs_pm.use_ps_poll) {
    cmd->flags |= cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK);
    return;
  }
#endif
#ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES
  if (mvm->trans->dbg_cfg.MVM_USE_PS_POLL) {
    cmd->flags |= cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK);
    return;
  }
#endif

  for (ac = IEEE80211_AC_VO; ac <= IEEE80211_AC_BK; ac++) {
    if (!mvmvif->queue_params[ac].uapsd) {
      continue;
    }

    if (mvm->fwrt.cur_fw_img != IWL_UCODE_WOWLAN) {
      cmd->flags |= cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK);
    }

    cmd->uapsd_ac_flags |= BIT(ac);

    /* QNDP TID - the highest TID with no admission control */
    if (!tid_found && !mvmvif->queue_params[ac].acm) {
      tid_found = true;
      switch (ac) {
        case IEEE80211_AC_VO:
          cmd->qndp_tid = 6;
          break;
        case IEEE80211_AC_VI:
          cmd->qndp_tid = 5;
          break;
        case IEEE80211_AC_BE:
          cmd->qndp_tid = 0;
          break;
        case IEEE80211_AC_BK:
          cmd->qndp_tid = 1;
          break;
      }
    }
  }

  cmd->flags |= cpu_to_le16(POWER_FLAGS_UAPSD_MISBEHAVING_ENA_MSK);

  if (cmd->uapsd_ac_flags ==
      (BIT(IEEE80211_AC_VO) | BIT(IEEE80211_AC_VI) | BIT(IEEE80211_AC_BE) | BIT(IEEE80211_AC_BK))) {
    cmd->flags |= cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK);
    cmd->snooze_interval = cpu_to_le16(IWL_MVM_PS_SNOOZE_INTERVAL);
    cmd->snooze_window = (mvm->fwrt.cur_fw_img == IWL_UCODE_WOWLAN)
                             ? cpu_to_le16(IWL_MVM_WOWLAN_PS_SNOOZE_WINDOW)
                             : cpu_to_le16(IWL_MVM_PS_SNOOZE_WINDOW);
  }

  cmd->uapsd_max_sp = mvm->hw->uapsd_max_sp_len;

  if (mvm->fwrt.cur_fw_img == IWL_UCODE_WOWLAN ||
      cmd->flags & cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK)) {
    cmd->rx_data_timeout_uapsd = cpu_to_le32(IWL_MVM_WOWLAN_PS_RX_DATA_TIMEOUT);
    cmd->tx_data_timeout_uapsd = cpu_to_le32(IWL_MVM_WOWLAN_PS_TX_DATA_TIMEOUT);
  } else {
    cmd->rx_data_timeout_uapsd = cpu_to_le32(IWL_MVM_UAPSD_RX_DATA_TIMEOUT);
    cmd->tx_data_timeout_uapsd = cpu_to_le32(IWL_MVM_UAPSD_TX_DATA_TIMEOUT);
  }

  if (cmd->flags & cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK)) {
    cmd->heavy_tx_thld_packets = IWL_MVM_PS_SNOOZE_HEAVY_TX_THLD_PACKETS;
    cmd->heavy_rx_thld_packets = IWL_MVM_PS_SNOOZE_HEAVY_RX_THLD_PACKETS;
  } else {
    cmd->heavy_tx_thld_packets = IWL_MVM_PS_HEAVY_TX_THLD_PACKETS;
    cmd->heavy_rx_thld_packets = IWL_MVM_PS_HEAVY_RX_THLD_PACKETS;
  }
  cmd->heavy_tx_thld_percentage = IWL_MVM_PS_HEAVY_TX_THLD_PERCENT;
  cmd->heavy_rx_thld_percentage = IWL_MVM_PS_HEAVY_RX_THLD_PERCENT;
}

struct iwl_allow_uapsd_iface_iterator_data {
  struct ieee80211_vif* current_vif;
  bool allow_uapsd;
};

static void iwl_mvm_allow_uapsd_iterator(void* _data, uint8_t* mac, struct ieee80211_vif* vif) {
  struct iwl_allow_uapsd_iface_iterator_data* data = _data;
  struct iwl_mvm_vif* other_mvmvif = iwl_mvm_vif_from_mac80211(vif);
  struct iwl_mvm_vif* curr_mvmvif = iwl_mvm_vif_from_mac80211(data->current_vif);

  /* exclude the given vif */
  if (vif == data->current_vif) {
    return;
  }

  switch (vif->type) {
    case NL80211_IFTYPE_AP:
    case NL80211_IFTYPE_ADHOC:
    case NL80211_IFTYPE_NAN:
      data->allow_uapsd = false;
      break;
    case NL80211_IFTYPE_STATION:
      /* allow UAPSD if P2P interface and BSS station interface share
       * the same channel.
       */
      if (vif->bss_conf.assoc && other_mvmvif->phy_ctxt && curr_mvmvif->phy_ctxt &&
          (other_mvmvif->phy_ctxt->id != curr_mvmvif->phy_ctxt->id)) {
        data->allow_uapsd = false;
      }
      break;

    default:
      break;
  }
}

static bool iwl_mvm_power_allow_uapsd(struct iwl_mvm* mvm, struct ieee80211_vif* vif) {
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);
  struct iwl_allow_uapsd_iface_iterator_data data = {
      .current_vif = vif,
      .allow_uapsd = true,
  };

  if (!memcmp(mvmvif->uapsd_misbehaving_bssid, vif->bss_conf.bssid, ETH_ALEN)) {
    return false;
  }

  /*
   * Avoid using uAPSD if P2P client is associated to GO that uses
   * opportunistic power save. This is due to current FW limitation.
   */
  if (vif->p2p && (vif->bss_conf.p2p_noa_attr.oppps_ctwindow & IEEE80211_P2P_OPPPS_ENABLE_BIT)) {
    return false;
  }

  if (vif->p2p && !iwl_mvm_is_p2p_scm_uapsd_supported(mvm)) {
    return false;
  }

  ieee80211_iterate_active_interfaces_atomic(mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
                                             iwl_mvm_allow_uapsd_iterator, &data);

  return data.allow_uapsd;
}

static bool iwl_mvm_power_is_radar(struct ieee80211_vif* vif) {
  struct ieee80211_chanctx_conf* chanctx_conf;
  struct ieee80211_channel* chan;
  bool radar_detect = false;

  rcu_read_lock();
  chanctx_conf = rcu_dereference(vif->chanctx_conf);
  WARN_ON(!chanctx_conf);
  if (chanctx_conf) {
    chan = chanctx_conf->def.chan;
    radar_detect = chan->flags & IEEE80211_CHAN_RADAR;
  }
  rcu_read_unlock();

  return radar_detect;
}

static void iwl_mvm_power_config_skip_dtim(struct iwl_mvm* mvm,
                                           struct iwl_mac_power_cmd* cmd, bool host_awake) {
  int dtimper = vif->bss_conf.dtim_period ?: 1;
  int skip;

  /* disable, in case we're supposed to override */
  cmd->skip_dtim_periods = 0;
  cmd->flags &= ~cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK);

  // TODO(45583): Check whether radar detection is required on this channel
  if (iwl_mvm_power_is_radar(vif)) {
    return;
  }

  if (dtimper >= 10) {
    return;
  }

  /* TODO: check that multicast wake lock is off */

  if (host_awake) {
    if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_LP) {
      return;
    }
    skip = 2;
  } else {
    int dtimper_tu = dtimper * vif->bss_conf.beacon_int;

    if (WARN_ON(!dtimper_tu)) {
      return;
    }
    /* configure skip over dtim up to 306TU - 314 msec */
    skip = max_t(uint8_t, 1, 306 / dtimper_tu);
  }

  /* the firmware really expects "look at every X DTIMs", so add 1 */
  cmd->skip_dtim_periods = 1 + skip;
  cmd->flags |= cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK);
}
#endif  // NEEDS_PORTING

static void iwl_mvm_power_build_cmd(struct iwl_mvm* mvm, struct iwl_mvm_vif* mvmvif,
                                    struct iwl_mac_power_cmd* cmd, bool host_awake) {
  int dtimper, bi;
  int keep_alive;

  cmd->id_and_color = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, mvmvif->color));
  dtimper = mvmvif->bss_conf.dtim_period;
  bi = mvmvif->bss_conf.beacon_int;

  /*
   * Regardless of power management state the driver must set
   * keep alive period. FW will use it for sending keep alive NDPs
   * immediately after association. Check that keep alive period
   * is at least 3 * DTIM
   */
  keep_alive = DIV_ROUND_UP(ieee80211_tu_to_usec(3 * dtimper * bi), USEC_PER_SEC);
  keep_alive = MAX(keep_alive, POWER_KEEP_ALIVE_PERIOD_SEC);
  cmd->keep_alive_seconds = cpu_to_le16(keep_alive);

  if (mvm->ps_disabled) {
    return;
  }

  cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_SAVE_ENA_MSK);

  return;

#if 0   // NEEDS_PORTING
  // TODO(49224): suuport power saving
  if (!vif->bss_conf.ps || !mvmvif->pm_enabled) {
    return;
  }

  if (iwl_mvm_vif_low_latency(mvmvif) && vif->p2p &&
      (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SHORT_PM_TIMEOUTS) ||
       !IWL_MVM_P2P_LOWLATENCY_PS_ENABLE)) {
    return;
  }

  cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK);

  if (vif->bss_conf.beacon_rate &&
      (vif->bss_conf.beacon_rate->bitrate == 10 || vif->bss_conf.beacon_rate->bitrate == 60)) {
    cmd->flags |= cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK);
    cmd->lprx_rssi_threshold = POWER_LPRX_RSSI_THRESHOLD;
  }

  iwl_mvm_power_config_skip_dtim(mvm, vif, cmd, host_awake);

  if (!host_awake) {
    cmd->rx_data_timeout = cpu_to_le32(IWL_MVM_WOWLAN_PS_RX_DATA_TIMEOUT);
    cmd->tx_data_timeout = cpu_to_le32(IWL_MVM_WOWLAN_PS_TX_DATA_TIMEOUT);
  } else if (iwl_mvm_vif_low_latency(mvmvif) && vif->p2p &&
             fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SHORT_PM_TIMEOUTS)) {
    cmd->tx_data_timeout = cpu_to_le32(IWL_MVM_SHORT_PS_TX_DATA_TIMEOUT);
    cmd->rx_data_timeout = cpu_to_le32(IWL_MVM_SHORT_PS_RX_DATA_TIMEOUT);
  } else {
    cmd->rx_data_timeout = cpu_to_le32(IWL_MVM_DEFAULT_PS_RX_DATA_TIMEOUT);
    cmd->tx_data_timeout = cpu_to_le32(IWL_MVM_DEFAULT_PS_TX_DATA_TIMEOUT);
  }

  if (iwl_mvm_power_allow_uapsd(mvm, vif)) {
    iwl_mvm_power_configure_uapsd(mvm, vif, cmd);
  }
#endif  // NEEDS_PORTING

#ifdef CPTCFG_IWLWIFI_DEBUGFS
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_KEEP_ALIVE) {
    cmd->keep_alive_seconds = cpu_to_le16(mvmvif->dbgfs_pm.keep_alive_seconds);
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_SKIP_OVER_DTIM) {
    if (mvmvif->dbgfs_pm.skip_over_dtim) {
      cmd->flags |= cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK);
    } else {
      cmd->flags &= cpu_to_le16(~POWER_FLAGS_SKIP_OVER_DTIM_MSK);
    }
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_RX_DATA_TIMEOUT) {
    cmd->rx_data_timeout = cpu_to_le32(mvmvif->dbgfs_pm.rx_data_timeout);
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_TX_DATA_TIMEOUT) {
    cmd->tx_data_timeout = cpu_to_le32(mvmvif->dbgfs_pm.tx_data_timeout);
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS) {
    cmd->skip_dtim_periods = mvmvif->dbgfs_pm.skip_dtim_periods;
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_LPRX_ENA) {
    if (mvmvif->dbgfs_pm.lprx_ena) {
      cmd->flags |= cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK);
    } else {
      cmd->flags &= cpu_to_le16(~POWER_FLAGS_LPRX_ENA_MSK);
    }
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD) {
    cmd->lprx_rssi_threshold = mvmvif->dbgfs_pm.lprx_rssi_threshold;
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_SNOOZE_ENABLE) {
    if (mvmvif->dbgfs_pm.snooze_ena) {
      cmd->flags |= cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK);
    } else {
      cmd->flags &= cpu_to_le16(~POWER_FLAGS_SNOOZE_ENA_MSK);
    }
  }
  if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_UAPSD_MISBEHAVING) {
    uint16_t flag = POWER_FLAGS_UAPSD_MISBEHAVING_ENA_MSK;
    if (mvmvif->dbgfs_pm.uapsd_misbehaving) {
      cmd->flags |= cpu_to_le16(flag);
    } else {
      cmd->flags &= cpu_to_le16(flag);
    }
  }
#endif /* CPTCFG_IWLWIFI_DEBUGFS */
}

static int iwl_mvm_power_send_cmd(struct iwl_mvm* mvm, struct iwl_mvm_vif* mvmvif) {
  struct iwl_mac_power_cmd cmd = {};

  iwl_mvm_power_build_cmd(mvm, mvmvif, &cmd, mvm->fwrt.cur_fw_img != IWL_UCODE_WOWLAN);
  iwl_mvm_power_log(mvm, &cmd);
#ifdef CPTCFG_IWLWIFI_DEBUGFS
  memcpy(&iwl_mvm_vif_from_mac80211(vif)->mac_pwr_cmd, &cmd, sizeof(cmd));
#endif

  return iwl_mvm_send_cmd_pdu(mvm, MAC_PM_POWER_TABLE, 0, sizeof(cmd), &cmd);
}

zx_status_t iwl_mvm_power_update_device(struct iwl_mvm* mvm) {
  struct iwl_device_power_cmd cmd = {
      .flags = 0,
  };

  if (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM) {
    mvm->ps_disabled = true;
  }

  if (!mvm->ps_disabled) {
    cmd.flags |= cpu_to_le16(DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK);
  }

#ifdef CPTCFG_IWLWIFI_DEBUGFS
  if ((mvm->fwrt.cur_fw_img == IWL_UCODE_WOWLAN) ? mvm->disable_power_off_d3
                                                 : mvm->disable_power_off) {
    cmd.flags &= cpu_to_le16(~DEVICE_POWER_FLAGS_POWER_SAVE_ENA_MSK);
  }
#endif
  IWL_DEBUG_POWER(mvm, "Sending device power command with flags = 0x%X\n", cmd.flags);

  return iwl_mvm_send_cmd_pdu(mvm, POWER_TABLE_CMD, 0, sizeof(cmd), &cmd);
}

#if 0   // NEEDS_PORTING
void iwl_mvm_power_vif_assoc(struct iwl_mvm* mvm, struct ieee80211_vif* vif) {
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);

  if (memcmp(vif->bss_conf.bssid, mvmvif->uapsd_misbehaving_bssid, ETH_ALEN)) {
    eth_zero_addr(mvmvif->uapsd_misbehaving_bssid);
  }
}

static void iwl_mvm_power_uapsd_misbehav_ap_iterator(void* _data, uint8_t* mac,
                                                     struct ieee80211_vif* vif) {
  uint8_t* ap_sta_id = _data;
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);

  /* The ap_sta_id is not expected to change during current association
   * so no explicit protection is needed
   */
  if (mvmvif->ap_sta_id == *ap_sta_id) {
    memcpy(mvmvif->uapsd_misbehaving_bssid, vif->bss_conf.bssid, ETH_ALEN);
  }
}

void iwl_mvm_power_uapsd_misbehaving_ap_notif(struct iwl_mvm* mvm, struct iwl_rx_cmd_buffer* rxb) {
  struct iwl_rx_packet* pkt = rxb_addr(rxb);
  struct iwl_uapsd_misbehaving_ap_notif* notif = (void*)pkt->data;
  uint8_t ap_sta_id = le32_to_cpu(notif->sta_id);

  ieee80211_iterate_active_interfaces_atomic(mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
                                             iwl_mvm_power_uapsd_misbehav_ap_iterator, &ap_sta_id);
}
#endif  // NEEDS_PORTING

struct iwl_power_vifs {
  struct iwl_mvm* mvm;
  struct iwl_mvm_vif* bss_vif;
  struct iwl_mvm_vif* p2p_vif;
  struct iwl_mvm_vif* ap_vif;
  struct iwl_mvm_vif* monitor_vif;
  bool p2p_active;
  bool bss_active;
  bool ap_active;
  bool monitor_active;
};

static void iwl_mvm_power_disable_pm_iterator(void* _data, struct iwl_mvm_vif* mvmvif) {
  mvmvif->pm_enabled = false;
}

static void iwl_mvm_power_ps_disabled_iterator(void* _data, struct iwl_mvm_vif* mvmvif) {
  bool* disable_ps = _data;

  if (mvmvif->phy_ctxt && mvmvif->phy_ctxt->id < NUM_PHY_CTX) {
    *disable_ps |= mvmvif->ps_disabled;
  }
}

static void iwl_mvm_power_get_vifs_iterator(void* _data, struct iwl_mvm_vif* mvmvif) {
  struct iwl_power_vifs* power_iterator = _data;
  bool active = mvmvif->phy_ctxt && mvmvif->phy_ctxt->id < NUM_PHY_CTX;

  switch (mvmvif->mac_role) {
#if 0   // NEEDS_PORTING
    case NL80211_IFTYPE_P2P_DEVICE:
    case NL80211_IFTYPE_NAN:
      break;

    case NL80211_IFTYPE_P2P_GO:
    case NL80211_IFTYPE_AP:
      /* only a single MAC of the same type */
      WARN_ON(power_iterator->ap_vif);
      power_iterator->ap_vif = vif;
      if (active) {
        power_iterator->ap_active = true;
      }
      break;

    case NL80211_IFTYPE_MONITOR:
      /* only a single MAC of the same type */
      WARN_ON(power_iterator->monitor_vif);
      power_iterator->monitor_vif = vif;
      if (active) {
        power_iterator->monitor_active = true;
      }
      break;

    case NL80211_IFTYPE_P2P_CLIENT:
      /* only a single MAC of the same type */
      WARN_ON(power_iterator->p2p_vif);
      power_iterator->p2p_vif = vif;
      if (active) {
        power_iterator->p2p_active = true;
      }
      break;
#endif  // NEEDS_PORTING

    case WLAN_MAC_ROLE_CLIENT:
      power_iterator->bss_vif = mvmvif;
      if (active) {
        power_iterator->bss_active = true;
      }
      break;

    default:
      IWL_WARN(mvmvif, "unsupported MAC role (%d) in iwl_mvm_power_get_vifs_iterator()\n",
               mvmvif->mac_role);
      ZX_DEBUG_ASSERT(false);  // should never been here.
      break;
  }
}

// Updates each interface's "pm_enabled" field.
//
static void iwl_mvm_power_set_pm(struct iwl_mvm* mvm, struct iwl_power_vifs* vifs) {
  struct iwl_mvm_vif* bss_mvmvif = NULL;
  struct iwl_mvm_vif* p2p_mvmvif = NULL;
  struct iwl_mvm_vif* ap_mvmvif = NULL;
  bool client_same_channel = false;
  bool ap_same_channel = false;

  iwl_assert_lock_held(&mvm->mutex);

  /* set pm_enable to false */
  ieee80211_iterate_active_interfaces_atomic(mvm, iwl_mvm_power_disable_pm_iterator, NULL);

  if (vifs->bss_vif) {
    bss_mvmvif = vifs->bss_vif;
  }

  if (vifs->p2p_vif) {
    p2p_mvmvif = vifs->p2p_vif;
  }

  if (vifs->ap_vif) {
    ap_mvmvif = vifs->ap_vif;
  }

#if 0   // NEEDS_PORTING
  // TODO(45833): TDLS support
  /* don't allow PM if any TDLS stations exist */
  if (iwl_mvm_tdls_sta_count(mvm, NULL)) {
    return;
  }
#endif  // NEEDS_PORTING

  /* enable PM on bss if bss stand alone */
  if (vifs->bss_active && !vifs->p2p_active && !vifs->ap_active) {
    bss_mvmvif->pm_enabled = true;
    return;
  }

  /* enable PM on p2p if p2p stand alone */
  if (vifs->p2p_active && !vifs->bss_active && !vifs->ap_active) {
    p2p_mvmvif->pm_enabled = true;
    return;
  }

  if (vifs->bss_active && vifs->p2p_active) {
    client_same_channel = (bss_mvmvif->phy_ctxt->id == p2p_mvmvif->phy_ctxt->id);
  }
  if (vifs->bss_active && vifs->ap_active) {
    ap_same_channel = (bss_mvmvif->phy_ctxt->id == ap_mvmvif->phy_ctxt->id);
  }

  /* clients are not stand alone: enable PM if DCM */
  if (!(client_same_channel || ap_same_channel)) {
    if (vifs->bss_active) {
      bss_mvmvif->pm_enabled = true;
    }
    if (vifs->p2p_active) {
      p2p_mvmvif->pm_enabled = true;
    }
    return;
  }

  /*
   * There is only one channel in the system and there are only
   * bss and p2p clients that share it
   */
  if (client_same_channel && !vifs->ap_active) {
    /* share same channel*/
    bss_mvmvif->pm_enabled = true;
    p2p_mvmvif->pm_enabled = true;
  }
}

#if 0  // NEEDS_PORTING
#ifdef CPTCFG_IWLWIFI_DEBUGFS
int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm* mvm, struct ieee80211_vif* vif, char* buf,
                                 int bufsz) {
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);
  struct iwl_mac_power_cmd cmd = {};
  int pos = 0;

  mutex_lock(&mvm->mutex);
  memcpy(&cmd, &mvmvif->mac_pwr_cmd, sizeof(cmd));
  mutex_unlock(&mvm->mutex);

  pos += scnprintf(buf + pos, bufsz - pos, "power_scheme = %d\n", iwlmvm_mod_params.power_scheme);
  pos += scnprintf(buf + pos, bufsz - pos, "flags = 0x%x\n", le16_to_cpu(cmd.flags));
  pos +=
      scnprintf(buf + pos, bufsz - pos, "keep_alive = %d\n", le16_to_cpu(cmd.keep_alive_seconds));

  if (!(cmd.flags & cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK))) {
    return pos;
  }

  pos += scnprintf(buf + pos, bufsz - pos, "skip_over_dtim = %d\n",
                   (cmd.flags & cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK)) ? 1 : 0);
  pos += scnprintf(buf + pos, bufsz - pos, "skip_dtim_periods = %d\n", cmd.skip_dtim_periods);
  if (!(cmd.flags & cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK))) {
    pos += scnprintf(buf + pos, bufsz - pos, "rx_data_timeout = %d\n",
                     le32_to_cpu(cmd.rx_data_timeout));
    pos += scnprintf(buf + pos, bufsz - pos, "tx_data_timeout = %d\n",
                     le32_to_cpu(cmd.tx_data_timeout));
  }
  if (cmd.flags & cpu_to_le16(POWER_FLAGS_LPRX_ENA_MSK))
    pos += scnprintf(buf + pos, bufsz - pos, "lprx_rssi_threshold = %d\n", cmd.lprx_rssi_threshold);

  if (!(cmd.flags & cpu_to_le16(POWER_FLAGS_ADVANCE_PM_ENA_MSK))) {
    return pos;
  }

  pos += scnprintf(buf + pos, bufsz - pos, "rx_data_timeout_uapsd = %d\n",
                   le32_to_cpu(cmd.rx_data_timeout_uapsd));
  pos += scnprintf(buf + pos, bufsz - pos, "tx_data_timeout_uapsd = %d\n",
                   le32_to_cpu(cmd.tx_data_timeout_uapsd));
  pos += scnprintf(buf + pos, bufsz - pos, "qndp_tid = %d\n", cmd.qndp_tid);
  pos += scnprintf(buf + pos, bufsz - pos, "uapsd_ac_flags = 0x%x\n", cmd.uapsd_ac_flags);
  pos += scnprintf(buf + pos, bufsz - pos, "uapsd_max_sp = %d\n", cmd.uapsd_max_sp);
  pos +=
      scnprintf(buf + pos, bufsz - pos, "heavy_tx_thld_packets = %d\n", cmd.heavy_tx_thld_packets);
  pos +=
      scnprintf(buf + pos, bufsz - pos, "heavy_rx_thld_packets = %d\n", cmd.heavy_rx_thld_packets);
  pos += scnprintf(buf + pos, bufsz - pos, "heavy_tx_thld_percentage = %d\n",
                   cmd.heavy_tx_thld_percentage);
  pos += scnprintf(buf + pos, bufsz - pos, "heavy_rx_thld_percentage = %d\n",
                   cmd.heavy_rx_thld_percentage);
  pos += scnprintf(buf + pos, bufsz - pos, "uapsd_misbehaving_enable = %d\n",
                   (cmd.flags & cpu_to_le16(POWER_FLAGS_UAPSD_MISBEHAVING_ENA_MSK)) ? 1 : 0);

  if (!(cmd.flags & cpu_to_le16(POWER_FLAGS_SNOOZE_ENA_MSK))) {
    return pos;
  }

  pos += scnprintf(buf + pos, bufsz - pos, "snooze_interval = %d\n", cmd.snooze_interval);
  pos += scnprintf(buf + pos, bufsz - pos, "snooze_window = %d\n", cmd.snooze_window);

  return pos;
}

void iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif* vif,
                                              struct iwl_beacon_filter_cmd* cmd) {
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);
  struct iwl_dbgfs_bf* dbgfs_bf = &mvmvif->dbgfs_bf;

  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_ENERGY_DELTA) {
    cmd->bf_energy_delta = cpu_to_le32(dbgfs_bf->bf_energy_delta);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA) {
    cmd->bf_roaming_energy_delta = cpu_to_le32(dbgfs_bf->bf_roaming_energy_delta);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_ROAMING_STATE) {
    cmd->bf_roaming_state = cpu_to_le32(dbgfs_bf->bf_roaming_state);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_TEMP_THRESHOLD) {
    cmd->bf_temp_threshold = cpu_to_le32(dbgfs_bf->bf_temp_threshold);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_TEMP_FAST_FILTER) {
    cmd->bf_temp_fast_filter = cpu_to_le32(dbgfs_bf->bf_temp_fast_filter);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_TEMP_SLOW_FILTER) {
    cmd->bf_temp_slow_filter = cpu_to_le32(dbgfs_bf->bf_temp_slow_filter);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_DEBUG_FLAG) {
    cmd->bf_debug_flag = cpu_to_le32(dbgfs_bf->bf_debug_flag);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BF_ESCAPE_TIMER) {
    cmd->bf_escape_timer = cpu_to_le32(dbgfs_bf->bf_escape_timer);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BA_ESCAPE_TIMER) {
    cmd->ba_escape_timer = cpu_to_le32(dbgfs_bf->ba_escape_timer);
  }
  if (dbgfs_bf->mask & MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT) {
    cmd->ba_enable_beacon_abort = cpu_to_le32(dbgfs_bf->ba_enable_beacon_abort);
  }
}
#endif

#endif  // NEEDS_PORTING
static zx_status_t _iwl_mvm_enable_beacon_filter(struct iwl_mvm_vif* mvmvif,
                                                 struct iwl_beacon_filter_cmd* cmd,
                                                 uint32_t cmd_flags, bool d0i3) {
  struct iwl_mvm* mvm = mvmvif->mvm;

  if (mvmvif != mvm->bf_allowed_vif || !mvmvif->bss_conf.dtim_period ||
      mvmvif->mac_role != WLAN_MAC_ROLE_CLIENT || mvmvif->p2p) {
    return ZX_OK;
  }

  iwl_mvm_beacon_filter_set_cqm_params(mvmvif, cmd, d0i3);
#if 0   // NEEDS_PORTING
  if (!d0i3) {
    iwl_mvm_beacon_filter_debugfs_parameters(vif, cmd);
  }
#endif  // NEEDS_PORTING
  zx_status_t ret = iwl_mvm_beacon_filter_send_cmd(mvm, cmd, cmd_flags);

  /* don't change bf_enabled in case of temporary d0i3 configuration */
  if (ret == ZX_OK && !d0i3) {
    mvmvif->bf_data.bf_enabled = true;
  }

  return ret;
}

zx_status_t iwl_mvm_enable_beacon_filter(struct iwl_mvm_vif* mvmvif, uint32_t 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(mvmvif, &cmd, flags, false);
}

static zx_status_t _iwl_mvm_disable_beacon_filter(struct iwl_mvm_vif* mvmvif, uint32_t flags,
                                                  bool d0i3) {
  struct iwl_beacon_filter_cmd cmd = {};

  if (mvmvif->mac_role != WLAN_MAC_ROLE_CLIENT || mvmvif->p2p) {
    return ZX_OK;
  }

  zx_status_t ret = iwl_mvm_beacon_filter_send_cmd(mvmvif->mvm, &cmd, flags);

  /* don't change bf_enabled in case of temporary d0i3 configuration */
  if (ret == ZX_OK && !d0i3) {
    mvmvif->bf_data.bf_enabled = false;
  }

  return ret;
}

zx_status_t iwl_mvm_disable_beacon_filter(struct iwl_mvm_vif* mvmvif, uint32_t flags) {
  return _iwl_mvm_disable_beacon_filter(mvmvif, flags, false);
}

static zx_status_t iwl_mvm_power_set_ps(struct iwl_mvm* mvm) {
  bool disable_ps;
  zx_status_t ret;

  /* disable PS if CAM */
  disable_ps = (iwlmvm_mod_params.power_scheme == IWL_POWER_SCHEME_CAM);
  /* ...or if any of the vifs require PS to be off */
  ieee80211_iterate_active_interfaces_atomic(mvm, iwl_mvm_power_ps_disabled_iterator, &disable_ps);

  /* update device power state if it has changed */
  if (mvm->ps_disabled != disable_ps) {
    bool old_ps_disabled = mvm->ps_disabled;

    mvm->ps_disabled = disable_ps;
    ret = iwl_mvm_power_update_device(mvm);
    if (ret != ZX_OK) {
      mvm->ps_disabled = old_ps_disabled;
      return ret;
    }
  }

  return ZX_OK;
}

#if 0   // NEEDS_PORTING
static int iwl_mvm_power_set_ba(struct iwl_mvm* mvm, struct ieee80211_vif* vif) {
  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->fwrt.cur_fw_img == IWL_UCODE_WOWLAN) {
    cmd.ba_escape_timer = cpu_to_le32(IWL_BA_ESCAPE_TIMER_D3);
  }

  mvmvif->bf_data.ba_enabled = !(!mvmvif->pm_enabled || mvm->ps_disabled || !vif->bss_conf.ps ||
                                 iwl_mvm_vif_low_latency(mvmvif));

  return _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd, 0, false);
}

int iwl_mvm_power_update_ps(struct iwl_mvm* mvm) {
  struct iwl_power_vifs vifs = {
      .mvm = mvm,
  };
  int ret;

  iwl_assert_lock_held(&mvm->mutex);

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

  ret = iwl_mvm_power_set_ps(mvm);
  if (ret) {
    return ret;
  }

  if (vifs.bss_vif) {
    return iwl_mvm_power_set_ba(mvm, vifs.bss_vif);
  }

  return 0;
}
#endif  // NEEDS_PORTING

zx_status_t iwl_mvm_power_update_mac(struct iwl_mvm* mvm) {
  struct iwl_power_vifs vifs = {
      .mvm = mvm,
  };
  zx_status_t ret;

  iwl_assert_lock_held(&mvm->mutex);

  /* get vifs info */
  ieee80211_iterate_active_interfaces_atomic(mvm, iwl_mvm_power_get_vifs_iterator, &vifs);

  iwl_mvm_power_set_pm(mvm, &vifs);

  ret = iwl_mvm_power_set_ps(mvm);
  if (ret != ZX_OK) {
    IWL_ERR(mvm, "%s(): cannot set power saving: %s\n", __func__, zx_status_get_string(ret));
    return ret;
  }

  if (vifs.bss_vif) {
    ret = iwl_mvm_power_send_cmd(mvm, vifs.bss_vif);
    if (ret) {
      IWL_ERR(mvm, "%s(): cannot set vifs.bss_vif: %s\n", __func__, zx_status_get_string(ret));
      return ret;
    }
  }

  if (vifs.p2p_vif) {
    ret = iwl_mvm_power_send_cmd(mvm, vifs.p2p_vif);
    if (ret) {
      IWL_ERR(mvm, "%s(): cannot set vifs.p2p_vif: %s\n", __func__, zx_status_get_string(ret));
      return ret;
    }
  }

#if 0   // NEEDS_PORTING
  if (vifs.bss_vif) {
    return iwl_mvm_power_set_ba(mvm, vifs.bss_vif);
  }
#endif  // NEEDS_PORTING

  return ZX_OK;
}

#if 0  // NEEDS_PORTING
int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm* mvm, struct ieee80211_vif* vif, bool enable,
                                   uint32_t 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, !enable);

  iwl_mvm_power_log(mvm, &cmd);
#ifdef CPTCFG_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),
    };
    /*
     * When beacon storing is supported - disable beacon filtering
     * altogether - the latest beacon will be sent when exiting d0i3
     */
    if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_BEACON_STORING)) {
      ret = _iwl_mvm_disable_beacon_filter(mvm, vif, flags, true);
    } else {
      ret = _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd_bf, flags, true);
    }
  } else {
    if (mvmvif->bf_data.bf_enabled) {
      ret = iwl_mvm_enable_beacon_filter(mvm, vif, flags);
    } else {
      ret = iwl_mvm_disable_beacon_filter(mvm, vif, flags);
    }
  }

  return ret;
}
#endif  // NEEDS_PORTING
