linux/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * This file is provided under a dual BSD/GPLv2 license.  When using or
   4 * redistributing this file, you may do so under either license.
   5 *
   6 * GPL LICENSE SUMMARY
   7 *
   8 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
   9 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  10 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of version 2 of the GNU General Public License as
  14 * published by the Free Software Foundation.
  15 *
  16 * This program is distributed in the hope that it will be useful, but
  17 * WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19 * General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
  24 * USA
  25 *
  26 * The full GNU General Public License is included in this distribution
  27 * in the file called COPYING.
  28 *
  29 * Contact Information:
  30 *  Intel Linux Wireless <linuxwifi@intel.com>
  31 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  32 *
  33 * BSD LICENSE
  34 *
  35 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  36 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  37 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
  38 * All rights reserved.
  39 *
  40 * Redistribution and use in source and binary forms, with or without
  41 * modification, are permitted provided that the following conditions
  42 * are met:
  43 *
  44 *  * Redistributions of source code must retain the above copyright
  45 *    notice, this list of conditions and the following disclaimer.
  46 *  * Redistributions in binary form must reproduce the above copyright
  47 *    notice, this list of conditions and the following disclaimer in
  48 *    the documentation and/or other materials provided with the
  49 *    distribution.
  50 *  * Neither the name Intel Corporation nor the names of its
  51 *    contributors may be used to endorse or promote products derived
  52 *    from this software without specific prior written permission.
  53 *
  54 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  55 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  56 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  57 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  58 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  59 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  60 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  61 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  62 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  63 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  64 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  65 *
  66 *****************************************************************************/
  67#include <net/mac80211.h>
  68#include <linux/netdevice.h>
  69
  70#include "iwl-trans.h"
  71#include "iwl-op-mode.h"
  72#include "fw/img.h"
  73#include "iwl-debug.h"
  74#include "iwl-csr.h" /* for iwl_mvm_rx_card_state_notif */
  75#include "iwl-io.h" /* for iwl_mvm_rx_card_state_notif */
  76#include "iwl-prph.h"
  77#include "fw/acpi.h"
  78
  79#include "mvm.h"
  80#include "fw/dbg.h"
  81#include "iwl-phy-db.h"
  82
  83#define MVM_UCODE_ALIVE_TIMEOUT HZ
  84#define MVM_UCODE_CALIB_TIMEOUT (2*HZ)
  85
  86#define UCODE_VALID_OK  cpu_to_le32(0x1)
  87
  88struct iwl_mvm_alive_data {
  89        bool valid;
  90        u32 scd_base_addr;
  91};
  92
  93static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant)
  94{
  95        struct iwl_tx_ant_cfg_cmd tx_ant_cmd = {
  96                .valid = cpu_to_le32(valid_tx_ant),
  97        };
  98
  99        IWL_DEBUG_FW(mvm, "select valid tx ant: %u\n", valid_tx_ant);
 100        return iwl_mvm_send_cmd_pdu(mvm, TX_ANT_CONFIGURATION_CMD, 0,
 101                                    sizeof(tx_ant_cmd), &tx_ant_cmd);
 102}
 103
 104static int iwl_send_rss_cfg_cmd(struct iwl_mvm *mvm)
 105{
 106        int i;
 107        struct iwl_rss_config_cmd cmd = {
 108                .flags = cpu_to_le32(IWL_RSS_ENABLE),
 109                .hash_mask = IWL_RSS_HASH_TYPE_IPV4_TCP |
 110                             IWL_RSS_HASH_TYPE_IPV4_UDP |
 111                             IWL_RSS_HASH_TYPE_IPV4_PAYLOAD |
 112                             IWL_RSS_HASH_TYPE_IPV6_TCP |
 113                             IWL_RSS_HASH_TYPE_IPV6_UDP |
 114                             IWL_RSS_HASH_TYPE_IPV6_PAYLOAD,
 115        };
 116
 117        if (mvm->trans->num_rx_queues == 1)
 118                return 0;
 119
 120        /* Do not direct RSS traffic to Q 0 which is our fallback queue */
 121        for (i = 0; i < ARRAY_SIZE(cmd.indirection_table); i++)
 122                cmd.indirection_table[i] =
 123                        1 + (i % (mvm->trans->num_rx_queues - 1));
 124        netdev_rss_key_fill(cmd.secret_key, sizeof(cmd.secret_key));
 125
 126        return iwl_mvm_send_cmd_pdu(mvm, RSS_CONFIG_CMD, 0, sizeof(cmd), &cmd);
 127}
 128
 129static int iwl_mvm_send_dqa_cmd(struct iwl_mvm *mvm)
 130{
 131        struct iwl_dqa_enable_cmd dqa_cmd = {
 132                .cmd_queue = cpu_to_le32(IWL_MVM_DQA_CMD_QUEUE),
 133        };
 134        u32 cmd_id = iwl_cmd_id(DQA_ENABLE_CMD, DATA_PATH_GROUP, 0);
 135        int ret;
 136
 137        ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(dqa_cmd), &dqa_cmd);
 138        if (ret)
 139                IWL_ERR(mvm, "Failed to send DQA enabling command: %d\n", ret);
 140        else
 141                IWL_DEBUG_FW(mvm, "Working in DQA mode\n");
 142
 143        return ret;
 144}
 145
 146void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm,
 147                                   struct iwl_rx_cmd_buffer *rxb)
 148{
 149        struct iwl_rx_packet *pkt = rxb_addr(rxb);
 150        struct iwl_mfu_assert_dump_notif *mfu_dump_notif = (void *)pkt->data;
 151        __le32 *dump_data = mfu_dump_notif->data;
 152        int n_words = le32_to_cpu(mfu_dump_notif->data_size) / sizeof(__le32);
 153        int i;
 154
 155        if (mfu_dump_notif->index_num == 0)
 156                IWL_INFO(mvm, "MFUART assert id 0x%x occurred\n",
 157                         le32_to_cpu(mfu_dump_notif->assert_id));
 158
 159        for (i = 0; i < n_words; i++)
 160                IWL_DEBUG_INFO(mvm,
 161                               "MFUART assert dump, dword %u: 0x%08x\n",
 162                               le16_to_cpu(mfu_dump_notif->index_num) *
 163                               n_words + i,
 164                               le32_to_cpu(dump_data[i]));
 165}
 166
 167static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
 168                         struct iwl_rx_packet *pkt, void *data)
 169{
 170        struct iwl_mvm *mvm =
 171                container_of(notif_wait, struct iwl_mvm, notif_wait);
 172        struct iwl_mvm_alive_data *alive_data = data;
 173        struct mvm_alive_resp_v3 *palive3;
 174        struct mvm_alive_resp *palive;
 175        struct iwl_umac_alive *umac;
 176        struct iwl_lmac_alive *lmac1;
 177        struct iwl_lmac_alive *lmac2 = NULL;
 178        u16 status;
 179        u32 umac_error_event_table;
 180
 181        if (iwl_rx_packet_payload_len(pkt) == sizeof(*palive)) {
 182                palive = (void *)pkt->data;
 183                umac = &palive->umac_data;
 184                lmac1 = &palive->lmac_data[0];
 185                lmac2 = &palive->lmac_data[1];
 186                status = le16_to_cpu(palive->status);
 187        } else {
 188                palive3 = (void *)pkt->data;
 189                umac = &palive3->umac_data;
 190                lmac1 = &palive3->lmac_data;
 191                status = le16_to_cpu(palive3->status);
 192        }
 193
 194        mvm->error_event_table[0] = le32_to_cpu(lmac1->error_event_table_ptr);
 195        if (lmac2)
 196                mvm->error_event_table[1] =
 197                        le32_to_cpu(lmac2->error_event_table_ptr);
 198        mvm->log_event_table = le32_to_cpu(lmac1->log_event_table_ptr);
 199
 200        umac_error_event_table = le32_to_cpu(umac->error_info_addr);
 201
 202        if (!umac_error_event_table) {
 203                mvm->support_umac_log = false;
 204        } else if (umac_error_event_table >=
 205                   mvm->trans->cfg->min_umac_error_event_table) {
 206                mvm->support_umac_log = true;
 207                mvm->umac_error_event_table = umac_error_event_table;
 208        } else {
 209                IWL_ERR(mvm,
 210                        "Not valid error log pointer 0x%08X for %s uCode\n",
 211                        mvm->umac_error_event_table,
 212                        (mvm->fwrt.cur_fw_img == IWL_UCODE_INIT) ?
 213                        "Init" : "RT");
 214                mvm->support_umac_log = false;
 215        }
 216
 217        alive_data->scd_base_addr = le32_to_cpu(lmac1->scd_base_ptr);
 218        alive_data->valid = status == IWL_ALIVE_STATUS_OK;
 219
 220        IWL_DEBUG_FW(mvm,
 221                     "Alive ucode status 0x%04x revision 0x%01X 0x%01X\n",
 222                     status, lmac1->ver_type, lmac1->ver_subtype);
 223
 224        if (lmac2)
 225                IWL_DEBUG_FW(mvm, "Alive ucode CDB\n");
 226
 227        IWL_DEBUG_FW(mvm,
 228                     "UMAC version: Major - 0x%x, Minor - 0x%x\n",
 229                     le32_to_cpu(umac->umac_major),
 230                     le32_to_cpu(umac->umac_minor));
 231
 232        return true;
 233}
 234
 235static bool iwl_wait_init_complete(struct iwl_notif_wait_data *notif_wait,
 236                                   struct iwl_rx_packet *pkt, void *data)
 237{
 238        WARN_ON(pkt->hdr.cmd != INIT_COMPLETE_NOTIF);
 239
 240        return true;
 241}
 242
 243static bool iwl_wait_phy_db_entry(struct iwl_notif_wait_data *notif_wait,
 244                                  struct iwl_rx_packet *pkt, void *data)
 245{
 246        struct iwl_phy_db *phy_db = data;
 247
 248        if (pkt->hdr.cmd != CALIB_RES_NOTIF_PHY_DB) {
 249                WARN_ON(pkt->hdr.cmd != INIT_COMPLETE_NOTIF);
 250                return true;
 251        }
 252
 253        WARN_ON(iwl_phy_db_set_section(phy_db, pkt));
 254
 255        return false;
 256}
 257
 258static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
 259                                         enum iwl_ucode_type ucode_type)
 260{
 261        struct iwl_notification_wait alive_wait;
 262        struct iwl_mvm_alive_data alive_data;
 263        const struct fw_img *fw;
 264        int ret, i;
 265        enum iwl_ucode_type old_type = mvm->fwrt.cur_fw_img;
 266        static const u16 alive_cmd[] = { MVM_ALIVE };
 267
 268        if (ucode_type == IWL_UCODE_REGULAR &&
 269            iwl_fw_dbg_conf_usniffer(mvm->fw, FW_DBG_START_FROM_ALIVE) &&
 270            !(fw_has_capa(&mvm->fw->ucode_capa,
 271                          IWL_UCODE_TLV_CAPA_USNIFFER_UNIFIED)))
 272                fw = iwl_get_ucode_image(mvm->fw, IWL_UCODE_REGULAR_USNIFFER);
 273        else
 274                fw = iwl_get_ucode_image(mvm->fw, ucode_type);
 275        if (WARN_ON(!fw))
 276                return -EINVAL;
 277        iwl_fw_set_current_image(&mvm->fwrt, ucode_type);
 278        clear_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
 279
 280        iwl_init_notification_wait(&mvm->notif_wait, &alive_wait,
 281                                   alive_cmd, ARRAY_SIZE(alive_cmd),
 282                                   iwl_alive_fn, &alive_data);
 283
 284        ret = iwl_trans_start_fw(mvm->trans, fw, ucode_type == IWL_UCODE_INIT);
 285        if (ret) {
 286                iwl_fw_set_current_image(&mvm->fwrt, old_type);
 287                iwl_remove_notification(&mvm->notif_wait, &alive_wait);
 288                return ret;
 289        }
 290
 291        /*
 292         * Some things may run in the background now, but we
 293         * just wait for the ALIVE notification here.
 294         */
 295        ret = iwl_wait_notification(&mvm->notif_wait, &alive_wait,
 296                                    MVM_UCODE_ALIVE_TIMEOUT);
 297        if (ret) {
 298                struct iwl_trans *trans = mvm->trans;
 299
 300                if (trans->cfg->device_family == IWL_DEVICE_FAMILY_22000)
 301                        IWL_ERR(mvm,
 302                                "SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
 303                                iwl_read_prph(trans, UMAG_SB_CPU_1_STATUS),
 304                                iwl_read_prph(trans, UMAG_SB_CPU_2_STATUS));
 305                else if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000)
 306                        IWL_ERR(mvm,
 307                                "SecBoot CPU1 Status: 0x%x, CPU2 Status: 0x%x\n",
 308                                iwl_read_prph(trans, SB_CPU_1_STATUS),
 309                                iwl_read_prph(trans, SB_CPU_2_STATUS));
 310                iwl_fw_set_current_image(&mvm->fwrt, old_type);
 311                return ret;
 312        }
 313
 314        if (!alive_data.valid) {
 315                IWL_ERR(mvm, "Loaded ucode is not valid!\n");
 316                iwl_fw_set_current_image(&mvm->fwrt, old_type);
 317                return -EIO;
 318        }
 319
 320        iwl_trans_fw_alive(mvm->trans, alive_data.scd_base_addr);
 321
 322        /*
 323         * Note: all the queues are enabled as part of the interface
 324         * initialization, but in firmware restart scenarios they
 325         * could be stopped, so wake them up. In firmware restart,
 326         * mac80211 will have the queues stopped as well until the
 327         * reconfiguration completes. During normal startup, they
 328         * will be empty.
 329         */
 330
 331        memset(&mvm->queue_info, 0, sizeof(mvm->queue_info));
 332        mvm->queue_info[IWL_MVM_DQA_CMD_QUEUE].hw_queue_refcount = 1;
 333
 334        for (i = 0; i < IEEE80211_MAX_QUEUES; i++)
 335                atomic_set(&mvm->mac80211_queue_stop_count[i], 0);
 336
 337        set_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
 338
 339        return 0;
 340}
 341
 342static int iwl_run_unified_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
 343{
 344        struct iwl_notification_wait init_wait;
 345        struct iwl_nvm_access_complete_cmd nvm_complete = {};
 346        struct iwl_init_extended_cfg_cmd init_cfg = {
 347                .init_flags = cpu_to_le32(BIT(IWL_INIT_NVM)),
 348        };
 349        static const u16 init_complete[] = {
 350                INIT_COMPLETE_NOTIF,
 351        };
 352        int ret;
 353
 354        lockdep_assert_held(&mvm->mutex);
 355
 356        iwl_init_notification_wait(&mvm->notif_wait,
 357                                   &init_wait,
 358                                   init_complete,
 359                                   ARRAY_SIZE(init_complete),
 360                                   iwl_wait_init_complete,
 361                                   NULL);
 362
 363        /* Will also start the device */
 364        ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR);
 365        if (ret) {
 366                IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret);
 367                goto error;
 368        }
 369
 370        /* Send init config command to mark that we are sending NVM access
 371         * commands
 372         */
 373        ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(SYSTEM_GROUP,
 374                                                INIT_EXTENDED_CFG_CMD), 0,
 375                                   sizeof(init_cfg), &init_cfg);
 376        if (ret) {
 377                IWL_ERR(mvm, "Failed to run init config command: %d\n",
 378                        ret);
 379                goto error;
 380        }
 381
 382        /* Load NVM to NIC if needed */
 383        if (mvm->nvm_file_name) {
 384                iwl_mvm_read_external_nvm(mvm);
 385                iwl_mvm_load_nvm_to_nic(mvm);
 386        }
 387
 388        if (IWL_MVM_PARSE_NVM && read_nvm) {
 389                ret = iwl_nvm_init(mvm);
 390                if (ret) {
 391                        IWL_ERR(mvm, "Failed to read NVM: %d\n", ret);
 392                        goto error;
 393                }
 394        }
 395
 396        ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(REGULATORY_AND_NVM_GROUP,
 397                                                NVM_ACCESS_COMPLETE), 0,
 398                                   sizeof(nvm_complete), &nvm_complete);
 399        if (ret) {
 400                IWL_ERR(mvm, "Failed to run complete NVM access: %d\n",
 401                        ret);
 402                goto error;
 403        }
 404
 405        /* We wait for the INIT complete notification */
 406        ret = iwl_wait_notification(&mvm->notif_wait, &init_wait,
 407                                    MVM_UCODE_ALIVE_TIMEOUT);
 408        if (ret)
 409                return ret;
 410
 411        /* Read the NVM only at driver load time, no need to do this twice */
 412        if (!IWL_MVM_PARSE_NVM && read_nvm) {
 413                mvm->nvm_data = iwl_fw_get_nvm(&mvm->fwrt);
 414                if (IS_ERR(mvm->nvm_data)) {
 415                        ret = PTR_ERR(mvm->nvm_data);
 416                        mvm->nvm_data = NULL;
 417                        IWL_ERR(mvm, "Failed to read NVM: %d\n", ret);
 418                        return ret;
 419                }
 420        }
 421
 422        return 0;
 423
 424error:
 425        iwl_remove_notification(&mvm->notif_wait, &init_wait);
 426        return ret;
 427}
 428
 429static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
 430{
 431        struct iwl_phy_cfg_cmd phy_cfg_cmd;
 432        enum iwl_ucode_type ucode_type = mvm->fwrt.cur_fw_img;
 433
 434        /* Set parameters */
 435        phy_cfg_cmd.phy_cfg = cpu_to_le32(iwl_mvm_get_phy_config(mvm));
 436
 437        /* set flags extra PHY configuration flags from the device's cfg */
 438        phy_cfg_cmd.phy_cfg |= cpu_to_le32(mvm->cfg->extra_phy_cfg_flags);
 439
 440        phy_cfg_cmd.calib_control.event_trigger =
 441                mvm->fw->default_calib[ucode_type].event_trigger;
 442        phy_cfg_cmd.calib_control.flow_trigger =
 443                mvm->fw->default_calib[ucode_type].flow_trigger;
 444
 445        IWL_DEBUG_INFO(mvm, "Sending Phy CFG command: 0x%x\n",
 446                       phy_cfg_cmd.phy_cfg);
 447
 448        return iwl_mvm_send_cmd_pdu(mvm, PHY_CONFIGURATION_CMD, 0,
 449                                    sizeof(phy_cfg_cmd), &phy_cfg_cmd);
 450}
 451
 452int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
 453{
 454        struct iwl_notification_wait calib_wait;
 455        static const u16 init_complete[] = {
 456                INIT_COMPLETE_NOTIF,
 457                CALIB_RES_NOTIF_PHY_DB
 458        };
 459        int ret;
 460
 461        if (iwl_mvm_has_unified_ucode(mvm))
 462                return iwl_run_unified_mvm_ucode(mvm, true);
 463
 464        lockdep_assert_held(&mvm->mutex);
 465
 466        if (WARN_ON_ONCE(mvm->calibrating))
 467                return 0;
 468
 469        iwl_init_notification_wait(&mvm->notif_wait,
 470                                   &calib_wait,
 471                                   init_complete,
 472                                   ARRAY_SIZE(init_complete),
 473                                   iwl_wait_phy_db_entry,
 474                                   mvm->phy_db);
 475
 476        /* Will also start the device */
 477        ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_INIT);
 478        if (ret) {
 479                IWL_ERR(mvm, "Failed to start INIT ucode: %d\n", ret);
 480                goto remove_notif;
 481        }
 482
 483        if (mvm->cfg->device_family < IWL_DEVICE_FAMILY_8000) {
 484                ret = iwl_mvm_send_bt_init_conf(mvm);
 485                if (ret)
 486                        goto remove_notif;
 487        }
 488
 489        /* Read the NVM only at driver load time, no need to do this twice */
 490        if (read_nvm) {
 491                ret = iwl_nvm_init(mvm);
 492                if (ret) {
 493                        IWL_ERR(mvm, "Failed to read NVM: %d\n", ret);
 494                        goto remove_notif;
 495                }
 496        }
 497
 498        /* In case we read the NVM from external file, load it to the NIC */
 499        if (mvm->nvm_file_name)
 500                iwl_mvm_load_nvm_to_nic(mvm);
 501
 502        WARN_ON(iwl_nvm_check_version(mvm->nvm_data, mvm->trans));
 503
 504        /*
 505         * abort after reading the nvm in case RF Kill is on, we will complete
 506         * the init seq later when RF kill will switch to off
 507         */
 508        if (iwl_mvm_is_radio_hw_killed(mvm)) {
 509                IWL_DEBUG_RF_KILL(mvm,
 510                                  "jump over all phy activities due to RF kill\n");
 511                goto remove_notif;
 512        }
 513
 514        mvm->calibrating = true;
 515
 516        /* Send TX valid antennas before triggering calibrations */
 517        ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm));
 518        if (ret)
 519                goto remove_notif;
 520
 521        ret = iwl_send_phy_cfg_cmd(mvm);
 522        if (ret) {
 523                IWL_ERR(mvm, "Failed to run INIT calibrations: %d\n",
 524                        ret);
 525                goto remove_notif;
 526        }
 527
 528        /*
 529         * Some things may run in the background now, but we
 530         * just wait for the calibration complete notification.
 531         */
 532        ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait,
 533                                    MVM_UCODE_CALIB_TIMEOUT);
 534        if (!ret)
 535                goto out;
 536
 537        if (iwl_mvm_is_radio_hw_killed(mvm)) {
 538                IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n");
 539                ret = 0;
 540        } else {
 541                IWL_ERR(mvm, "Failed to run INIT calibrations: %d\n",
 542                        ret);
 543        }
 544
 545        goto out;
 546
 547remove_notif:
 548        iwl_remove_notification(&mvm->notif_wait, &calib_wait);
 549out:
 550        mvm->calibrating = false;
 551        if (iwlmvm_mod_params.init_dbg && !mvm->nvm_data) {
 552                /* we want to debug INIT and we have no NVM - fake */
 553                mvm->nvm_data = kzalloc(sizeof(struct iwl_nvm_data) +
 554                                        sizeof(struct ieee80211_channel) +
 555                                        sizeof(struct ieee80211_rate),
 556                                        GFP_KERNEL);
 557                if (!mvm->nvm_data)
 558                        return -ENOMEM;
 559                mvm->nvm_data->bands[0].channels = mvm->nvm_data->channels;
 560                mvm->nvm_data->bands[0].n_channels = 1;
 561                mvm->nvm_data->bands[0].n_bitrates = 1;
 562                mvm->nvm_data->bands[0].bitrates =
 563                        (void *)mvm->nvm_data->channels + 1;
 564                mvm->nvm_data->bands[0].bitrates->hw_value = 10;
 565        }
 566
 567        return ret;
 568}
 569
 570static int iwl_mvm_config_ltr(struct iwl_mvm *mvm)
 571{
 572        struct iwl_ltr_config_cmd cmd = {
 573                .flags = cpu_to_le32(LTR_CFG_FLAG_FEATURE_ENABLE),
 574        };
 575
 576        if (!mvm->trans->ltr_enabled)
 577                return 0;
 578
 579        return iwl_mvm_send_cmd_pdu(mvm, LTR_CONFIG, 0,
 580                                    sizeof(cmd), &cmd);
 581}
 582
 583#ifdef CONFIG_ACPI
 584static int iwl_mvm_sar_set_profile(struct iwl_mvm *mvm,
 585                                   union acpi_object *table,
 586                                   struct iwl_mvm_sar_profile *profile,
 587                                   bool enabled)
 588{
 589        int i;
 590
 591        profile->enabled = enabled;
 592
 593        for (i = 0; i < ACPI_SAR_TABLE_SIZE; i++) {
 594                if ((table[i].type != ACPI_TYPE_INTEGER) ||
 595                    (table[i].integer.value > U8_MAX))
 596                        return -EINVAL;
 597
 598                profile->table[i] = table[i].integer.value;
 599        }
 600
 601        return 0;
 602}
 603
 604static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm)
 605{
 606        union acpi_object *wifi_pkg, *table, *data;
 607        bool enabled;
 608        int ret;
 609
 610        data = iwl_acpi_get_object(mvm->dev, ACPI_WRDS_METHOD);
 611        if (IS_ERR(data))
 612                return PTR_ERR(data);
 613
 614        wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
 615                                         ACPI_WRDS_WIFI_DATA_SIZE);
 616        if (IS_ERR(wifi_pkg)) {
 617                ret = PTR_ERR(wifi_pkg);
 618                goto out_free;
 619        }
 620
 621        if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) {
 622                ret = -EINVAL;
 623                goto out_free;
 624        }
 625
 626        enabled = !!(wifi_pkg->package.elements[1].integer.value);
 627
 628        /* position of the actual table */
 629        table = &wifi_pkg->package.elements[2];
 630
 631        /* The profile from WRDS is officially profile 1, but goes
 632         * into sar_profiles[0] (because we don't have a profile 0).
 633         */
 634        ret = iwl_mvm_sar_set_profile(mvm, table, &mvm->sar_profiles[0],
 635                                      enabled);
 636out_free:
 637        kfree(data);
 638        return ret;
 639}
 640
 641static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
 642{
 643        union acpi_object *wifi_pkg, *data;
 644        bool enabled;
 645        int i, n_profiles, ret;
 646
 647        data = iwl_acpi_get_object(mvm->dev, ACPI_EWRD_METHOD);
 648        if (IS_ERR(data))
 649                return PTR_ERR(data);
 650
 651        wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
 652                                         ACPI_EWRD_WIFI_DATA_SIZE);
 653        if (IS_ERR(wifi_pkg)) {
 654                ret = PTR_ERR(wifi_pkg);
 655                goto out_free;
 656        }
 657
 658        if ((wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) ||
 659            (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER)) {
 660                ret = -EINVAL;
 661                goto out_free;
 662        }
 663
 664        enabled = !!(wifi_pkg->package.elements[1].integer.value);
 665        n_profiles = wifi_pkg->package.elements[2].integer.value;
 666
 667        /* in case of BIOS bug */
 668        if (n_profiles <= 0) {
 669                ret = -EINVAL;
 670                goto out_free;
 671        }
 672
 673        for (i = 0; i < n_profiles; i++) {
 674                /* the tables start at element 3 */
 675                static int pos = 3;
 676
 677                /* The EWRD profiles officially go from 2 to 4, but we
 678                 * save them in sar_profiles[1-3] (because we don't
 679                 * have profile 0).  So in the array we start from 1.
 680                 */
 681                ret = iwl_mvm_sar_set_profile(mvm,
 682                                              &wifi_pkg->package.elements[pos],
 683                                              &mvm->sar_profiles[i + 1],
 684                                              enabled);
 685                if (ret < 0)
 686                        break;
 687
 688                /* go to the next table */
 689                pos += ACPI_SAR_TABLE_SIZE;
 690        }
 691
 692out_free:
 693        kfree(data);
 694        return ret;
 695}
 696
 697static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
 698{
 699        union acpi_object *wifi_pkg, *data;
 700        int i, j, ret;
 701        int idx = 1;
 702
 703        data = iwl_acpi_get_object(mvm->dev, ACPI_WGDS_METHOD);
 704        if (IS_ERR(data))
 705                return PTR_ERR(data);
 706
 707        wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data,
 708                                         ACPI_WGDS_WIFI_DATA_SIZE);
 709        if (IS_ERR(wifi_pkg)) {
 710                ret = PTR_ERR(wifi_pkg);
 711                goto out_free;
 712        }
 713
 714        for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
 715                for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) {
 716                        union acpi_object *entry;
 717
 718                        entry = &wifi_pkg->package.elements[idx++];
 719                        if ((entry->type != ACPI_TYPE_INTEGER) ||
 720                            (entry->integer.value > U8_MAX)) {
 721                                ret = -EINVAL;
 722                                goto out_free;
 723                        }
 724
 725                        mvm->geo_profiles[i].values[j] = entry->integer.value;
 726                }
 727        }
 728        ret = 0;
 729out_free:
 730        kfree(data);
 731        return ret;
 732}
 733
 734int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
 735{
 736        struct iwl_dev_tx_power_cmd cmd = {
 737                .v3.set_mode = cpu_to_le32(IWL_TX_POWER_MODE_SET_CHAINS),
 738        };
 739        int i, j, idx;
 740        int profs[ACPI_SAR_NUM_CHAIN_LIMITS] = { prof_a, prof_b };
 741        int len = sizeof(cmd);
 742
 743        BUILD_BUG_ON(ACPI_SAR_NUM_CHAIN_LIMITS < 2);
 744        BUILD_BUG_ON(ACPI_SAR_NUM_CHAIN_LIMITS * ACPI_SAR_NUM_SUB_BANDS !=
 745                     ACPI_SAR_TABLE_SIZE);
 746
 747        if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_TX_POWER_ACK))
 748                len = sizeof(cmd.v3);
 749
 750        for (i = 0; i < ACPI_SAR_NUM_CHAIN_LIMITS; i++) {
 751                struct iwl_mvm_sar_profile *prof;
 752
 753                /* don't allow SAR to be disabled (profile 0 means disable) */
 754                if (profs[i] == 0)
 755                        return -EPERM;
 756
 757                /* we are off by one, so allow up to ACPI_SAR_PROFILE_NUM */
 758                if (profs[i] > ACPI_SAR_PROFILE_NUM)
 759                        return -EINVAL;
 760
 761                /* profiles go from 1 to 4, so decrement to access the array */
 762                prof = &mvm->sar_profiles[profs[i] - 1];
 763
 764                /* if the profile is disabled, do nothing */
 765                if (!prof->enabled) {
 766                        IWL_DEBUG_RADIO(mvm, "SAR profile %d is disabled.\n",
 767                                        profs[i]);
 768                        /* if one of the profiles is disabled, we fail all */
 769                        return -ENOENT;
 770                }
 771
 772                IWL_DEBUG_RADIO(mvm, "  Chain[%d]:\n", i);
 773                for (j = 0; j < ACPI_SAR_NUM_SUB_BANDS; j++) {
 774                        idx = (i * ACPI_SAR_NUM_SUB_BANDS) + j;
 775                        cmd.v3.per_chain_restriction[i][j] =
 776                                cpu_to_le16(prof->table[idx]);
 777                        IWL_DEBUG_RADIO(mvm, "    Band[%d] = %d * .125dBm\n",
 778                                        j, prof->table[idx]);
 779                }
 780        }
 781
 782        IWL_DEBUG_RADIO(mvm, "Sending REDUCE_TX_POWER_CMD per chain\n");
 783
 784        return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd);
 785}
 786
 787int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm)
 788{
 789        struct iwl_geo_tx_power_profiles_resp *resp;
 790        int ret;
 791
 792        struct iwl_geo_tx_power_profiles_cmd geo_cmd = {
 793                .ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE),
 794        };
 795        struct iwl_host_cmd cmd = {
 796                .id =  WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT),
 797                .len = { sizeof(geo_cmd), },
 798                .flags = CMD_WANT_SKB,
 799                .data = { &geo_cmd },
 800        };
 801
 802        ret = iwl_mvm_send_cmd(mvm, &cmd);
 803        if (ret) {
 804                IWL_ERR(mvm, "Failed to get geographic profile info %d\n", ret);
 805                return ret;
 806        }
 807
 808        resp = (void *)cmd.resp_pkt->data;
 809        ret = le32_to_cpu(resp->profile_idx);
 810        if (WARN_ON(ret > ACPI_NUM_GEO_PROFILES)) {
 811                ret = -EIO;
 812                IWL_WARN(mvm, "Invalid geographic profile idx (%d)\n", ret);
 813        }
 814
 815        iwl_free_resp(&cmd);
 816        return ret;
 817}
 818
 819static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
 820{
 821        struct iwl_geo_tx_power_profiles_cmd cmd = {
 822                .ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_SET_TABLES),
 823        };
 824        int ret, i, j;
 825        u16 cmd_wide_id =  WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT);
 826
 827        ret = iwl_mvm_sar_get_wgds_table(mvm);
 828        if (ret < 0) {
 829                IWL_DEBUG_RADIO(mvm,
 830                                "Geo SAR BIOS table invalid or unavailable. (%d)\n",
 831                                ret);
 832                /* we don't fail if the table is not available */
 833                return 0;
 834        }
 835
 836        IWL_DEBUG_RADIO(mvm, "Sending GEO_TX_POWER_LIMIT\n");
 837
 838        BUILD_BUG_ON(ACPI_NUM_GEO_PROFILES * ACPI_WGDS_NUM_BANDS *
 839                     ACPI_WGDS_TABLE_SIZE !=  ACPI_WGDS_WIFI_DATA_SIZE);
 840
 841        BUILD_BUG_ON(ACPI_NUM_GEO_PROFILES > IWL_NUM_GEO_PROFILES);
 842
 843        for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) {
 844                struct iwl_per_chain_offset *chain =
 845                        (struct iwl_per_chain_offset *)&cmd.table[i];
 846
 847                for (j = 0; j < ACPI_WGDS_NUM_BANDS; j++) {
 848                        u8 *value;
 849
 850                        value = &mvm->geo_profiles[i].values[j *
 851                                ACPI_GEO_PER_CHAIN_SIZE];
 852                        chain[j].max_tx_power = cpu_to_le16(value[0]);
 853                        chain[j].chain_a = value[1];
 854                        chain[j].chain_b = value[2];
 855                        IWL_DEBUG_RADIO(mvm,
 856                                        "SAR geographic profile[%d] Band[%d]: chain A = %d chain B = %d max_tx_power = %d\n",
 857                                        i, j, value[1], value[2], value[0]);
 858                }
 859        }
 860        return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, sizeof(cmd), &cmd);
 861}
 862
 863#else /* CONFIG_ACPI */
 864static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm)
 865{
 866        return -ENOENT;
 867}
 868
 869static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
 870{
 871        return -ENOENT;
 872}
 873
 874static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
 875{
 876        return 0;
 877}
 878
 879int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a,
 880                               int prof_b)
 881{
 882        return -ENOENT;
 883}
 884
 885int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm)
 886{
 887        return -ENOENT;
 888}
 889#endif /* CONFIG_ACPI */
 890
 891static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
 892{
 893        int ret;
 894
 895        ret = iwl_mvm_sar_get_wrds_table(mvm);
 896        if (ret < 0) {
 897                IWL_DEBUG_RADIO(mvm,
 898                                "WRDS SAR BIOS table invalid or unavailable. (%d)\n",
 899                                ret);
 900                /* if not available, don't fail and don't bother with EWRD */
 901                return 0;
 902        }
 903
 904        ret = iwl_mvm_sar_get_ewrd_table(mvm);
 905        /* if EWRD is not available, we can still use WRDS, so don't fail */
 906        if (ret < 0)
 907                IWL_DEBUG_RADIO(mvm,
 908                                "EWRD SAR BIOS table invalid or unavailable. (%d)\n",
 909                                ret);
 910
 911        /* choose profile 1 (WRDS) as default for both chains */
 912        ret = iwl_mvm_sar_select_profile(mvm, 1, 1);
 913
 914        /* if we don't have profile 0 from BIOS, just skip it */
 915        if (ret == -ENOENT)
 916                return 0;
 917
 918        return ret;
 919}
 920
 921static int iwl_mvm_load_rt_fw(struct iwl_mvm *mvm)
 922{
 923        int ret;
 924
 925        if (iwl_mvm_has_unified_ucode(mvm))
 926                return iwl_run_unified_mvm_ucode(mvm, false);
 927
 928        ret = iwl_run_init_mvm_ucode(mvm, false);
 929
 930        if (ret) {
 931                IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret);
 932
 933                if (iwlmvm_mod_params.init_dbg)
 934                        return 0;
 935                return ret;
 936        }
 937
 938        /*
 939         * Stop and start the transport without entering low power
 940         * mode. This will save the state of other components on the
 941         * device that are triggered by the INIT firwmare (MFUART).
 942         */
 943        _iwl_trans_stop_device(mvm->trans, false);
 944        ret = _iwl_trans_start_hw(mvm->trans, false);
 945        if (ret)
 946                return ret;
 947
 948        ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR);
 949        if (ret)
 950                return ret;
 951
 952        return iwl_init_paging(&mvm->fwrt, mvm->fwrt.cur_fw_img);
 953}
 954
 955int iwl_mvm_up(struct iwl_mvm *mvm)
 956{
 957        int ret, i;
 958        struct ieee80211_channel *chan;
 959        struct cfg80211_chan_def chandef;
 960
 961        lockdep_assert_held(&mvm->mutex);
 962
 963        ret = iwl_trans_start_hw(mvm->trans);
 964        if (ret)
 965                return ret;
 966
 967        ret = iwl_mvm_load_rt_fw(mvm);
 968        if (ret) {
 969                IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret);
 970                goto error;
 971        }
 972
 973        iwl_get_shared_mem_conf(&mvm->fwrt);
 974
 975        ret = iwl_mvm_sf_update(mvm, NULL, false);
 976        if (ret)
 977                IWL_ERR(mvm, "Failed to initialize Smart Fifo\n");
 978
 979        mvm->fwrt.dump.conf = FW_DBG_INVALID;
 980        /* if we have a destination, assume EARLY START */
 981        if (mvm->fw->dbg_dest_tlv)
 982                mvm->fwrt.dump.conf = FW_DBG_START_FROM_ALIVE;
 983        iwl_fw_start_dbg_conf(&mvm->fwrt, FW_DBG_START_FROM_ALIVE);
 984
 985        ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm));
 986        if (ret)
 987                goto error;
 988
 989        if (!iwl_mvm_has_unified_ucode(mvm)) {
 990                /* Send phy db control command and then phy db calibration */
 991                ret = iwl_send_phy_db_data(mvm->phy_db);
 992                if (ret)
 993                        goto error;
 994
 995                ret = iwl_send_phy_cfg_cmd(mvm);
 996                if (ret)
 997                        goto error;
 998        }
 999
1000        ret = iwl_mvm_send_bt_init_conf(mvm);
1001        if (ret)
1002                goto error;
1003
1004        /* Init RSS configuration */
1005        /* TODO - remove 22000 disablement when we have RXQ config API */
1006        if (iwl_mvm_has_new_rx_api(mvm) &&
1007            mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_22000) {
1008                ret = iwl_send_rss_cfg_cmd(mvm);
1009                if (ret) {
1010                        IWL_ERR(mvm, "Failed to configure RSS queues: %d\n",
1011                                ret);
1012                        goto error;
1013                }
1014        }
1015
1016        /* init the fw <-> mac80211 STA mapping */
1017        for (i = 0; i < ARRAY_SIZE(mvm->fw_id_to_mac_id); i++)
1018                RCU_INIT_POINTER(mvm->fw_id_to_mac_id[i], NULL);
1019
1020        mvm->tdls_cs.peer.sta_id = IWL_MVM_INVALID_STA;
1021
1022        /* reset quota debouncing buffer - 0xff will yield invalid data */
1023        memset(&mvm->last_quota_cmd, 0xff, sizeof(mvm->last_quota_cmd));
1024
1025        ret = iwl_mvm_send_dqa_cmd(mvm);
1026        if (ret)
1027                goto error;
1028
1029        /* Add auxiliary station for scanning */
1030        ret = iwl_mvm_add_aux_sta(mvm);
1031        if (ret)
1032                goto error;
1033
1034        /* Add all the PHY contexts */
1035        chan = &mvm->hw->wiphy->bands[NL80211_BAND_2GHZ]->channels[0];
1036        cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_NO_HT);
1037        for (i = 0; i < NUM_PHY_CTX; i++) {
1038                /*
1039                 * The channel used here isn't relevant as it's
1040                 * going to be overwritten in the other flows.
1041                 * For now use the first channel we have.
1042                 */
1043                ret = iwl_mvm_phy_ctxt_add(mvm, &mvm->phy_ctxts[i],
1044                                           &chandef, 1, 1);
1045                if (ret)
1046                        goto error;
1047        }
1048
1049#ifdef CONFIG_THERMAL
1050        if (iwl_mvm_is_tt_in_fw(mvm)) {
1051                /* in order to give the responsibility of ct-kill and
1052                 * TX backoff to FW we need to send empty temperature reporting
1053                 * cmd during init time
1054                 */
1055                iwl_mvm_send_temp_report_ths_cmd(mvm);
1056        } else {
1057                /* Initialize tx backoffs to the minimal possible */
1058                iwl_mvm_tt_tx_backoff(mvm, 0);
1059        }
1060
1061        /* TODO: read the budget from BIOS / Platform NVM */
1062
1063        /*
1064         * In case there is no budget from BIOS / Platform NVM the default
1065         * budget should be 2000mW (cooling state 0).
1066         */
1067        if (iwl_mvm_is_ctdp_supported(mvm)) {
1068                ret = iwl_mvm_ctdp_command(mvm, CTDP_CMD_OPERATION_START,
1069                                           mvm->cooling_dev.cur_state);
1070                if (ret)
1071                        goto error;
1072        }
1073#else
1074        /* Initialize tx backoffs to the minimal possible */
1075        iwl_mvm_tt_tx_backoff(mvm, 0);
1076#endif
1077
1078        WARN_ON(iwl_mvm_config_ltr(mvm));
1079
1080        ret = iwl_mvm_power_update_device(mvm);
1081        if (ret)
1082                goto error;
1083
1084        /*
1085         * RTNL is not taken during Ct-kill, but we don't need to scan/Tx
1086         * anyway, so don't init MCC.
1087         */
1088        if (!test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status)) {
1089                ret = iwl_mvm_init_mcc(mvm);
1090                if (ret)
1091                        goto error;
1092        }
1093
1094        if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
1095                mvm->scan_type = IWL_SCAN_TYPE_NOT_SET;
1096                ret = iwl_mvm_config_scan(mvm);
1097                if (ret)
1098                        goto error;
1099        }
1100
1101        /* allow FW/transport low power modes if not during restart */
1102        if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1103                iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN);
1104
1105        ret = iwl_mvm_sar_init(mvm);
1106        if (ret)
1107                goto error;
1108
1109        ret = iwl_mvm_sar_geo_init(mvm);
1110        if (ret)
1111                goto error;
1112
1113        iwl_mvm_leds_sync(mvm);
1114
1115        IWL_DEBUG_INFO(mvm, "RT uCode started.\n");
1116        return 0;
1117 error:
1118        if (!iwlmvm_mod_params.init_dbg || !ret)
1119                iwl_mvm_stop_device(mvm);
1120        return ret;
1121}
1122
1123int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm)
1124{
1125        int ret, i;
1126
1127        lockdep_assert_held(&mvm->mutex);
1128
1129        ret = iwl_trans_start_hw(mvm->trans);
1130        if (ret)
1131                return ret;
1132
1133        ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_WOWLAN);
1134        if (ret) {
1135                IWL_ERR(mvm, "Failed to start WoWLAN firmware: %d\n", ret);
1136                goto error;
1137        }
1138
1139        ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm));
1140        if (ret)
1141                goto error;
1142
1143        /* Send phy db control command and then phy db calibration*/
1144        ret = iwl_send_phy_db_data(mvm->phy_db);
1145        if (ret)
1146                goto error;
1147
1148        ret = iwl_send_phy_cfg_cmd(mvm);
1149        if (ret)
1150                goto error;
1151
1152        /* init the fw <-> mac80211 STA mapping */
1153        for (i = 0; i < ARRAY_SIZE(mvm->fw_id_to_mac_id); i++)
1154                RCU_INIT_POINTER(mvm->fw_id_to_mac_id[i], NULL);
1155
1156        /* Add auxiliary station for scanning */
1157        ret = iwl_mvm_add_aux_sta(mvm);
1158        if (ret)
1159                goto error;
1160
1161        return 0;
1162 error:
1163        iwl_mvm_stop_device(mvm);
1164        return ret;
1165}
1166
1167void iwl_mvm_rx_card_state_notif(struct iwl_mvm *mvm,
1168                                 struct iwl_rx_cmd_buffer *rxb)
1169{
1170        struct iwl_rx_packet *pkt = rxb_addr(rxb);
1171        struct iwl_card_state_notif *card_state_notif = (void *)pkt->data;
1172        u32 flags = le32_to_cpu(card_state_notif->flags);
1173
1174        IWL_DEBUG_RF_KILL(mvm, "Card state received: HW:%s SW:%s CT:%s\n",
1175                          (flags & HW_CARD_DISABLED) ? "Kill" : "On",
1176                          (flags & SW_CARD_DISABLED) ? "Kill" : "On",
1177                          (flags & CT_KILL_CARD_DISABLED) ?
1178                          "Reached" : "Not reached");
1179}
1180
1181void iwl_mvm_rx_mfuart_notif(struct iwl_mvm *mvm,
1182                             struct iwl_rx_cmd_buffer *rxb)
1183{
1184        struct iwl_rx_packet *pkt = rxb_addr(rxb);
1185        struct iwl_mfuart_load_notif *mfuart_notif = (void *)pkt->data;
1186
1187        IWL_DEBUG_INFO(mvm,
1188                       "MFUART: installed ver: 0x%08x, external ver: 0x%08x, status: 0x%08x, duration: 0x%08x\n",
1189                       le32_to_cpu(mfuart_notif->installed_ver),
1190                       le32_to_cpu(mfuart_notif->external_ver),
1191                       le32_to_cpu(mfuart_notif->status),
1192                       le32_to_cpu(mfuart_notif->duration));
1193
1194        if (iwl_rx_packet_payload_len(pkt) == sizeof(*mfuart_notif))
1195                IWL_DEBUG_INFO(mvm,
1196                               "MFUART: image size: 0x%08x\n",
1197                               le32_to_cpu(mfuart_notif->image_size));
1198}
1199