/* NIC configuration for 6000 series */
 static void iwl6000_nic_config(struct iwl_priv *priv)
 {
-       switch (priv->cfg->trans.device_family) {
+       switch (priv->trans->trans_cfg->device_family) {
        case IWL_DEVICE_FAMILY_6005:
        case IWL_DEVICE_FAMILY_6030:
        case IWL_DEVICE_FAMILY_6000:
 
        }
 
        led_cmd.on = iwl_blink_compensation(priv, on,
-                               priv->cfg->trans.base_params->led_compensation);
+                               priv->trans->trans_cfg->base_params->led_compensation);
        led_cmd.off = iwl_blink_compensation(priv, off,
-                               priv->cfg->trans.base_params->led_compensation);
+                               priv->trans->trans_cfg->base_params->led_compensation);
 
        ret = iwl_send_led_cmd(priv, &led_cmd);
        if (!ret) {
 
                goto done;
        }
 
-       scd_queues = BIT(priv->cfg->trans.base_params->num_of_queues) - 1;
+       scd_queues = BIT(priv->trans->trans_cfg->base_params->num_of_queues) - 1;
        scd_queues &= ~(BIT(IWL_IPAN_CMD_QUEUE_NUM) |
                        BIT(IWL_DEFAULT_CMD_QUEUE_NUM));
 
 
        priv->cfg = cfg;
        priv->fw = fw;
 
-       switch (priv->cfg->trans.device_family) {
+       switch (priv->trans->trans_cfg->device_family) {
        case IWL_DEVICE_FAMILY_1000:
        case IWL_DEVICE_FAMILY_100:
                priv->lib = &iwl_dvm_1000_cfg;
                                          driver_data[2]);
 
        WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE <
-               priv->cfg->trans.base_params->num_of_queues);
+               priv->trans->trans_cfg->base_params->num_of_queues);
 
        ucode_flags = fw->ucode_capa.flags;
 
        /* Reset chip to save power until we load uCode during "up". */
        iwl_trans_stop_device(priv->trans);
 
-       priv->nvm_data = iwl_parse_eeprom_data(priv->trans->dev, priv->cfg,
-                                                 priv->eeprom_blob,
-                                                 priv->eeprom_blob_size);
+       priv->nvm_data = iwl_parse_eeprom_data(priv->trans, priv->cfg,
+                                              priv->eeprom_blob,
+                                              priv->eeprom_blob_size);
        if (!priv->nvm_data)
                goto out_free_eeprom_blob;
 
 
        else
                cmd->flags &= ~IWL_POWER_SLEEP_OVER_DTIM_MSK;
 
-       if (priv->cfg->trans.base_params->shadow_reg_enable)
+       if (priv->trans->trans_cfg->base_params->shadow_reg_enable)
                cmd->flags |= IWL_POWER_SHADOW_REG_ENA;
        else
                cmd->flags &= ~IWL_POWER_SHADOW_REG_ENA;
 
        int q;
 
        for (q = IWLAGN_FIRST_AMPDU_QUEUE;
-            q < priv->cfg->trans.base_params->num_of_queues; q++) {
+            q < priv->trans->trans_cfg->base_params->num_of_queues; q++) {
                if (!test_and_set_bit(q, priv->agg_q_alloc)) {
                        priv->queue_to_mac80211[q] = mq;
                        return q;
         * (in Tx queue's circular buffer) of first TFD/frame in window */
        u16 ba_resp_scd_ssn = le16_to_cpu(ba_resp->scd_ssn);
 
-       if (scd_flow >= priv->cfg->trans.base_params->num_of_queues) {
+       if (scd_flow >= priv->trans->trans_cfg->base_params->num_of_queues) {
                IWL_ERR(priv,
                        "BUG_ON scd_flow is bigger than number of queues\n");
                return;
 
 #define MAX_BIT_RATE_40_MHZ    150 /* Mbps */
 #define MAX_BIT_RATE_20_MHZ    72 /* Mbps */
 
-void iwl_init_ht_hw_capab(const struct iwl_cfg *cfg,
+void iwl_init_ht_hw_capab(struct iwl_trans *trans,
                          struct iwl_nvm_data *data,
                          struct ieee80211_sta_ht_cap *ht_info,
                          enum nl80211_band band,
                          u8 tx_chains, u8 rx_chains)
 {
+       const struct iwl_cfg *cfg = trans->cfg;
        int max_bit_rate = 0;
 
        tx_chains = hweight8(tx_chains);
        if (cfg->ht_params->ldpc)
                ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING;
 
-       if ((cfg->trans.mq_rx_supported &&
+       if ((trans->trans_cfg->mq_rx_supported &&
             iwlwifi_mod_params.amsdu_size == IWL_AMSDU_DEF) ||
             iwlwifi_mod_params.amsdu_size >= IWL_AMSDU_8K)
                ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU;
        }
 }
 
-static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
+static void iwl_init_sbands(struct iwl_trans *trans, const struct iwl_cfg *cfg,
                            struct iwl_nvm_data *data,
                            const u8 *eeprom, size_t eeprom_size)
 {
+       struct device *dev = trans->dev;
        int n_channels = iwl_init_channel_map(dev, cfg, data,
                                              eeprom, eeprom_size);
        int n_used = 0;
        sband->n_bitrates = N_RATES_24;
        n_used += iwl_init_sband_channels(data, sband, n_channels,
                                          NL80211_BAND_2GHZ);
-       iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_2GHZ,
+       iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ,
                             data->valid_tx_ant, data->valid_rx_ant);
 
        sband = &data->bands[NL80211_BAND_5GHZ];
        sband->n_bitrates = N_RATES_52;
        n_used += iwl_init_sband_channels(data, sband, n_channels,
                                          NL80211_BAND_5GHZ);
-       iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_5GHZ,
+       iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ,
                             data->valid_tx_ant, data->valid_rx_ant);
 
        if (n_channels != n_used)
 /* EEPROM data functions */
 
 struct iwl_nvm_data *
-iwl_parse_eeprom_data(struct device *dev, const struct iwl_cfg *cfg,
+iwl_parse_eeprom_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
                      const u8 *eeprom, size_t eeprom_size)
 {
        struct iwl_nvm_data *data;
+       struct device *dev = trans->dev;
        const void *tmp;
        u16 radio_cfg, sku;
 
                goto err_free;
        }
 
-       iwl_init_sbands(dev, cfg, data, eeprom, eeprom_size);
+       iwl_init_sbands(trans, cfg, data, eeprom, eeprom_size);
 
        return data;
  err_free:
 
  * later with iwl_free_nvm_data().
  */
 struct iwl_nvm_data *
-iwl_parse_eeprom_data(struct device *dev, const struct iwl_cfg *cfg,
+iwl_parse_eeprom_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
                      const u8 *eeprom, size_t eeprom_size);
 
 int iwl_init_sband_channels(struct iwl_nvm_data *data,
                            struct ieee80211_supported_band *sband,
                            int n_channels, enum nl80211_band band);
 
-void iwl_init_ht_hw_capab(const struct iwl_cfg *cfg,
+void iwl_init_ht_hw_capab(struct iwl_trans *trans,
                          struct iwl_nvm_data *data,
                          struct ieee80211_sta_ht_cap *ht_info,
                          enum nl80211_band band,
 
 {
        int ret;
 
-       ret = iwl_finish_nic_init(trans, &trans->cfg->trans);
+       ret = iwl_finish_nic_init(trans, trans->trans_cfg);
        if (ret)
                return ret;
 
 
 
        switch (iwlwifi_mod_params.amsdu_size) {
        case IWL_AMSDU_DEF:
-               if (cfg->trans.mq_rx_supported)
+               if (trans->trans_cfg->mq_rx_supported)
                        vht_cap->cap |=
                                IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
                else
                        vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895;
                break;
        case IWL_AMSDU_2K:
-               if (cfg->trans.mq_rx_supported)
+               if (trans->trans_cfg->mq_rx_supported)
                        vht_cap->cap |=
                                IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454;
                else
        sband->n_bitrates = N_RATES_24;
        n_used += iwl_init_sband_channels(data, sband, n_channels,
                                          NL80211_BAND_2GHZ);
-       iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_2GHZ,
+       iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_2GHZ,
                             tx_chains, rx_chains);
 
        if (data->sku_cap_11ax_enable && !iwlwifi_mod_params.disable_11ax)
        sband->n_bitrates = N_RATES_52;
        n_used += iwl_init_sband_channels(data, sband, n_channels,
                                          NL80211_BAND_5GHZ);
-       iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, NL80211_BAND_5GHZ,
+       iwl_init_ht_hw_capab(trans, data, &sband->ht_cap, NL80211_BAND_5GHZ,
                             tx_chains, rx_chains);
        if (data->sku_cap_11ac_enable && !iwlwifi_mod_params.disable_11ac)
                iwl_init_vht_hw_capab(trans, data, &sband->vht_cap,
 }
 
 static bool
-iwl_nvm_no_wide_in_5ghz(struct device *dev, const struct iwl_cfg *cfg,
+iwl_nvm_no_wide_in_5ghz(struct iwl_trans *trans, const struct iwl_cfg *cfg,
                        const __be16 *nvm_hw)
 {
        /*
         * in 5GHz otherwise the FW will throw a sysassert when we try
         * to use them.
         */
-       if (cfg->trans.device_family == IWL_DEVICE_FAMILY_7000) {
+       if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) {
                /*
                 * Unlike the other sections in the NVM, the hw
                 * section uses big-endian.
                u8 sku = (subsystem_id & 0x1e) >> 1;
 
                if (sku == 5 || sku == 9) {
-                       IWL_DEBUG_EEPROM(dev,
+                       IWL_DEBUG_EEPROM(trans->dev,
                                         "disabling wide channels in 5GHz (0x%0x %d)\n",
                                         subsystem_id, sku);
                        return true;
                   const __le16 *mac_override, const __le16 *phy_sku,
                   u8 tx_chains, u8 rx_chains, bool lar_fw_supported)
 {
-       struct device *dev = trans->dev;
        struct iwl_nvm_data *data;
        bool lar_enabled;
        u32 sku, radio_cfg;
        if (lar_fw_supported && lar_enabled)
                sbands_flags |= IWL_NVM_SBANDS_FLAGS_LAR;
 
-       if (iwl_nvm_no_wide_in_5ghz(dev, cfg, nvm_hw))
+       if (iwl_nvm_no_wide_in_5ghz(trans, cfg, nvm_hw))
                sbands_flags |= IWL_NVM_SBANDS_FLAGS_NO_WIDE_IN_5GHZ;
 
        iwl_init_sbands(trans, data, ch_section, tx_chains, rx_chains,
 
                goto remove_notif;
        }
 
-       if (mvm->cfg->trans.device_family < IWL_DEVICE_FAMILY_8000) {
+       if (mvm->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_8000) {
                ret = iwl_mvm_send_bt_init_conf(mvm);
                if (ret)
                        goto remove_notif;
 
         * if we control through the register, we're doing it
         * even when the firmware isn't up, so no need to sync
         */
-       if (mvm->cfg->trans.device_family < IWL_DEVICE_FAMILY_8000)
+       if (mvm->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_8000)
                return;
 
        iwl_mvm_led_set(mvm, mvm->led.brightness > 0);
 
         * for older devices. We also don't see this issue on any newer
         * devices.
         */
-       if (mvm->cfg->trans.device_family >= IWL_DEVICE_FAMILY_9000)
+       if (mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_9000)
                ieee80211_hw_set(hw, TX_AMSDU);
        ieee80211_hw_set(hw, TX_FRAG_LIST);
 
 
  */
 static inline u32 iwl_mvm_flushable_queues(struct iwl_mvm *mvm)
 {
-       return ((BIT(mvm->cfg->trans.base_params->num_of_queues) - 1) &
+       return ((BIT(mvm->trans->trans_cfg->base_params->num_of_queues) - 1) &
                ~BIT(IWL_MVM_DQA_CMD_QUEUE));
 }
 
 
        while (ret == length) {
                /* Check no memory assumptions fail and cause an overflow */
                if ((size_read + offset + length) >
-                   mvm->cfg->trans.base_params->eeprom_size) {
+                   mvm->trans->trans_cfg->base_params->eeprom_size) {
                        IWL_ERR(mvm, "EEPROM size is too small for NVM\n");
                        return -ENOBUFS;
                }
        /* Read From FW NVM */
        IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from NVM\n");
 
-       nvm_buffer = kmalloc(mvm->cfg->trans.base_params->eeprom_size,
+       nvm_buffer = kmalloc(mvm->trans->trans_cfg->base_params->eeprom_size,
                             GFP_KERNEL);
        if (!nvm_buffer)
                return -ENOMEM;
 
                                          u8 sta_id, u8 fifo)
 {
        unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ?
-               mvm->cfg->trans.base_params->wd_timeout :
+               mvm->trans->trans_cfg->base_params->wd_timeout :
                IWL_WATCHDOG_DISABLED;
 
        if (iwl_mvm_has_new_tx_api(mvm)) {
 
                /* reset the device */
                iwl_trans_sw_reset(trans);
 
-               err = iwl_finish_nic_init(trans, &trans->cfg->trans);
+               err = iwl_finish_nic_init(trans, trans->trans_cfg);
                if (err)
                        return;
        }
        struct iwl_fw_dbg_trigger_txq_timer *txq_timer;
        unsigned int default_timeout = cmd_q ?
                IWL_DEF_WD_TIMEOUT :
-               mvm->cfg->trans.base_params->wd_timeout;
+               mvm->trans->trans_cfg->base_params->wd_timeout;
 
        if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_TXQ_TIMERS)) {
                /*
                return default_timeout;
        default:
                WARN_ON(1);
-               return mvm->cfg->trans.base_params->wd_timeout;
+               return mvm->trans->trans_cfg->base_params->wd_timeout;
        }
 }
 
 
        unsigned long flags;
        int ret;
 
-       if (WARN_ONCE(!cfg->trans.csr, "CSR addresses aren't configured\n"))
-               return -EINVAL;
-
        iwl_trans = iwl_trans_pcie_alloc(pdev, ent, &cfg->trans);
        if (IS_ERR(iwl_trans))
                return PTR_ERR(iwl_trans);
        /* the trans_cfg should never change, so set it now */
        iwl_trans->trans_cfg = &cfg->trans;
 
+       if (WARN_ONCE(!iwl_trans->trans_cfg->csr,
+                     "CSR addresses aren't configured\n")) {
+               ret = -EINVAL;
+               goto out_free_trans;
+       }
+
 #if IS_ENABLED(CONFIG_IWLMVM)
        /*
         * special-case 7265D, it has the same PCI IDs.
        /* now set the real cfg we decided to use */
        iwl_trans->cfg = cfg;
 
-       if (cfg->trans.device_family >= IWL_DEVICE_FAMILY_8000 &&
+       if (iwl_trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_8000 &&
            iwl_trans_grab_nic_access(iwl_trans, &flags)) {
                u32 hw_step;
 
 
 
        iwl_pcie_apm_config(trans);
 
-       ret = iwl_finish_nic_init(trans, &trans->cfg->trans);
+       ret = iwl_finish_nic_init(trans, trans->trans_cfg);
        if (ret)
                return ret;
 
 
        if (trans->trans_cfg->base_params->pll_cfg)
                iwl_set_bit(trans, CSR_ANA_PLL_CFG, CSR50_ANA_PLL_CFG_VAL);
 
-       ret = iwl_finish_nic_init(trans, &trans->cfg->trans);
+       ret = iwl_finish_nic_init(trans, trans->trans_cfg);
        if (ret)
                return ret;
 
 
        iwl_trans_pcie_sw_reset(trans);
 
-       ret = iwl_finish_nic_init(trans, &trans->cfg->trans);
+       ret = iwl_finish_nic_init(trans, trans->trans_cfg);
        if (WARN_ON(ret)) {
                /* Release XTAL ON request */
                __iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
        iwl_set_bit(trans, CSR_GP_CNTRL,
                    BIT(trans->trans_cfg->csr->flag_mac_access_req));
 
-       ret = iwl_finish_nic_init(trans, &trans->cfg->trans);
+       ret = iwl_finish_nic_init(trans, trans->trans_cfg);
        if (ret)
                return ret;
 
 
                                      const struct iwl_host_cmd *cmd)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
-       const struct iwl_cfg *cfg = trans->cfg;
        int ret;
 
        lockdep_assert_held(&trans_pcie->reg_lock);
         * returned. This needs to be done only on NICs that have
         * apmg_wake_up_wa set.
         */
-       if (cfg->trans.base_params->apmg_wake_up_wa &&
+       if (trans->trans_cfg->base_params->apmg_wake_up_wa &&
            !trans_pcie->cmd_hold_nic_awake) {
                __iwl_trans_pcie_set_bit(trans, CSR_GP_CNTRL,
-                                        BIT(cfg->trans.csr->flag_mac_access_req));
+                                        BIT(trans->trans_cfg->csr->flag_mac_access_req));
 
                ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
-                                  BIT(cfg->trans.csr->flag_val_mac_access_en),
-                                  (BIT(cfg->trans.csr->flag_mac_clock_ready) |
+                                  BIT(trans->trans_cfg->csr->flag_val_mac_access_en),
+                                  (BIT(trans->trans_cfg->csr->flag_mac_clock_ready) |
                                    CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP),
                                   15000);
                if (ret < 0) {
                        __iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
-                                       BIT(cfg->trans.csr->flag_mac_access_req));
+                                       BIT(trans->trans_cfg->csr->flag_mac_access_req));
                        IWL_ERR(trans, "Failed to wake NIC for hcmd\n");
                        return -EIO;
                }