/******************************************************************************
 *
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
 * Copyright(c) 2018        Intel Corporation
 * 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.
 *
 *****************************************************************************/

#include <stdbool.h>
#include <threads.h>
#include <zircon/syscalls.h>
#include <zircon/compiler.h>

#include <ddk/hw/wlan/ieee80211/c/banjo.h>

#if 0  // NEEDS_PORTING
#include "fw-api.h"
#include "src/iwlwifi/fw/acpi.h"
#endif  // NEEDS_PORTING
#include "src/iwlwifi/fw/api/nan.h"
#include "src/iwlwifi/fw/api/scan.h"
#include "src/iwlwifi/fw/dbg.h"
#include "src/iwlwifi/fw/img.h"
#include "src/iwlwifi/fw/notif-wait.h"
#include "src/iwlwifi/iwl-csr.h"
#include "src/iwlwifi/iwl-debug.h"
#include "src/iwlwifi/iwl-drv.h"
#include "src/iwlwifi/iwl-eeprom-parse.h"
#include "src/iwlwifi/iwl-io.h"
#include "src/iwlwifi/iwl-modparams.h"
#include "src/iwlwifi/iwl-op-mode.h"
#include "src/iwlwifi/iwl-phy-db.h"
#include "src/iwlwifi/iwl-prph.h"
#include "src/iwlwifi/iwl-trans.h"
#include "src/iwlwifi/mvm/mvm.h"
#include "src/iwlwifi/mvm/rs.h"
#include "src/iwlwifi/mvm/time-event.h"

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
#include "src/iwlwifi/iwl-dnt-cfg.h"
#include "src/iwlwifi/iwl-dnt-dispatch.h"
#include "src/iwlwifi/iwl-tm-gnl.h"
#endif

#define KBUILD_MODNAME "iwlwifi"
#define DRV_DESCRIPTION "The new Intel(R) wireless AGN driver for Linux"

static const struct iwl_op_mode_ops iwl_mvm_ops;
static const struct iwl_op_mode_ops iwl_mvm_ops_mq;

struct iwl_mvm_mod_params iwlmvm_mod_params = {
    .power_scheme = IWL_POWER_SCHEME_BPS, .tfd_q_hang_detect = true
    /* rest of fields are 0 by default */
};

#if 0   // NEEDS_PORTING
module_param_named(init_dbg, iwlmvm_mod_params.init_dbg, bool, 0444);
MODULE_PARM_DESC(init_dbg, "set to true to debug an ASSERT in INIT fw (default: false");
module_param_named(power_scheme, iwlmvm_mod_params.power_scheme, int, 0444);
MODULE_PARM_DESC(power_scheme,
                 "power management scheme: 1-active, 2-balanced, 3-low power, default: 2");
module_param_named(tfd_q_hang_detect, iwlmvm_mod_params.tfd_q_hang_detect, bool, 0444);
MODULE_PARM_DESC(tfd_q_hang_detect, "TFD queues hang detection (default: true");
#endif  // NEEDS_PORTING

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
static void iwl_mvm_rx_fw_logs(struct iwl_mvm* mvm, struct iwl_rx_cmd_buffer* rxb) {
  iwl_dnt_dispatch_collect_ucode_message(mvm->trans, rxb);
}
#endif

/*
 * module init and exit functions
 */
zx_status_t iwl_mvm_init(void) {
  zx_status_t ret;

#if 0   // NEEDS_PORTING
    ret = iwl_mvm_rate_control_register();
    if (ret) {
        zxlogf(ERROR, "Unable to register rate control algorithm: %d", ret);
        return ret;
    }
#endif  // NEEDS_PORTING

  ret = iwl_opmode_register("iwlmvm", &iwl_mvm_ops);
  if (ret) {
    zxlogf(ERROR, "Unable to register MVM op_mode: %d", ret);
  }

  return ret;
}

void iwl_mvm_exit(void) {
  iwl_opmode_deregister("iwlmvm");
#if 0   // NEEDS_PORTING
    iwl_mvm_rate_control_unregister();
#endif  // NEEDS_PORTING
}

static void iwl_mvm_nic_config(struct iwl_op_mode* op_mode) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  uint8_t radio_cfg_type, radio_cfg_step, radio_cfg_dash;
  uint32_t reg_val = 0;
  uint32_t phy_config = iwl_mvm_get_phy_config(mvm);

  radio_cfg_type = (phy_config & FW_PHY_CFG_RADIO_TYPE) >> FW_PHY_CFG_RADIO_TYPE_POS;
  radio_cfg_step = (phy_config & FW_PHY_CFG_RADIO_STEP) >> FW_PHY_CFG_RADIO_STEP_POS;
  radio_cfg_dash = (phy_config & FW_PHY_CFG_RADIO_DASH) >> FW_PHY_CFG_RADIO_DASH_POS;

  /* SKU control */
  reg_val |= CSR_HW_REV_STEP(mvm->trans->hw_rev) << CSR_HW_IF_CONFIG_REG_POS_MAC_STEP;
  reg_val |= CSR_HW_REV_DASH(mvm->trans->hw_rev) << CSR_HW_IF_CONFIG_REG_POS_MAC_DASH;

  /* radio configuration */
  reg_val |= radio_cfg_type << CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE;
  reg_val |= radio_cfg_step << CSR_HW_IF_CONFIG_REG_POS_PHY_STEP;
  reg_val |= radio_cfg_dash << CSR_HW_IF_CONFIG_REG_POS_PHY_DASH;

  WARN_ON((radio_cfg_type << CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE) &
          ~CSR_HW_IF_CONFIG_REG_MSK_PHY_TYPE);

  /*
   * TODO: Bits 7-8 of CSR in 8000 HW family and higher set the ADC
   * sampling, and shouldn't be set to any non-zero value.
   * The same is supposed to be true of the other HW, but unsetting
   * them (such as the 7260) causes automatic tests to fail on seemingly
   * unrelated errors. Need to further investigate this, but for now
   * we'll separate cases.
   */
  if (mvm->trans->cfg->device_family < IWL_DEVICE_FAMILY_8000) {
    reg_val |= CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI;
  }

  if (iwl_fw_dbg_is_d3_debug_enabled(&mvm->fwrt)) {
    reg_val |= CSR_HW_IF_CONFIG_REG_D3_DEBUG;
  }

  iwl_trans_set_bits_mask(
      mvm->trans, CSR_HW_IF_CONFIG_REG,
      CSR_HW_IF_CONFIG_REG_MSK_MAC_DASH | CSR_HW_IF_CONFIG_REG_MSK_MAC_STEP |
          CSR_HW_IF_CONFIG_REG_MSK_PHY_TYPE | CSR_HW_IF_CONFIG_REG_MSK_PHY_STEP |
          CSR_HW_IF_CONFIG_REG_MSK_PHY_DASH | CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
          CSR_HW_IF_CONFIG_REG_BIT_MAC_SI | CSR_HW_IF_CONFIG_REG_D3_DEBUG,
      reg_val);

  IWL_DEBUG_INFO(mvm, "Radio type=0x%x-0x%x-0x%x\n", radio_cfg_type, radio_cfg_step,
                 radio_cfg_dash);

#if 0   // NEEDS_PORTING
    /*
     * W/A : NIC is stuck in a reset state after Early PCIe power off
     * (PCIe power is lost before PERST# is asserted), causing ME FW
     * to lose ownership and not being able to obtain it back.
     */
    if (!mvm->trans->cfg->apmg_not_supported)
        iwl_set_bits_mask_prph(mvm->trans, APMG_PS_CTRL_REG, APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
                               ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
#endif  // NEEDS_PORTING
}

#ifdef CPTCFG_IWLWIFI_DEBUG_HOST_CMD_ENABLED
/* A stub notification handler to receive Debug Host Notification (DHN).
 * The notification handler is empty because the report is processed by
 * trace-cmd and not by the driver
 */
static void iwl_mvm_rx_dhn(struct iwl_mvm* mvm, struct iwl_rx_cmd_buffer* rxb) {
  struct iwl_rx_packet* pkt = rxb_addr(rxb);
  struct iwl_dhn_hdr* notif = (void*)pkt->data;

  uint32_t length = le32_to_cpu(notif->length);
  uint32_t index_and_mask = le32_to_cpu(notif->index_and_mask);

  IWL_DEBUG_INFO(mvm,
                 "Received Debug Host Notifcation:\n"
                 "length: %u\n"
                 "index and mask: 0x%x\n",
                 length, index_and_mask);
}
#endif /* CPTCFG_IWLWIFI_DEBUG_HOST_CMD_ENABLED */

/**
 * enum iwl_rx_handler_context context for Rx handler
 * @RX_HANDLER_SYNC : this means that it will be called in the Rx path
 *  which can't acquire mvm->mutex.
 * @RX_HANDLER_ASYNC_LOCKED : If the handler needs to hold mvm->mutex
 *  (and only in this case!), it should be set as ASYNC. In that case,
 *  it will be called from a worker with mvm->mutex held.
 * @RX_HANDLER_ASYNC_UNLOCKED : in case the handler needs to lock the
 *  mutex itself, it will be called from a worker without mvm->mutex held.
 */
enum iwl_rx_handler_context {
  RX_HANDLER_SYNC,
  RX_HANDLER_ASYNC_LOCKED,
  RX_HANDLER_ASYNC_UNLOCKED,
};

/**
 * struct iwl_rx_handlers handler for FW notification
 * @cmd_id: command id
 * @context: see &iwl_rx_handler_context
 * @fn: the function is called when notification is received
 */
struct iwl_rx_handlers {
  uint16_t cmd_id;
  enum iwl_rx_handler_context context;
  void (*fn)(struct iwl_mvm* mvm, struct iwl_rx_cmd_buffer* rxb);
};

#define RX_HANDLER(_cmd_id, _fn, _context) \
  { .cmd_id = _cmd_id, .fn = _fn, .context = _context }
#define RX_HANDLER_GRP(_grp, _cmd, _fn, _context) \
  { .cmd_id = WIDE_ID(_grp, _cmd), .fn = _fn, .context = _context }

/*
 * Handlers for fw notifications
 * Convention: RX_HANDLER(CMD_NAME, iwl_mvm_rx_CMD_NAME
 * This list should be in order of frequency for performance purposes.
 *
 * The handler can be one from three contexts, see &iwl_rx_handler_context
 */
static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {
    RX_HANDLER(TX_CMD, iwl_mvm_rx_tx_cmd, RX_HANDLER_SYNC),
    RX_HANDLER(BA_NOTIF, iwl_mvm_rx_ba_notif, RX_HANDLER_SYNC),

#if 0   // NEEDS_PORTING
    RX_HANDLER_GRP(DATA_PATH_GROUP, TLC_MNG_UPDATE_NOTIF, iwl_mvm_tlc_update_notif,
                   RX_HANDLER_SYNC),

    RX_HANDLER(BT_PROFILE_NOTIFICATION, iwl_mvm_rx_bt_coex_notif, RX_HANDLER_ASYNC_LOCKED),
    RX_HANDLER(BEACON_NOTIFICATION, iwl_mvm_rx_beacon_notif, RX_HANDLER_ASYNC_LOCKED),
    RX_HANDLER(STATISTICS_NOTIFICATION, iwl_mvm_rx_statistics, RX_HANDLER_ASYNC_LOCKED),

    RX_HANDLER(BA_WINDOW_STATUS_NOTIFICATION_ID, iwl_mvm_window_status_notif, RX_HANDLER_SYNC),

    RX_HANDLER(TIME_EVENT_NOTIFICATION, iwl_mvm_rx_time_event_notif, RX_HANDLER_SYNC),
    RX_HANDLER(MCC_CHUB_UPDATE_CMD, iwl_mvm_rx_chub_update_mcc, RX_HANDLER_ASYNC_LOCKED),

    RX_HANDLER(EOSP_NOTIFICATION, iwl_mvm_rx_eosp_notif, RX_HANDLER_SYNC),

    RX_HANDLER(SCAN_ITERATION_COMPLETE, iwl_mvm_rx_lmac_scan_iter_complete_notif, RX_HANDLER_SYNC),
#endif  // NEEDS_PORTING
    // TODO(79965): Add support for handler with RX_HANDLER_ASYNC_LOCKED.
    RX_HANDLER(SCAN_OFFLOAD_COMPLETE, iwl_mvm_rx_lmac_scan_complete_notif, RX_HANDLER_SYNC),
    RX_HANDLER(SCAN_COMPLETE_UMAC, iwl_mvm_rx_umac_scan_complete_notif, RX_HANDLER_SYNC),
#if 0  // NEEDS_PORTING
    RX_HANDLER(MATCH_FOUND_NOTIFICATION, iwl_mvm_rx_scan_match_found, RX_HANDLER_SYNC),
    RX_HANDLER(SCAN_ITERATION_COMPLETE_UMAC, iwl_mvm_rx_umac_scan_iter_complete_notif,
               RX_HANDLER_SYNC),

    RX_HANDLER(CARD_STATE_NOTIFICATION, iwl_mvm_rx_card_state_notif, RX_HANDLER_SYNC),

    RX_HANDLER(MISSED_BEACONS_NOTIFICATION, iwl_mvm_rx_missed_beacons_notif, RX_HANDLER_SYNC),

    RX_HANDLER(REPLY_ERROR, iwl_mvm_rx_fw_error, RX_HANDLER_SYNC),
    RX_HANDLER(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION, iwl_mvm_power_uapsd_misbehaving_ap_notif,
               RX_HANDLER_SYNC),
    RX_HANDLER(DTS_MEASUREMENT_NOTIFICATION, iwl_mvm_temp_notif, RX_HANDLER_ASYNC_LOCKED),
    RX_HANDLER_GRP(PHY_OPS_GROUP, DTS_MEASUREMENT_NOTIF_WIDE, iwl_mvm_temp_notif,
                   RX_HANDLER_ASYNC_UNLOCKED),
    RX_HANDLER_GRP(PHY_OPS_GROUP, CT_KILL_NOTIFICATION, iwl_mvm_ct_kill_notif, RX_HANDLER_SYNC),

    RX_HANDLER(TDLS_CHANNEL_SWITCH_NOTIFICATION, iwl_mvm_rx_tdls_notif, RX_HANDLER_ASYNC_LOCKED),
    RX_HANDLER(MFUART_LOAD_NOTIFICATION, iwl_mvm_rx_mfuart_notif, RX_HANDLER_SYNC),
    RX_HANDLER(TOF_NOTIFICATION, iwl_mvm_tof_resp_handler, RX_HANDLER_ASYNC_LOCKED),
    RX_HANDLER_GRP(DEBUG_GROUP, MFU_ASSERT_DUMP_NTF, iwl_mvm_mfu_assert_dump_notif,
                   RX_HANDLER_SYNC),
    RX_HANDLER_GRP(PROT_OFFLOAD_GROUP, STORED_BEACON_NTF, iwl_mvm_rx_stored_beacon_notif,
                   RX_HANDLER_SYNC),
    RX_HANDLER_GRP(DATA_PATH_GROUP, MU_GROUP_MGMT_NOTIF, iwl_mvm_mu_mimo_grp_notif,
                   RX_HANDLER_SYNC),
    RX_HANDLER_GRP(DATA_PATH_GROUP, STA_PM_NOTIF, iwl_mvm_sta_pm_notif, RX_HANDLER_SYNC),
#ifdef CPTCFG_IWLMVM_VENDOR_CMDS
    RX_HANDLER_GRP(NAN_GROUP, NAN_DISCOVERY_TERMINATE_NOTIF, iwl_mvm_nan_de_term_notif,
                   RX_HANDLER_SYNC),
    RX_HANDLER_GRP(NAN_GROUP, NAN_DISCOVERY_EVENT_NOTIF, iwl_mvm_nan_match, RX_HANDLER_SYNC),
    RX_HANDLER_GRP(MAC_CONF_GROUP, PROBE_RESPONSE_DATA_NOTIF, iwl_mvm_probe_resp_data_notif,
                   RX_HANDLER_ASYNC_LOCKED),
    RX_HANDLER_GRP(MAC_CONF_GROUP, CHANNEL_SWITCH_NOA_NOTIF, iwl_mvm_channel_switch_noa_notif,
                   RX_HANDLER_SYNC),

#endif

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
    RX_HANDLER(DEBUG_LOG_MSG, iwl_mvm_rx_fw_logs, RX_HANDLER_SYNC),
#endif
#ifdef CPTCFG_IWLWIFI_DEBUG_HOST_CMD_ENABLED
    RX_HANDLER_GRP(DEBUG_GROUP, DEBUG_HOST_NTF, iwl_mvm_rx_dhn, RX_HANDLER_SYNC),
#endif
#endif  // NEEDS_PORTING
};
#undef RX_HANDLER
#undef RX_HANDLER_GRP

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_legacy_names[] = {
    HCMD_NAME(MVM_ALIVE),
    HCMD_NAME(REPLY_ERROR),
    HCMD_NAME(ECHO_CMD),
    HCMD_NAME(INIT_COMPLETE_NOTIF),
    HCMD_NAME(PHY_CONTEXT_CMD),
    HCMD_NAME(DBG_CFG),
    HCMD_NAME(SCAN_CFG_CMD),
    HCMD_NAME(SCAN_REQ_UMAC),
    HCMD_NAME(SCAN_ABORT_UMAC),
    HCMD_NAME(SCAN_COMPLETE_UMAC),
    HCMD_NAME(TOF_CMD),
    HCMD_NAME(TOF_NOTIFICATION),
    HCMD_NAME(BA_WINDOW_STATUS_NOTIFICATION_ID),
    HCMD_NAME(ADD_STA_KEY),
    HCMD_NAME(ADD_STA),
    HCMD_NAME(REMOVE_STA),
    HCMD_NAME(FW_GET_ITEM_CMD),
    HCMD_NAME(TX_CMD),
    HCMD_NAME(SCD_QUEUE_CFG),
    HCMD_NAME(TXPATH_FLUSH),
    HCMD_NAME(MGMT_MCAST_KEY),
    HCMD_NAME(WEP_KEY),
    HCMD_NAME(SHARED_MEM_CFG),
    HCMD_NAME(TDLS_CHANNEL_SWITCH_CMD),
    HCMD_NAME(MAC_CONTEXT_CMD),
    HCMD_NAME(TIME_EVENT_CMD),
    HCMD_NAME(TIME_EVENT_NOTIFICATION),
    HCMD_NAME(BINDING_CONTEXT_CMD),
    HCMD_NAME(TIME_QUOTA_CMD),
    HCMD_NAME(NON_QOS_TX_COUNTER_CMD),
    HCMD_NAME(LEDS_CMD),
#ifdef CPTCFG_IWLWIFI_LTE_COEX
    HCMD_NAME(LTE_COEX_CONFIG_CMD),
    HCMD_NAME(LTE_COEX_WIFI_REPORTED_CHANNEL_CMD),
    HCMD_NAME(LTE_COEX_STATIC_PARAMS_CMD),
    HCMD_NAME(LTE_COEX_SPS_CMD),
#endif
    HCMD_NAME(LQ_CMD),
    HCMD_NAME(FW_PAGING_BLOCK_CMD),
    HCMD_NAME(SCAN_OFFLOAD_REQUEST_CMD),
    HCMD_NAME(SCAN_OFFLOAD_ABORT_CMD),
    HCMD_NAME(HOT_SPOT_CMD),
    HCMD_NAME(SCAN_OFFLOAD_PROFILES_QUERY_CMD),
#ifdef CPTCFG_IWLWIFI_LTE_COEX
    HCMD_NAME(LTE_COEX_FINE_TUNING_PARAMS_CMD),
#endif
    HCMD_NAME(BT_COEX_UPDATE_REDUCED_TXP),
    HCMD_NAME(BT_COEX_CI),
    HCMD_NAME(PHY_CONFIGURATION_CMD),
    HCMD_NAME(CALIB_RES_NOTIF_PHY_DB),
    HCMD_NAME(PHY_DB_CMD),
    HCMD_NAME(SCAN_OFFLOAD_COMPLETE),
    HCMD_NAME(SCAN_OFFLOAD_UPDATE_PROFILES_CMD),
    HCMD_NAME(CONFIG_2G_COEX_CMD),
    HCMD_NAME(POWER_TABLE_CMD),
    HCMD_NAME(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION),
    HCMD_NAME(REPLY_THERMAL_MNG_BACKOFF),
    HCMD_NAME(DC2DC_CONFIG_CMD),
    HCMD_NAME(NVM_ACCESS_CMD),
    HCMD_NAME(BEACON_NOTIFICATION),
    HCMD_NAME(BEACON_TEMPLATE_CMD),
    HCMD_NAME(TX_ANT_CONFIGURATION_CMD),
    HCMD_NAME(BT_CONFIG),
    HCMD_NAME(STATISTICS_CMD),
    HCMD_NAME(STATISTICS_NOTIFICATION),
    HCMD_NAME(EOSP_NOTIFICATION),
    HCMD_NAME(REDUCE_TX_POWER_CMD),
    HCMD_NAME(CARD_STATE_NOTIFICATION),
    HCMD_NAME(MISSED_BEACONS_NOTIFICATION),
    HCMD_NAME(TDLS_CONFIG_CMD),
    HCMD_NAME(MAC_PM_POWER_TABLE),
    HCMD_NAME(TDLS_CHANNEL_SWITCH_NOTIFICATION),
    HCMD_NAME(MFUART_LOAD_NOTIFICATION),
    HCMD_NAME(RSS_CONFIG_CMD),
    HCMD_NAME(SCAN_ITERATION_COMPLETE_UMAC),
    HCMD_NAME(REPLY_RX_PHY_CMD),
    HCMD_NAME(REPLY_RX_MPDU_CMD),
    HCMD_NAME(FRAME_RELEASE),
    HCMD_NAME(BA_NOTIF),
    HCMD_NAME(MCC_UPDATE_CMD),
    HCMD_NAME(MCC_CHUB_UPDATE_CMD),
    HCMD_NAME(MARKER_CMD),
    HCMD_NAME(BT_PROFILE_NOTIFICATION),
    HCMD_NAME(BCAST_FILTER_CMD),
    HCMD_NAME(MCAST_FILTER_CMD),
    HCMD_NAME(REPLY_SF_CFG_CMD),
    HCMD_NAME(REPLY_BEACON_FILTERING_CMD),
    HCMD_NAME(D3_CONFIG_CMD),
    HCMD_NAME(PROT_OFFLOAD_CONFIG_CMD),
    HCMD_NAME(OFFLOADS_QUERY_CMD),
    HCMD_NAME(REMOTE_WAKE_CONFIG_CMD),
    HCMD_NAME(MATCH_FOUND_NOTIFICATION),
    HCMD_NAME(DTS_MEASUREMENT_NOTIFICATION),
    HCMD_NAME(WOWLAN_PATTERNS),
    HCMD_NAME(WOWLAN_CONFIGURATION),
    HCMD_NAME(WOWLAN_TSC_RSC_PARAM),
    HCMD_NAME(WOWLAN_TKIP_PARAM),
    HCMD_NAME(WOWLAN_KEK_KCK_MATERIAL),
    HCMD_NAME(WOWLAN_GET_STATUSES),
    HCMD_NAME(SCAN_ITERATION_COMPLETE),
    HCMD_NAME(D0I3_END_CMD),
    HCMD_NAME(LTR_CONFIG),
    HCMD_NAME(DEBUG_LOG_MSG),
};

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_system_names[] = {
    HCMD_NAME(SHARED_MEM_CFG_CMD),
    HCMD_NAME(SOC_CONFIGURATION_CMD),
    HCMD_NAME(INIT_EXTENDED_CFG_CMD),
};

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_mac_conf_names[] = {
    HCMD_NAME(CHANNEL_SWITCH_NOA_NOTIF),
};

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_phy_names[] = {
    HCMD_NAME(CMD_DTS_MEASUREMENT_TRIGGER_WIDE),
    HCMD_NAME(CTDP_CONFIG_CMD),
    HCMD_NAME(TEMP_REPORTING_THRESHOLDS_CMD),
    HCMD_NAME(GEO_TX_POWER_LIMIT),
    HCMD_NAME(CT_KILL_NOTIFICATION),
    HCMD_NAME(DTS_MEASUREMENT_NOTIF_WIDE),
};

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_data_path_names[] = {
    HCMD_NAME(DQA_ENABLE_CMD),
    HCMD_NAME(UPDATE_MU_GROUPS_CMD),
    HCMD_NAME(TRIGGER_RX_QUEUES_NOTIF_CMD),
    HCMD_NAME(STA_HE_CTXT_CMD),
#ifdef CPTCFG_IWLMVM_AX_SOFTAP_TESTMODE
    HCMD_NAME(AX_SOFTAP_TESTMODE_DL_BASIC),
    HCMD_NAME(AX_SOFTAP_TESTMODE_DL_MU_BAR),
    HCMD_NAME(AX_SOFTAP_TESTMODE_UL),
    HCMD_NAME(AX_SOFTAP_CLIENT_TESTMODE),
#endif
    HCMD_NAME(RFH_QUEUE_CONFIG_CMD),
    HCMD_NAME(STA_PM_NOTIF),
    HCMD_NAME(MU_GROUP_MGMT_NOTIF),
    HCMD_NAME(RX_QUEUES_NOTIFICATION),
};

#ifdef CPTCFG_IWLWIFI_DEBUG_HOST_CMD_ENABLED
/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_debug_names[] = {
#ifdef CPTCFG_IWLWIFI_DEBUG_HOST_CMD_ENABLED
    HCMD_NAME(DEBUG_HOST_NTF),
#endif
    HCMD_NAME(MFU_ASSERT_DUMP_NTF),
};
#endif

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_nan_names[] = {
    HCMD_NAME(NAN_CONFIG_CMD),
    HCMD_NAME(NAN_DISCOVERY_FUNC_CMD),
    HCMD_NAME(NAN_FAW_CONFIG_CMD),
    HCMD_NAME(NAN_DISCOVERY_EVENT_NOTIF),
    HCMD_NAME(NAN_DISCOVERY_TERMINATE_NOTIF),
    HCMD_NAME(NAN_FAW_START_NOTIF),
};

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_prot_offload_names[] = {
    HCMD_NAME(STORED_BEACON_NTF),
};

/* Please keep this array *SORTED* by hex value.
 * Access is done through binary search
 */
static const struct iwl_hcmd_names iwl_mvm_regulatory_and_nvm_names[] = {
    HCMD_NAME(NVM_ACCESS_COMPLETE),
    HCMD_NAME(NVM_GET_INFO),
};

static const struct iwl_hcmd_arr iwl_mvm_groups[] = {
    [LEGACY_GROUP] = HCMD_ARR(iwl_mvm_legacy_names),
    [LONG_GROUP] = HCMD_ARR(iwl_mvm_legacy_names),
    [SYSTEM_GROUP] = HCMD_ARR(iwl_mvm_system_names),
    [MAC_CONF_GROUP] = HCMD_ARR(iwl_mvm_mac_conf_names),
    [PHY_OPS_GROUP] = HCMD_ARR(iwl_mvm_phy_names),
    [DATA_PATH_GROUP] = HCMD_ARR(iwl_mvm_data_path_names),
    [NAN_GROUP] = HCMD_ARR(iwl_mvm_nan_names),
    [PROT_OFFLOAD_GROUP] = HCMD_ARR(iwl_mvm_prot_offload_names),
    [REGULATORY_AND_NVM_GROUP] = HCMD_ARR(iwl_mvm_regulatory_and_nvm_names),
#ifdef CPTCFG_IWLWIFI_DEBUG_HOST_CMD_ENABLED
    [DEBUG_GROUP] = HCMD_ARR(iwl_mvm_debug_names),
#endif
};

/* this forward declaration can avoid to export the function */
#if 0   // NEEDS_PORTING
static void iwl_mvm_async_handlers_wk(struct work_struct* wk);
#endif  // NEEDS_PORTING
#ifdef CONFIG_PM
static void iwl_mvm_d0i3_exit_work(struct work_struct* wk);
#endif

static uint32_t iwl_mvm_min_backoff(struct iwl_mvm* mvm) {
  const struct iwl_pwr_tx_backoff* backoff = mvm->cfg->pwr_tx_backoffs;
  uint64_t dflt_pwr_limit;

  if (!backoff) {
    return 0;
  }

  dflt_pwr_limit = iwl_acpi_get_pwr_limit(mvm->dev);

  while (backoff->pwr) {
    if (dflt_pwr_limit >= backoff->pwr) {
      return backoff->backoff;
    }

    backoff++;
  }

  return 0;
}

#if 0   // NEEDS_PORTING
static void iwl_mvm_tx_unblock_dwork(struct work_struct* work) {
    struct iwl_mvm* mvm = container_of(work, struct iwl_mvm, cs_tx_unblock_dwork.work);
    struct ieee80211_vif* tx_blocked_vif;
    struct iwl_mvm_vif* mvmvif;

    mtx_lock(&mvm->mutex);

    tx_blocked_vif =
        rcu_dereference_protected(mvm->csa_tx_blocked_vif, lockdep_is_held(&mvm->mutex));

    if (!tx_blocked_vif) { goto unlock; }

    mvmvif = iwl_mvm_vif_from_mac80211(tx_blocked_vif);
    iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, false);
    mvm->csa_tx_blocked_vif = NULL;
unlock:
    mtx_unlock(&mvm->mutex);
}
#endif  // NEEDS_PORTING

#ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES
static void iwl_mvm_init_modparams(struct iwl_mvm* mvm) {
#define IWL_DBG_CFG(t, n)                 /* nothing */
#define IWL_DBG_CFG_STR(n)                /* nothing */
#define IWL_DBG_CFG_NODEF(t, n)           /* nothing */
#define IWL_DBG_CFG_BIN(n)                /* nothing */
#define IWL_DBG_CFG_BINA(n, max)          /* nothing */
#define IWL_DBG_CFG_RANGE(t, n, min, max) /* nothing */
#define IWL_MOD_PARAM(t, n)               /* nothing */
#define IWL_MVM_MOD_PARAM(t, n)                \
  if (mvm->trans->dbg_cfg.__mvm_mod_param_##n) \
    iwlmvm_mod_params.n = mvm->trans->dbg_cfg.mvm_##n;
#define DBG_CFG_REINCLUDE
#include "iwl-dbg-cfg.h"
#undef IWL_DBG_CFG
#undef IWL_DBG_CFG_STR
#undef IWL_DBG_CFG_NODEF
#undef IWL_DBG_CFG_BIN
#undef IWL_DBG_CFG_BINA
#undef IWL_DBG_CFG_RANGE
#undef IWL_MOD_PARAM
#undef IWL_MVM_MOD_PARAM
}
#endif

// TODO(rsakthi) - Reintroduce TA_NO_THREAD_SAFETY_ANALYSIS
static int iwl_mvm_fwrt_dump_start(void* ctx) { //TA_NO_THREAD_SAFETY_ANALYSIS {
  struct iwl_mvm* mvm = ctx;
  int ret;

  ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_FW_DBG_COLLECT);
  if (ret) {
    return ret;
  }

  mtx_lock(&mvm->mutex);

  return 0;
}

static void iwl_mvm_fwrt_dump_end(void* ctx) { //TA_NO_THREAD_SAFETY_ANALYSIS {
  struct iwl_mvm* mvm = ctx;

  mtx_unlock(&mvm->mutex);

  iwl_mvm_unref(mvm, IWL_MVM_REF_FW_DBG_COLLECT);
}

static bool iwl_mvm_fwrt_fw_running(void* ctx) { return iwl_mvm_firmware_running(ctx); }

static zx_status_t iwl_mvm_fwrt_send_hcmd(void* ctx, struct iwl_host_cmd* host_cmd) {
  return ZX_ERR_NOT_SUPPORTED;
#if 0   // NEEDS_PORTING
    struct iwl_mvm* mvm = (struct iwl_mvm*)ctx;
    int ret;

    mtx_lock(&mvm->mutex);
    ret = iwl_mvm_send_cmd(mvm, host_cmd);
    mtx_unlock(&mvm->mutex);

    return ret;
#endif  // NEEDS_PORTING
}

static const struct iwl_fw_runtime_ops iwl_mvm_fwrt_ops = {
    .dump_start = iwl_mvm_fwrt_dump_start,
    .dump_end = iwl_mvm_fwrt_dump_end,
    .fw_running = iwl_mvm_fwrt_fw_running,
    .send_hcmd = iwl_mvm_fwrt_send_hcmd,
};

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
static int iwl_mvm_tm_send_hcmd(void* op_mode, struct iwl_host_cmd* host_cmd) {
  struct iwl_mvm* mvm = (struct iwl_mvm*)op_mode;

  if (WARN_ON_ONCE(!op_mode)) {
    return -EINVAL;
  }

  return iwl_mvm_send_cmd(mvm, host_cmd);
}

static int iwl_mvm_tm_cmd_exec_start(struct iwl_testmode* testmode) {
  struct iwl_mvm* mvm = testmode->op_mode;

  return iwl_mvm_ref_sync(mvm, IWL_MVM_REF_TM_CMD);
}

static void iwl_mvm_tm_cmd_exec_end(struct iwl_testmode* testmode) {
  struct iwl_mvm* mvm = testmode->op_mode;

  iwl_mvm_unref(mvm, IWL_MVM_REF_TM_CMD);
}
#endif

static struct iwl_op_mode* iwl_op_mode_mvm_start(struct iwl_trans* trans, const struct iwl_cfg* cfg,
                                                 const struct iwl_fw* fw,
                                                 struct dentry* dbgfs_dir) {
  struct iwl_op_mode* op_mode;
  struct iwl_mvm* mvm;
  struct iwl_trans_config trans_cfg = {};
  static const uint8_t no_reclaim_cmds[] = {
      TX_CMD,
  };
  int err, scan_size;
  uint32_t min_backoff;
  enum iwl_amsdu_size rb_size_default;

  /*
   * We use IWL_MVM_STATION_COUNT to check the validity of the station
   * index all over the driver - check that its value corresponds to the
   * array size.
   */
  BUILD_BUG_ON(ARRAY_SIZE(mvm->fw_id_to_mac_id) != IWL_MVM_STATION_COUNT);

  // Allocate op_mode and mvm. In the Linux driver these are private members of a ieee80211_hw
  // struct |hw|, which also contains iwl_mvm_hw_ops. The equivalent functionality of ieee80211_hw
  // has not yet been ported.
  op_mode = calloc(1, sizeof(struct iwl_op_mode));
  if (!op_mode) {
    IWL_ERR(trans, "Failed to allocate op mode\n");
  }
  mvm = calloc(1, sizeof(struct iwl_mvm));
  if (!mvm) {
    IWL_ERR(trans, "Failed to allocate mvm\n");
  }

  op_mode->op_mode_specific = mvm;

#if 0   // NEEDS_PORTING
    if (cfg->max_rx_agg_size) {
        hw->max_rx_aggregation_subframes = cfg->max_rx_agg_size;
    } else {
        hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
    }

    if (cfg->max_tx_agg_size) {
        hw->max_tx_aggregation_subframes = cfg->max_tx_agg_size;
    } else {
        hw->max_tx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
    }
#endif  // NEEDS_PORTING

  mvm->dev = trans->dev;
  mvm->trans = trans;
  mvm->cfg = cfg;
  mvm->fw = fw;

  iwl_fw_runtime_init(&mvm->fwrt, trans, fw, &iwl_mvm_fwrt_ops, mvm, dbgfs_dir);

  mvm->init_status = 0;

  if (iwl_mvm_has_new_rx_api(mvm)) {
    op_mode->ops = &iwl_mvm_ops_mq;
    trans->rx_mpdu_cmd_hdr_size = (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560)
                                      ? sizeof(struct iwl_rx_mpdu_desc)
                                      : IWL_RX_DESC_SIZE_V1;
  } else {
    op_mode->ops = &iwl_mvm_ops;
    trans->rx_mpdu_cmd_hdr_size = sizeof(struct iwl_rx_mpdu_res_start);

    if (WARN_ON(trans->num_rx_queues > 1)) {
      goto out_free;
    }
  }

  mvm->fw_restart = iwlwifi_mod_params.fw_restart ? -1 : 0;

  mvm->aux_queue = IWL_MVM_DQA_AUX_QUEUE;
  mvm->snif_queue = IWL_MVM_DQA_INJECT_MONITOR_QUEUE;
  mvm->probe_queue = IWL_MVM_DQA_AP_PROBE_RESP_QUEUE;
  mvm->p2p_dev_queue = IWL_MVM_DQA_P2P_DEVICE_QUEUE;

  mvm->sf_state = SF_UNINIT;
  if (iwl_mvm_has_unified_ucode(mvm)) {
    iwl_fw_set_current_image(&mvm->fwrt, IWL_UCODE_REGULAR);
  } else {
    iwl_fw_set_current_image(&mvm->fwrt, IWL_UCODE_INIT);
  }
  mvm->drop_bcn_ap_mode = true;

  mtx_init(&mvm->mutex, mtx_plain);
  mtx_init(&mvm->d0i3_suspend_mutex, mtx_plain);
  mtx_init(&mvm->async_handlers_lock, mtx_plain);
  list_initialize(&mvm->time_event_list);
  list_initialize(&mvm->aux_roc_te_list);
  list_initialize(&mvm->async_handlers_list);
  mtx_init(&mvm->time_event_lock, mtx_plain);

#if 0  // NEEDS_PORTING
    INIT_WORK(&mvm->async_handlers_wk, iwl_mvm_async_handlers_wk);
    INIT_WORK(&mvm->roc_done_wk, iwl_mvm_roc_done_wk);
#ifdef CPTCFG_MAC80211_LATENCY_MEASUREMENTS
    INIT_WORK(&mvm->tx_latency_wk, iwl_mvm_tx_latency_wk);
    INIT_DELAYED_WORK(&mvm->tx_latency_watchdog_wk, iwl_mvm_tx_latency_watchdog_wk);
#endif /* CPTCFG_MAC80211_LATENCY_MEASUREMENTS */
#ifdef CONFIG_PM
    INIT_WORK(&mvm->d0i3_exit_work, iwl_mvm_d0i3_exit_work);
#endif
#endif  // NEEDS_PORTING

  iwl_task_create(mvm->dev, iwl_mvm_scan_timeout_wk, mvm, &mvm->scan_timeout_task);

#if 0   // NEEDS_PORTING
    INIT_DELAYED_WORK(&mvm->tdls_cs.dwork, iwl_mvm_tdls_ch_switch_work);
    INIT_WORK(&mvm->add_stream_wk, iwl_mvm_add_new_dqa_stream_wk);
#endif  // NEEDS_PORTING

  list_initialize(&mvm->add_stream_txqs);

  mtx_init(&mvm->d0i3_tx_lock, mtx_plain);
  mtx_init(&mvm->refs_lock, mtx_plain);
#if 0   // NEEDS_PORTING
    skb_queue_head_init(&mvm->d0i3_tx);
    init_waitqueue_head(&mvm->d0i3_exit_waitq);
    init_waitqueue_head(&mvm->rx_sync_waitq);
#endif  // NEEDS_PORTING

  atomic_set(&mvm->queue_sync_counter, 0);

#if 0   // NEEDS_PORTING
    SET_IEEE80211_DEV(mvm->hw, mvm->trans->dev);
#endif  // NEEDS_PORTING

  mtx_init(&mvm->tcm.lock, mtx_plain);
#if 0   // NEEDS_PORTING
    INIT_DELAYED_WORK(&mvm->tcm.work, iwl_mvm_tcm_work);
    mvm->tcm.ts = jiffies;
    mvm->tcm.ll_ts = jiffies;
    mvm->tcm.uapsd_nonagg_ts = jiffies;
#endif  // NEEDS_PORTING

#ifdef CPTCFG_IWLMVM_TDLS_PEER_CACHE
  INIT_LIST_HEAD(&mvm->tdls_peer_cache_list);
#endif

#ifdef CPTCFG_IWLMVM_VENDOR_CMDS
  mvm->rx_filters = IWL_MVM_VENDOR_RXFILTER_EINVAL;
#endif

#if 0   // NEEDS_PORTING
    INIT_DELAYED_WORK(&mvm->cs_tx_unblock_dwork, iwl_mvm_tx_unblock_dwork);
#endif  // NEEDS_PORTING

  /*
   * Populate the state variables that the transport layer needs
   * to know about.
   */
  trans_cfg.op_mode = op_mode;
  trans_cfg.no_reclaim_cmds = no_reclaim_cmds;
  trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds);

  if (mvm->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) {
    rb_size_default = IWL_AMSDU_2K;
  } else {
    rb_size_default = IWL_AMSDU_4K;
  }

  switch (iwlwifi_mod_params.amsdu_size) {
    case IWL_AMSDU_DEF:
      trans_cfg.rx_buf_size = rb_size_default;
      break;
    case IWL_AMSDU_4K:
      trans_cfg.rx_buf_size = IWL_AMSDU_4K;
      break;
    case IWL_AMSDU_8K:
      trans_cfg.rx_buf_size = IWL_AMSDU_8K;
      break;
    case IWL_AMSDU_12K:
      trans_cfg.rx_buf_size = IWL_AMSDU_12K;
      break;
    default:
      zxlogf(ERROR, "%s: Unsupported amsdu_size: %d", KBUILD_MODNAME,
             iwlwifi_mod_params.amsdu_size);
      trans_cfg.rx_buf_size = rb_size_default;
  }

  trans->wide_cmd_header = true;
  trans_cfg.bc_table_dword = mvm->trans->cfg->device_family < IWL_DEVICE_FAMILY_22560;

  trans_cfg.command_groups = iwl_mvm_groups;
  trans_cfg.command_groups_size = ARRAY_SIZE(iwl_mvm_groups);

  trans_cfg.cmd_queue = IWL_MVM_DQA_CMD_QUEUE;
  trans_cfg.cmd_fifo = IWL_MVM_TX_FIFO_CMD;
  trans_cfg.scd_set_active = true;

#if 0   // NEEDS_PORTING
    trans_cfg.cb_data_offs = offsetof(struct ieee80211_tx_info, driver_data[2]);
#endif  // NEEDS_PORTING

  trans_cfg.sw_csum_tx = IWL_MVM_SW_TX_CSUM_OFFLOAD;

#if 0   // NEEDS_PORTING
    /* Set a short watchdog for the command queue */
    trans_cfg.cmd_q_wdg_timeout = iwl_mvm_get_wd_timeout(mvm, NULL, false, true);
#endif  // NEEDS_PORTING

#if 0   // NEEDS_PORTING
    snprintf(mvm->hw->wiphy->fw_version, sizeof(mvm->hw->wiphy->fw_version), "%s", fw->fw_version);
#endif  // NEEDS_PORTING

  /* Configure transport layer */
  iwl_trans_configure(mvm->trans, &trans_cfg);

  trans->rx_mpdu_cmd = REPLY_RX_MPDU_CMD;
  trans->dbg_dest_tlv = mvm->fw->dbg.dest_tlv;
  trans->dbg_n_dest_reg = mvm->fw->dbg.n_dest_reg;
  memcpy(trans->dbg_conf_tlv, mvm->fw->dbg.conf_tlv, sizeof(trans->dbg_conf_tlv));
  trans->dbg_trigger_tlv = mvm->fw->dbg.trigger_tlv;

  trans->iml = mvm->fw->iml;
  trans->iml_len = mvm->fw->iml_len;

  /* set up notification wait support */
  iwl_notification_wait_init(&mvm->notif_wait);

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
  iwl_dnt_init(mvm->trans, dbgfs_dir);
  iwl_tm_init(trans, mvm->fw, &mvm->mutex, mvm);
#endif

  /* Init phy db */
  mvm->phy_db = iwl_phy_db_init(trans);
  if (!mvm->phy_db) {
    IWL_ERR(mvm, "Cannot init phy_db\n");
    goto out_free;
  }

  IWL_INFO(mvm, "Detected %s, REV=0x%X\n", mvm->cfg->name, mvm->trans->hw_rev);

  if (iwlwifi_mod_params.nvm_file) {
    mvm->nvm_file_name = iwlwifi_mod_params.nvm_file;
  }
#ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES
  else if (trans->dbg_cfg.nvm_file) {
    mvm->nvm_file_name = trans->dbg_cfg.nvm_file;
  }
#endif
  else {
    IWL_DEBUG_EEPROM(mvm->trans->dev, "working without external nvm file%s\n", "");
  }

  err = iwl_trans_start_hw(mvm->trans);
  if (err) {
    goto out_free;
  }

  mtx_lock(&mvm->mutex);
  iwl_mvm_ref(mvm, IWL_MVM_REF_INIT_UCODE);
  err = iwl_run_init_mvm_ucode(mvm, true);

#if 0   // NEEDS_PORTING
  if (test_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &mvm->fwrt.status)) {
      iwl_fw_alive_error_dump(&mvm->fwrt);
  }
#endif  // NEEDS_PORTING
  if (!iwlmvm_mod_params.init_dbg || !err) {
    iwl_mvm_stop_device(mvm);
  }
  iwl_mvm_unref(mvm, IWL_MVM_REF_INIT_UCODE);
  mtx_unlock(&mvm->mutex);
  if (err < 0) {
    IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", err);
    goto out_free;
  }

  scan_size = iwl_mvm_scan_size(mvm);

  mvm->scan_cmd = malloc(scan_size);
  if (!mvm->scan_cmd) {
    goto out_free;
  }

  /* Set EBS as successful as long as not stated otherwise by the FW. */
  mvm->last_ebs_successful = true;

  err = iwl_mvm_mac_setup_register(mvm);
  if (err) {
    goto out_free;
  }
  mvm->hw_registered = true;

  min_backoff = iwl_mvm_min_backoff(mvm);
  iwl_mvm_thermal_initialize(mvm, min_backoff);

  err = iwl_mvm_dbgfs_register(mvm, dbgfs_dir);
  if (err) {
    goto out_unregister;
  }

  if (!iwl_mvm_has_new_rx_stats_api(mvm)) {
    memset(&mvm->rx_stats_v3, 0, sizeof(struct mvm_statistics_rx_v3));
  } else {
    memset(&mvm->rx_stats, 0, sizeof(struct mvm_statistics_rx));
  }

#ifdef CPTCFG_IWLWIFI_FRQ_MGR
  err = iwl_mvm_fm_register(mvm);
  if (err) {
    zxlogf(ERROR, "Unable to register with Frequency Manager: %d", err);
  }
#endif

  /* The transport always starts with a taken reference, we can
   * release it now if d0i3 is supported */
  if (iwl_mvm_is_d0i3_supported(mvm)) {
    iwl_trans_unref(mvm->trans);
  }

  iwl_mvm_tof_init(mvm);

#ifdef CPTCFG_IWLWIFI_SUPPORT_DEBUG_OVERRIDES
  iwl_mvm_init_modparams(mvm);
#endif

#ifdef CPTCFG_IWLMVM_AX_SOFTAP_TESTMODE
  mvm->is_bar_enabled = true;
#endif

  iwl_mvm_toggle_tx_ant(mvm, &mvm->mgmt_last_antenna_idx);
  return op_mode;

out_unregister:
  if (iwlmvm_mod_params.init_dbg) {
    return op_mode;
  }

#if 0   // NEEDS_PORTING
    ieee80211_unregister_hw(mvm->hw);
#endif  // NEEDS_PORTING
  mvm->hw_registered = false;
  iwl_mvm_leds_exit(mvm);
  iwl_mvm_thermal_exit(mvm);
out_free:
  iwl_fw_flush_dump(&mvm->fwrt);
  iwl_fw_runtime_free(&mvm->fwrt);

  if (iwlmvm_mod_params.init_dbg) {
    return op_mode;
  }

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
  iwl_dnt_free(trans);
#endif
  iwl_phy_db_free(mvm->phy_db);
  kfree(mvm->scan_cmd);
  iwl_trans_op_mode_leave(trans);

  free(op_mode);
  free(mvm);
  return NULL;
}

static void iwl_op_mode_mvm_stop(struct iwl_op_mode* op_mode) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  int i;

  /* If d0i3 is supported, we have released the reference that
   * the transport started with, so we should take it back now
   * that we are leaving.
   */
  if (iwl_mvm_is_d0i3_supported(mvm)) {
    iwl_trans_ref(mvm->trans);
  }

  iwl_mvm_leds_exit(mvm);

  iwl_mvm_thermal_exit(mvm);

  if (mvm->init_status & IWL_MVM_INIT_STATUS_REG_HW_INIT_COMPLETE) {
#if 0   // NEEDS_PORTING
        ieee80211_unregister_hw(mvm->hw);
#endif  // NEEDS_PORTING
    mvm->init_status &= ~IWL_MVM_INIT_STATUS_REG_HW_INIT_COMPLETE;
  }

#ifdef CPTCFG_IWLWIFI_FRQ_MGR
  iwl_mvm_fm_unregister(mvm);
#endif

  free(mvm->scan_cmd);
  mvm->scan_cmd = NULL;
  free(mvm->mcast_filter_cmd);
  mvm->mcast_filter_cmd = NULL;

#ifdef CPTCFG_IWLMVM_VENDOR_CMDS
  kfree(mvm->mcast_active_filter_cmd);
  mvm->mcast_active_filter_cmd = NULL;
#endif

#if defined(CONFIG_PM_SLEEP) && defined(CPTCFG_IWLWIFI_DEBUGFS)
  kfree(mvm->d3_resume_sram);
#endif
  iwl_trans_op_mode_leave(mvm->trans);

  iwl_phy_db_free(mvm->phy_db);
  mvm->phy_db = NULL;

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
  iwl_dnt_free(mvm->trans);
#endif
  kfree(mvm->nvm_data);
  for (i = 0; i < NVM_MAX_NUM_SECTIONS; i++) {
    kfree((void*)mvm->nvm_sections[i].data);
  }

  iwl_task_release_sync(mvm->scan_timeout_task);

#if 0   // NEEDS_PORTING
    cancel_delayed_work_sync(&mvm->tcm.work);
#endif  // NEEDS_PORTING

#ifdef CPTCFG_IWLMVM_TDLS_PEER_CACHE
  iwl_mvm_tdls_peer_cache_clear(mvm, NULL);
#endif /* CPTCFG_IWLMVM_TDLS_PEER_CACHE */

  iwl_mvm_tof_clean(mvm);

  iwl_fw_runtime_free(&mvm->fwrt);
  mtx_destroy(&mvm->mutex);
  mtx_destroy(&mvm->d0i3_suspend_mutex);

  free(op_mode);
  free(mvm);
}

struct iwl_async_handler_entry {
  list_node_t list;
  struct iwl_rx_cmd_buffer rxb;
  enum iwl_rx_handler_context context;
  void (*fn)(struct iwl_mvm* mvm, struct iwl_rx_cmd_buffer* rxb);
};

void iwl_mvm_async_handlers_purge(struct iwl_mvm* mvm) {
  struct iwl_async_handler_entry *entry, *tmp;

  mtx_lock(&mvm->async_handlers_lock);
  list_for_every_entry_safe (&mvm->async_handlers_list, entry, tmp, struct iwl_async_handler_entry,
                             list) {
    iwl_free_rxb(&entry->rxb);
    list_delete(&entry->list);
    kfree(entry);
  }
  mtx_unlock(&mvm->async_handlers_lock);
}

#if 0   // NEEDS_PORTING
static void iwl_mvm_async_handlers_wk(struct work_struct* wk) {
    struct iwl_mvm* mvm = container_of(wk, struct iwl_mvm, async_handlers_wk);
    struct iwl_async_handler_entry *entry, *tmp;
    LIST_HEAD(local_list);

    /* Ensure that we are not in stop flow (check iwl_mvm_mac_stop) */

    /*
     * Sync with Rx path with a lock. Remove all the entries from this list,
     * add them to a local one (lock free), and then handle them.
     */
    spin_lock_bh(&mvm->async_handlers_lock);
    list_splice_init(&mvm->async_handlers_list, &local_list);
    spin_unlock_bh(&mvm->async_handlers_lock);

    list_for_each_entry_safe(entry, tmp, &local_list, list) {
        if (entry->context == RX_HANDLER_ASYNC_LOCKED) { mtx_lock(&mvm->mutex); }
        entry->fn(mvm, &entry->rxb);
        iwl_free_rxb(&entry->rxb);
        list_del(&entry->list);
        if (entry->context == RX_HANDLER_ASYNC_LOCKED) { mtx_unlock(&mvm->mutex); }
        kfree(entry);
    }
}
#endif  // NEEDS_PORTING

static inline void iwl_mvm_rx_check_trigger(struct iwl_mvm* mvm, struct iwl_rx_packet* pkt) {
#if 0   // NEEDS_PORTING
    struct iwl_fw_dbg_trigger_tlv* trig;
    struct iwl_fw_dbg_trigger_cmd* cmds_trig;
    int i;

    trig = iwl_fw_dbg_trigger_on(&mvm->fwrt, NULL, FW_DBG_TRIGGER_FW_NOTIF);
    if (!trig) { return; }

    cmds_trig = (void*)trig->data;

    for (i = 0; i < ARRAY_SIZE(cmds_trig->cmds); i++) {
        /* don't collect on CMD 0 */
        if (!cmds_trig->cmds[i].cmd_id) { break; }

        if (cmds_trig->cmds[i].cmd_id != pkt->hdr.cmd ||
            cmds_trig->cmds[i].group_id != pkt->hdr.group_id) {
            continue;
        }

        iwl_fw_dbg_collect_trig(&mvm->fwrt, trig, "CMD 0x%02x.%02x received", pkt->hdr.group_id,
                                pkt->hdr.cmd);
        break;
    }
#endif  // NEEDS_PORTING
}

static void iwl_mvm_rx_common(struct iwl_mvm* mvm, struct iwl_rx_cmd_buffer* rxb,
                              struct iwl_rx_packet* pkt) {
  size_t i;

  iwl_mvm_rx_check_trigger(mvm, pkt);

  /*
   * Do the notification wait before RX handlers so
   * even if the RX handler consumes the RXB we have
   * access to it in the notification wait entry.
   */
  iwl_notification_wait_notify(&mvm->notif_wait, pkt);

  for (i = 0; i < ARRAY_SIZE(iwl_mvm_rx_handlers); i++) {
    const struct iwl_rx_handlers* rx_h = &iwl_mvm_rx_handlers[i];
    struct iwl_async_handler_entry* entry;

    if (rx_h->cmd_id != WIDE_ID(pkt->hdr.group_id, pkt->hdr.cmd)) {
      continue;
    }

    if (rx_h->context == RX_HANDLER_SYNC) {
      rx_h->fn(mvm, rxb);
      return;
    }

    entry = calloc(1, sizeof(*entry));
    /* we can't do much... */
    if (!entry) {
      return;
    }

    entry->rxb._iobuf = rxb_steal_iobuf(rxb);
    entry->rxb._offset = rxb->_offset;
    entry->fn = rx_h->fn;
    entry->context = rx_h->context;
    mtx_lock(&mvm->async_handlers_lock);
    list_add_tail(&mvm->async_handlers_list, &entry->list);
    mtx_unlock(&mvm->async_handlers_lock);
#if 0   // NEEDS_PORTING
        schedule_work(&mvm->async_handlers_wk);
#endif  // NEEDS_PORTING
    break;
  }
}

static void iwl_mvm_rx(struct iwl_op_mode* op_mode, struct napi_struct* napi,
                       struct iwl_rx_cmd_buffer* rxb) {
  struct iwl_rx_packet* pkt = rxb_addr(rxb);
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  uint16_t cmd = WIDE_ID(pkt->hdr.group_id, pkt->hdr.cmd);

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
  /*
   * RX data may be forwarded to userspace in case the user
   * requested to monitor the rx w/o affecting the regular flow.
   * In this case the iwl_test object will handle forwarding the rx
   * data to user space.
   */
  iwl_tm_gnl_send_rx(mvm->trans, rxb);
#endif

  if (likely(cmd == WIDE_ID(LEGACY_GROUP, REPLY_RX_MPDU_CMD))) {
    iwl_mvm_rx_rx_mpdu(mvm, napi, rxb);
  } else if (cmd == WIDE_ID(LEGACY_GROUP, REPLY_RX_PHY_CMD)) {
    iwl_mvm_rx_rx_phy_cmd(mvm, rxb);
  } else {
    iwl_mvm_rx_common(mvm, rxb, pkt);
  }
}

static void iwl_mvm_rx_mq(struct iwl_op_mode* op_mode, struct napi_struct* napi,
                          struct iwl_rx_cmd_buffer* rxb) {
  struct iwl_rx_packet* pkt = rxb_addr(rxb);
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  uint16_t cmd = WIDE_ID(pkt->hdr.group_id, pkt->hdr.cmd);

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
  /*
   * RX data may be forwarded to userspace in case the user
   * requested to monitor the rx w/o affecting the regular flow.
   * In this case the iwl_test object will handle forwarding the rx
   * data to user space.
   */
  iwl_tm_gnl_send_rx(mvm->trans, rxb);
#endif

  if (likely(cmd == WIDE_ID(LEGACY_GROUP, REPLY_RX_MPDU_CMD))) {
    iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, 0);
  } else if (unlikely(cmd == WIDE_ID(DATA_PATH_GROUP, RX_QUEUES_NOTIFICATION))) {
    iwl_mvm_rx_queue_notif(mvm, rxb, 0);
  } else if (cmd == WIDE_ID(LEGACY_GROUP, FRAME_RELEASE)) {
    iwl_mvm_rx_frame_release(mvm, napi, rxb, 0);
  } else if (cmd == WIDE_ID(DATA_PATH_GROUP, RX_NO_DATA_NOTIF)) {
    iwl_mvm_rx_monitor_ndp(mvm, napi, rxb, 0);
  } else {
    iwl_mvm_rx_common(mvm, rxb, pkt);
  }
}

static void iwl_mvm_async_cb(struct iwl_op_mode* op_mode, const struct iwl_device_cmd* cmd) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);

  /*
   * For now, we only set the CMD_WANT_ASYNC_CALLBACK for ADD_STA
   * commands that need to block the Tx queues.
   */
  iwl_trans_block_txq_ptrs(mvm->trans, false);
}

static void iwl_mvm_queue_state_change(struct iwl_op_mode* op_mode, int hw_queue, bool start) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  uint8_t sta_id = mvm->queue_info[hw_queue].ra_sta_id;
  struct iwl_mvm_sta* mvmsta;
  struct iwl_mvm_txq* mvmtxq;
  int i;
  unsigned long tid_bitmap;

  if (WARN_ON_ONCE(sta_id >= ARRAY_SIZE(mvm->fw_id_to_mac_id))) {
    return;
  }

  rcu_read_lock();

  mvmsta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
  if (IS_ERR_OR_NULL(mvmsta)) {
    goto out;
  }

  if (iwl_mvm_has_new_tx_api(mvm)) {
    int tid = mvm->tvqm_info[hw_queue].txq_tid;

    tid_bitmap = BIT(tid);
  } else {
    tid_bitmap = mvm->queue_info[hw_queue].tid_bitmap;
  }

  for (i = 0; i < (IWL_MAX_TID_COUNT + 1); i++) {
    if (!(tid_bitmap & (1 << i))) {
      continue;
    }

    int tid = i;

    if (tid == IWL_MAX_TID_COUNT) {
      tid = IEEE80211_TIDS_MAX;
    }

    mvmtxq = mvmsta->txq[tid];
    mvmtxq->stopped = !start;

#if 0   // NEEDS_PORTING
        if (start) { iwl_mvm_mac_itxq_xmit(mvm->hw, txq); }
#endif  // NEEDS_PORTING
  }

out:
  rcu_read_unlock();
}

static void iwl_mvm_stop_sw_queue(struct iwl_op_mode* op_mode, int hw_queue) {
  iwl_mvm_queue_state_change(op_mode, hw_queue, false);
}

static void iwl_mvm_wake_sw_queue(struct iwl_op_mode* op_mode, int hw_queue) {
  iwl_mvm_queue_state_change(op_mode, hw_queue, true);
}

static void iwl_mvm_set_rfkill_state(struct iwl_mvm* mvm) {
#if 0   // NEEDS_PORTING
    bool state = iwl_mvm_is_radio_killed(mvm);

    if (state) { wake_up(&mvm->rx_sync_waitq); }

    wiphy_rfkill_set_hw_state(mvm->hw->wiphy, state);
#endif  // NEEDS_PORTING
}

void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm* mvm, bool state) {
  if (state) {
    set_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
  } else {
    clear_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
  }

  iwl_mvm_set_rfkill_state(mvm);
}

static bool iwl_mvm_set_hw_rfkill_state(struct iwl_op_mode* op_mode, bool state) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  bool calibrating = READ_ONCE(mvm->calibrating);

  if (state) {
    set_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
  } else {
    clear_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
  }

  iwl_mvm_set_rfkill_state(mvm);

#if 0   // NEEDS_PORTING
    /* iwl_run_init_mvm_ucode is waiting for results, abort it */
    if (calibrating) { iwl_abort_notification_waits(&mvm->notif_wait); }
#endif  // NEEDS_PORTING

  /*
   * Stop the device if we run OPERATIONAL firmware or if we are in the
   * middle of the calibrations.
   */
  return state && (mvm->fwrt.cur_fw_img != IWL_UCODE_INIT || calibrating);
}

static void iwl_mvm_free_skb(struct iwl_op_mode* op_mode, struct sk_buff* skb) {
#if 0   // NEEDS_PORTING
    struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
    struct ieee80211_tx_info* info;

    info = IEEE80211_SKB_CB(skb);
    iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]);
    ieee80211_free_txskb(mvm->hw, skb);
#endif  // NEEDS_PORTING
}

struct iwl_mvm_reprobe {
  struct device* dev;
  struct work_struct work;
};

#if 0   // NEEDS_PORTING
static void iwl_mvm_reprobe_wk(struct work_struct* wk) {
    struct iwl_mvm_reprobe* reprobe;

    reprobe = container_of(wk, struct iwl_mvm_reprobe, work);
    if (device_reprobe(reprobe->dev)) {
        IWL_ERR(reprobe->dev, "reprobe failed!\n");
    }
    kfree(reprobe);
    module_put(THIS_MODULE);
}
#endif  // NEEDS_PORTING

void iwl_mvm_nic_restart(struct iwl_mvm* mvm, bool fw_error) {
  IWL_WARN(mvm, "%s() needs porting\n", __func__);
#if 0  // NEEDS_PORTING
    iwl_abort_notification_waits(&mvm->notif_wait);

    /*
     * This is a bit racy, but worst case we tell mac80211 about
     * a stopped/aborted scan when that was already done which
     * is not a problem. It is necessary to abort any os scan
     * here because mac80211 requires having the scan cleared
     * before restarting.
     * We'll reset the scan_status to NONE in restart cleanup in
     * the next start() call from mac80211. If restart isn't called
     * (no fw restart) scan status will stay busy.
     */
    iwl_mvm_report_scan_aborted(mvm);

    /*
     * If we're restarting already, don't cycle restarts.
     * If INIT fw asserted, it will likely fail again.
     * If WoWLAN fw asserted, don't restart either, mac80211
     * can't recover this since we're already half suspended.
     */
    if (!mvm->fw_restart && fw_error) {
        iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert, false, 0);
    } else if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
        struct iwl_mvm_reprobe* reprobe;

        IWL_ERR(mvm, "Firmware error during reconfiguration - reprobe!\n");

#if 0   // NEEDS_PORTING
        /*
         * get a module reference to avoid doing this while unloading
         * anyway and to avoid scheduling a work with code that's
         * being removed.
         */
        if (!try_module_get(THIS_MODULE)) {
            IWL_ERR(mvm, "Module is being unloaded - abort\n");
            return;
        }
#endif  // NEEDS_PORTING

        reprobe = calloc(1, sizeof(*reprobe));
        if (!reprobe) {
#if 0   // NEEDS_PORTING
            module_put(THIS_MODULE);
#endif  // NEEDS_PORTING
            return;
        }
        reprobe->dev = mvm->trans->dev;
#if 0   // NEEDS_PORTING
        INIT_WORK(&reprobe->work, iwl_mvm_reprobe_wk);
        schedule_work(&reprobe->work);
#endif  // NEEDS_PORTING
    } else if (mvm->fwrt.cur_fw_img == IWL_UCODE_REGULAR && mvm->hw_registered &&
               !test_bit(STATUS_TRANS_DEAD, &mvm->trans->status)) {
        /* don't let the transport/FW power down */
        iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);

        if (fw_error && mvm->fw_restart > 0) { mvm->fw_restart--; }
        set_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, &mvm->status);
#if 0   // NEEDS_PORTING
        ieee80211_restart_hw(mvm->hw);
#endif  // NEEDS_PORTING
    }
#endif  // NEEDS_PORTING
}

static void iwl_mvm_nic_error(struct iwl_op_mode* op_mode) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);

  if (!test_bit(STATUS_TRANS_DEAD, &mvm->trans->status)) {
    iwl_mvm_dump_nic_error_log(mvm);
  }

  zx_time_t dump_time_usec = (zx_clock_get_monotonic() + 500) / 1000;
  char dump_name[64];
  snprintf(dump_name, sizeof(dump_name), "nic_error_dump-%05u.%06u",
           (unsigned int)(dump_time_usec / 1000000), (unsigned int)(dump_time_usec % 1000000));
  iwl_fw_dbg_collect(&mvm->fwrt, FW_DBG_TRIGGER_USER, dump_name, strlen(dump_name));

  iwl_mvm_nic_restart(mvm, true);
}

static void iwl_mvm_cmd_queue_full(struct iwl_op_mode* op_mode) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);

  WARN_ON(1);
  iwl_mvm_nic_restart(mvm, true);
}

#ifdef CONFIG_PM
struct iwl_d0i3_iter_data {
  struct iwl_mvm* mvm;
  struct ieee80211_vif* connected_vif;
  uint8_t ap_sta_id;
  uint8_t vif_count;
  uint8_t offloading_tid;
  bool disable_offloading;
};

static bool iwl_mvm_disallow_offloading(struct iwl_mvm* mvm, struct ieee80211_vif* vif,
                                        struct iwl_d0i3_iter_data* iter_data) {
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);
  struct iwl_mvm_sta* mvmsta;
  uint32_t available_tids = 0;
  uint8_t tid;

  if (WARN_ON(vif->type != NL80211_IFTYPE_STATION || mvmvif->ap_sta_id == IWL_MVM_INVALID_STA)) {
    return false;
  }

  mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, mvmvif->ap_sta_id);
  if (!mvmsta) {
    return false;
  }

  spin_lock_bh(&mvmsta->lock);
  for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) {
    struct iwl_mvm_tid_data* tid_data = &mvmsta->tid_data[tid];

    /*
     * in case of pending tx packets, don't use this tid
     * for offloading in order to prevent reuse of the same
     * qos seq counters.
     */
    if (iwl_mvm_tid_queued(mvm, tid_data)) {
      continue;
    }

    if (tid_data->state != IWL_AGG_OFF) {
      continue;
    }

    available_tids |= BIT(tid);
  }
  spin_unlock_bh(&mvmsta->lock);

  /*
   * disallow protocol offloading if we have no available tid
   * (with no pending frames and no active aggregation,
   * as we don't handle "holes" properly - the scheduler needs the
   * frame's seq number and TFD index to match)
   */
  if (!available_tids) {
    return true;
  }

  /* for simplicity, just use the first available tid */
  iter_data->offloading_tid = ffs(available_tids) - 1;
  return false;
}

static void iwl_mvm_enter_d0i3_iterator(void* _data, uint8_t* mac, struct ieee80211_vif* vif) {
  struct iwl_d0i3_iter_data* data = _data;
  struct iwl_mvm* mvm = data->mvm;
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);
  uint32_t flags = CMD_ASYNC | CMD_HIGH_PRIO | CMD_SEND_IN_IDLE;

  IWL_DEBUG_RPM(mvm, "entering D0i3 - vif %pM\n", vif->addr);
  if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc) {
    return;
  }

  /*
   * in case of pending tx packets or active aggregations,
   * avoid offloading features in order to prevent reuse of
   * the same qos seq counters.
   */
  if (iwl_mvm_disallow_offloading(mvm, vif, data)) {
    data->disable_offloading = true;
  }

  iwl_mvm_update_d0i3_power_mode(mvm, vif, true, flags);
  iwl_mvm_send_proto_offload(mvm, vif, data->disable_offloading, false, flags);

  /*
   * on init/association, mvm already configures POWER_TABLE_CMD
   * and REPLY_MCAST_FILTER_CMD, so currently don't
   * reconfigure them (we might want to use different
   * params later on, though).
   */
  data->ap_sta_id = mvmvif->ap_sta_id;
  data->vif_count++;

  /*
   * no new commands can be sent at this stage, so it's safe
   * to save the vif pointer during d0i3 entrance.
   */
  data->connected_vif = vif;
}

static void iwl_mvm_set_wowlan_data(struct iwl_mvm* mvm, struct iwl_wowlan_config_cmd* cmd,
                                    struct iwl_d0i3_iter_data* iter_data) {
  struct ieee80211_sta* ap_sta;
  struct iwl_mvm_sta* mvm_ap_sta;

  if (iter_data->ap_sta_id == IWL_MVM_INVALID_STA) {
    return;
  }

  rcu_read_lock();

  ap_sta = rcu_dereference(mvm->fw_id_to_mac_id[iter_data->ap_sta_id]);
  if (IS_ERR_OR_NULL(ap_sta)) {
    goto out;
  }

  mvm_ap_sta = iwl_mvm_sta_from_mac80211(ap_sta);
  cmd->is_11n_connection = ap_sta->ht_cap.ht_supported;
  cmd->offloading_tid = iter_data->offloading_tid;
  cmd->flags =
      ENABLE_L3_FILTERING | ENABLE_NBNS_FILTERING | ENABLE_DHCP_FILTERING | ENABLE_STORE_BEACON;
  /*
   * The d0i3 uCode takes care of the nonqos counters,
   * so configure only the qos seq ones.
   */
  iwl_mvm_set_wowlan_qos_seq(mvm_ap_sta, cmd);
out:
  rcu_read_unlock();
}

int iwl_mvm_enter_d0i3(struct iwl_op_mode* op_mode) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  uint32_t flags = CMD_ASYNC | CMD_HIGH_PRIO | CMD_SEND_IN_IDLE;
  int ret;
  struct iwl_d0i3_iter_data d0i3_iter_data = {
      .mvm = mvm,
  };
  struct iwl_wowlan_config_cmd wowlan_config_cmd = {
      .wakeup_filter = cpu_to_le32(IWL_WOWLAN_WAKEUP_RX_FRAME | IWL_WOWLAN_WAKEUP_BEACON_MISS |
                                   IWL_WOWLAN_WAKEUP_LINK_CHANGE),
  };
  struct iwl_d3_manager_config d3_cfg_cmd = {
      .min_sleep_time = cpu_to_le32(1000),
      .wakeup_flags = cpu_to_le32(IWL_WAKEUP_D3_CONFIG_FW_ERROR),
  };

  IWL_DEBUG_RPM(mvm, "MVM entering D0i3\n");

  if (WARN_ON_ONCE(mvm->fwrt.cur_fw_img != IWL_UCODE_REGULAR)) {
    return -EINVAL;
  }

  set_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status);

  /*
   * iwl_mvm_ref_sync takes a reference before checking the flag.
   * so by checking there is no held reference we prevent a state
   * in which iwl_mvm_ref_sync continues successfully while we
   * configure the firmware to enter d0i3
   */
  if (iwl_mvm_ref_taken(mvm)) {
    IWL_DEBUG_RPM(mvm->trans, "abort d0i3 due to taken ref\n");
    clear_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status);
    wake_up(&mvm->d0i3_exit_waitq);
    return 1;
  }

  ieee80211_iterate_active_interfaces_atomic(mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
                                             iwl_mvm_enter_d0i3_iterator, &d0i3_iter_data);
  if (d0i3_iter_data.vif_count == 1) {
    mvm->d0i3_ap_sta_id = d0i3_iter_data.ap_sta_id;
    mvm->d0i3_offloading = !d0i3_iter_data.disable_offloading;
  } else {
    WARN_ON_ONCE(d0i3_iter_data.vif_count > 1);
    mvm->d0i3_ap_sta_id = IWL_MVM_INVALID_STA;
    mvm->d0i3_offloading = false;
  }

  iwl_mvm_pause_tcm(mvm, true);
  /* make sure we have no running tx while configuring the seqno */
  synchronize_net();

  /* Flush the hw queues, in case something got queued during entry */
  /* TODO new tx api */
  if (iwl_mvm_has_new_tx_api(mvm)) {
    WARN_ONCE(1, "d0i3: Need to implement flush TX queue\n");
  } else {
    ret = iwl_mvm_flush_tx_path(mvm, iwl_mvm_flushable_queues(mvm), flags);
    if (ret) {
      return ret;
    }
  }

  /* configure wowlan configuration only if needed */
  if (mvm->d0i3_ap_sta_id != IWL_MVM_INVALID_STA) {
    /* wake on beacons only if beacon storing isn't supported */
    if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_BEACON_STORING)) {
      wowlan_config_cmd.wakeup_filter |= cpu_to_le32(IWL_WOWLAN_WAKEUP_BCN_FILTERING);
    }

    iwl_mvm_wowlan_config_key_params(mvm, d0i3_iter_data.connected_vif, true, flags);

    iwl_mvm_set_wowlan_data(mvm, &wowlan_config_cmd, &d0i3_iter_data);

    ret = iwl_mvm_send_cmd_pdu(mvm, WOWLAN_CONFIGURATION, flags, sizeof(wowlan_config_cmd),
                               &wowlan_config_cmd);
    if (ret) {
      return ret;
    }
  }

  return iwl_mvm_send_cmd_pdu(mvm, D3_CONFIG_CMD, flags | CMD_MAKE_TRANS_IDLE, sizeof(d3_cfg_cmd),
                              &d3_cfg_cmd);
}

static void iwl_mvm_exit_d0i3_iterator(void* _data, uint8_t* mac, struct ieee80211_vif* vif) {
  struct iwl_mvm* mvm = _data;
  uint32_t flags = CMD_ASYNC | CMD_HIGH_PRIO;

  IWL_DEBUG_RPM(mvm, "exiting D0i3 - vif %pM\n", vif->addr);
  if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc) {
    return;
  }

  iwl_mvm_update_d0i3_power_mode(mvm, vif, false, flags);
}

struct iwl_mvm_d0i3_exit_work_iter_data {
  struct iwl_mvm* mvm;
  struct iwl_wowlan_status* status;
  uint32_t wakeup_reasons;
};

static void iwl_mvm_d0i3_exit_work_iter(void* _data, uint8_t* mac, struct ieee80211_vif* vif) {
  struct iwl_mvm_d0i3_exit_work_iter_data* data = _data;
  struct iwl_mvm_vif* mvmvif = iwl_mvm_vif_from_mac80211(vif);
  uint32_t reasons = data->wakeup_reasons;

  /* consider only the relevant station interface */
  if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc ||
      data->mvm->d0i3_ap_sta_id != mvmvif->ap_sta_id) {
    return;
  }

  if (reasons & IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH) {
    iwl_mvm_connection_loss(data->mvm, vif, "D0i3");
  } else if (reasons & IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_MISSED_BEACON) {
    ieee80211_beacon_loss(vif);
  } else {
    iwl_mvm_d0i3_update_keys(data->mvm, vif, data->status);
  }
}

void iwl_mvm_d0i3_enable_tx(struct iwl_mvm* mvm, __le16* qos_seq) {
  struct ieee80211_sta* sta = NULL;
  struct iwl_mvm_sta* mvm_ap_sta;
  int i;
  bool wake_queues = false;

  iwl_assert_lock_held(&mvm->mutex);

  spin_lock_bh(&mvm->d0i3_tx_lock);

  if (mvm->d0i3_ap_sta_id == IWL_MVM_INVALID_STA) {
    goto out;
  }

  IWL_DEBUG_RPM(mvm, "re-enqueue packets\n");

  /* get the sta in order to update seq numbers and re-enqueue skbs */
  sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[mvm->d0i3_ap_sta_id],
                                  lockdep_is_held(&mvm->mutex));

  if (IS_ERR_OR_NULL(sta)) {
    sta = NULL;
    goto out;
  }

  if (mvm->d0i3_offloading && qos_seq) {
    /* update qos seq numbers if offloading was enabled */
    mvm_ap_sta = iwl_mvm_sta_from_mac80211(sta);
    for (i = 0; i < IWL_MAX_TID_COUNT; i++) {
      uint16_t seq = le16_to_cpu(qos_seq[i]);
      /* firmware stores last-used one, we store next one */
      seq += 0x10;
      mvm_ap_sta->tid_data[i].seq_number = seq;
    }
  }
out:
  /* re-enqueue (or drop) all packets */
  while (!skb_queue_empty(&mvm->d0i3_tx)) {
    struct sk_buff* skb = __skb_dequeue(&mvm->d0i3_tx);

    if (!sta || iwl_mvm_tx_skb(mvm, skb, sta)) {
      ieee80211_free_txskb(mvm->hw, skb);
    }

    /* if the skb_queue is not empty, we need to wake queues */
    wake_queues = true;
  }
  clear_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status);
  wake_up(&mvm->d0i3_exit_waitq);
  mvm->d0i3_ap_sta_id = IWL_MVM_INVALID_STA;
  if (wake_queues) {
    ieee80211_wake_queues(mvm->hw);
  }

  spin_unlock_bh(&mvm->d0i3_tx_lock);
}

static void iwl_mvm_d0i3_exit_work(struct work_struct* wk) {
  struct iwl_mvm* mvm = container_of(wk, struct iwl_mvm, d0i3_exit_work);
  struct iwl_mvm_d0i3_exit_work_iter_data iter_data = {
      .mvm = mvm,
  };

  struct iwl_wowlan_status* status;
  uint32_t wakeup_reasons = 0;
  __le16* qos_seq = NULL;

  mtx_lock(&mvm->mutex);

  status = iwl_mvm_send_wowlan_get_status(mvm);
  if (IS_ERR_OR_NULL(status)) {
    /* set to NULL so we don't need to check before kfree'ing */
    status = NULL;
    goto out;
  }

  wakeup_reasons = le32_to_cpu(status->wakeup_reasons);
  qos_seq = status->qos_seq_ctr;

  IWL_DEBUG_RPM(mvm, "wakeup reasons: 0x%x\n", wakeup_reasons);

  iter_data.wakeup_reasons = wakeup_reasons;
  iter_data.status = status;
  ieee80211_iterate_active_interfaces(mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
                                      iwl_mvm_d0i3_exit_work_iter, &iter_data);
out:
  iwl_mvm_d0i3_enable_tx(mvm, qos_seq);

  IWL_DEBUG_INFO(mvm, "d0i3 exit completed (wakeup reasons: 0x%x)\n", wakeup_reasons);

  /* qos_seq might point inside resp_pkt, so free it only now */
  kfree(status);

  /* the FW might have updated the regdomain */
  iwl_mvm_update_changed_regdom(mvm);

  iwl_mvm_resume_tcm(mvm);
  iwl_mvm_unref(mvm, IWL_MVM_REF_EXIT_WORK);
  mtx_unlock(&mvm->mutex);
}

int _iwl_mvm_exit_d0i3(struct iwl_mvm* mvm) {
  uint32_t flags = CMD_ASYNC | CMD_HIGH_PRIO | CMD_SEND_IN_IDLE | CMD_WAKE_UP_TRANS;
  int ret;

  IWL_DEBUG_RPM(mvm, "MVM exiting D0i3\n");

  if (WARN_ON_ONCE(mvm->fwrt.cur_fw_img != IWL_UCODE_REGULAR)) {
    return -EINVAL;
  }

  mtx_lock(&mvm->d0i3_suspend_mutex);
  if (test_bit(D0I3_DEFER_WAKEUP, &mvm->d0i3_suspend_flags)) {
    IWL_DEBUG_RPM(mvm, "Deferring d0i3 exit until resume\n");
    __set_bit(D0I3_PENDING_WAKEUP, &mvm->d0i3_suspend_flags);
    mtx_unlock(&mvm->d0i3_suspend_mutex);
    return 0;
  }
  mtx_unlock(&mvm->d0i3_suspend_mutex);

  ret = iwl_mvm_send_cmd_pdu(mvm, D0I3_END_CMD, flags, 0, NULL);
  if (ret) {
    goto out;
  }

  ieee80211_iterate_active_interfaces_atomic(mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
                                             iwl_mvm_exit_d0i3_iterator, mvm);
out:
  schedule_work(&mvm->d0i3_exit_work);
  return ret;
}

int iwl_mvm_exit_d0i3(struct iwl_op_mode* op_mode) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);

  iwl_mvm_ref(mvm, IWL_MVM_REF_EXIT_WORK);
  return _iwl_mvm_exit_d0i3(mvm);
}

#define IWL_MVM_D0I3_OPS .enter_d0i3 = iwl_mvm_enter_d0i3, .exit_d0i3 = iwl_mvm_exit_d0i3,
#else /* CONFIG_PM */
#define IWL_MVM_D0I3_OPS
#endif /* CONFIG_PM */

#define IWL_MVM_COMMON_OPS                                                            \
  /* these could be differentiated */                                                 \
  .async_cb = iwl_mvm_async_cb, .queue_full = iwl_mvm_stop_sw_queue,                  \
  .queue_not_full = iwl_mvm_wake_sw_queue, .hw_rf_kill = iwl_mvm_set_hw_rfkill_state, \
  .free_skb = iwl_mvm_free_skb, .nic_error = iwl_mvm_nic_error,                       \
  .cmd_queue_full = iwl_mvm_cmd_queue_full, .nic_config = iwl_mvm_nic_config,         \
  IWL_MVM_D0I3_OPS /* as we only register one, these MUST be common! */               \
      .start = iwl_op_mode_mvm_start,                                                 \
  .stop = iwl_op_mode_mvm_stop
#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
#define IWL_MVM_COMMON_TEST_OPS                    \
  .test_ops = {                                    \
      .send_hcmd = iwl_mvm_tm_send_hcmd,           \
      .cmd_exec_start = iwl_mvm_tm_cmd_exec_start, \
      .cmd_exec_end = iwl_mvm_tm_cmd_exec_end,     \
  },
#else
#define IWL_MVM_COMMON_TEST_OPS
#endif

static const struct iwl_op_mode_ops iwl_mvm_ops = {
    IWL_MVM_COMMON_OPS,
    IWL_MVM_COMMON_TEST_OPS.rx = iwl_mvm_rx,
};

static void iwl_mvm_rx_mq_rss(struct iwl_op_mode* op_mode, struct napi_struct* napi,
                              struct iwl_rx_cmd_buffer* rxb, unsigned int queue) {
  struct iwl_mvm* mvm = IWL_OP_MODE_GET_MVM(op_mode);
  struct iwl_rx_packet* pkt = rxb_addr(rxb);
  uint16_t cmd = WIDE_ID(pkt->hdr.group_id, pkt->hdr.cmd);

  if (unlikely(cmd == WIDE_ID(LEGACY_GROUP, FRAME_RELEASE))) {
    iwl_mvm_rx_frame_release(mvm, napi, rxb, queue);
  } else if (unlikely(cmd == WIDE_ID(DATA_PATH_GROUP, RX_QUEUES_NOTIFICATION))) {
    iwl_mvm_rx_queue_notif(mvm, rxb, queue);
  } else if (likely(cmd == WIDE_ID(LEGACY_GROUP, REPLY_RX_MPDU_CMD))) {
    iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, queue);
  }
}

static const struct iwl_op_mode_ops iwl_mvm_ops_mq = {
    IWL_MVM_COMMON_OPS,
    IWL_MVM_COMMON_TEST_OPS.rx = iwl_mvm_rx_mq,
    .rx_rss = iwl_mvm_rx_mq_rss,
};
