/******************************************************************************
 *
 * 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>

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

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
#include "src/connectivity/wlan/drivers/third_party/intel/iwlwifi/iwl-dnt-cfg.h"
#include "src/connectivity/wlan/drivers/third_party/intel/iwlwifi/iwl-dnt-dispatch.h"
#include "src/connectivity/wlan/drivers/third_party/intel/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) {
        pr_err("Unable to register rate control algorithm: %d\n", ret);
        return ret;
    }
#endif  // NEEDS_PORTING

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

    return ret;
}

void __exit 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),
    RX_HANDLER(SCAN_OFFLOAD_COMPLETE, iwl_mvm_rx_lmac_scan_complete_notif, RX_HANDLER_ASYNC_LOCKED),
    RX_HANDLER(MATCH_FOUND_NOTIFICATION, iwl_mvm_rx_scan_match_found, RX_HANDLER_SYNC),
    RX_HANDLER(SCAN_COMPLETE_UMAC, iwl_mvm_rx_umac_scan_complete_notif, RX_HANDLER_ASYNC_LOCKED),
    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

static int iwl_mvm_fwrt_dump_start(void* ctx) {
    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) {
    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
    INIT_DELAYED_WORK(&mvm->tdls_cs.dwork, iwl_mvm_tdls_ch_switch_work);
    INIT_DELAYED_WORK(&mvm->scan_timeout_dwork, iwl_mvm_scan_timeout_wk);
    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_store(&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:
        pr_err("%s: Unsupported amsdu_size: %d\n", 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;

#if 0   // NEEDS_PORTING
    /* set up notification wait support */
    iwl_notification_wait_init(&mvm->notif_wait);
#endif  // NEEDS_PORTING

#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) { pr_err("Unable to register with Frequency Manager: %d\n", 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:
#if 0   // NEEDS_PORTING
    iwl_fw_flush_dump(&mvm->fwrt);
#endif  // NEEDS_PORTING
    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

    kfree(mvm->scan_cmd);
    kfree(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);
    }

#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) {
#if 0   // NEEDS_PORTING
        iwl_free_rxb(&entry->rxb);
#endif  // NEEDS_PORTING
        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._page = rxb_steal_page(rxb);
        entry->rxb._offset = rxb->_offset;
        entry->rxb._rx_page_order = rxb->_rx_page_order;
        entry->fn = rx_h->fn;
        entry->context = rx_h->context;
        mtx_lock(&mvm->async_handlers_lock);
        list_add_tail(&entry->list, &mvm->async_handlers_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) {
#if 0   // NEEDS_PORTING
    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);
    }
#endif  // NEEDS_PORTING
}

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 ieee80211_sta* sta;
    struct ieee80211_txq* txq;
    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();

    sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
    if (IS_ERR_OR_NULL(sta)) { 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_NUM_TIDS; }

        txq = sta->txq[tid];
        mvmtxq = iwl_mvm_txq_from_mac80211(txq);
        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) {
#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 0   // NEEDS_PORTING
    if (!test_bit(STATUS_TRANS_DEAD, &mvm->trans->status)) { iwl_mvm_dump_nic_error_log(mvm); }
#endif  // NEEDS_PORTING

    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;

    lockdep_assert_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,
};
