Lines Matching refs:mvm

90 iwl_get_ucode_image(struct iwl_mvm *mvm, enum iwl_ucode_type ucode_type)  in iwl_get_ucode_image()  argument
95 return &mvm->fw->img[ucode_type]; in iwl_get_ucode_image()
98 static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant) in iwl_send_tx_ant_cfg() argument
104 IWL_DEBUG_FW(mvm, "select valid tx ant: %u\n", valid_tx_ant); in iwl_send_tx_ant_cfg()
105 return iwl_mvm_send_cmd_pdu(mvm, TX_ANT_CONFIGURATION_CMD, 0, in iwl_send_tx_ant_cfg()
109 void iwl_free_fw_paging(struct iwl_mvm *mvm) in iwl_free_fw_paging() argument
113 if (!mvm->fw_paging_db[0].fw_paging_block) in iwl_free_fw_paging()
117 if (!mvm->fw_paging_db[i].fw_paging_block) { in iwl_free_fw_paging()
118 IWL_DEBUG_FW(mvm, in iwl_free_fw_paging()
125 __free_pages(mvm->fw_paging_db[i].fw_paging_block, in iwl_free_fw_paging()
126 get_order(mvm->fw_paging_db[i].fw_paging_size)); in iwl_free_fw_paging()
128 kfree(mvm->trans->paging_download_buf); in iwl_free_fw_paging()
129 mvm->trans->paging_download_buf = NULL; in iwl_free_fw_paging()
131 memset(mvm->fw_paging_db, 0, sizeof(mvm->fw_paging_db)); in iwl_free_fw_paging()
134 static int iwl_fill_paging_mem(struct iwl_mvm *mvm, const struct fw_img *image) in iwl_fill_paging_mem() argument
158 IWL_ERR(mvm, "driver didn't find paging image\n"); in iwl_fill_paging_mem()
159 iwl_free_fw_paging(mvm); in iwl_fill_paging_mem()
164 IWL_DEBUG_FW(mvm, "Paging: load paging CSS to FW, sec = %d\n", in iwl_fill_paging_mem()
167 memcpy(page_address(mvm->fw_paging_db[0].fw_paging_block), in iwl_fill_paging_mem()
169 mvm->fw_paging_db[0].fw_paging_size); in iwl_fill_paging_mem()
171 IWL_DEBUG_FW(mvm, in iwl_fill_paging_mem()
173 mvm->fw_paging_db[0].fw_paging_size); in iwl_fill_paging_mem()
183 for (idx = 1; idx < mvm->num_of_paging_blk; idx++) { in iwl_fill_paging_mem()
184 memcpy(page_address(mvm->fw_paging_db[idx].fw_paging_block), in iwl_fill_paging_mem()
186 mvm->fw_paging_db[idx].fw_paging_size); in iwl_fill_paging_mem()
188 IWL_DEBUG_FW(mvm, in iwl_fill_paging_mem()
190 mvm->fw_paging_db[idx].fw_paging_size, in iwl_fill_paging_mem()
193 offset += mvm->fw_paging_db[idx].fw_paging_size; in iwl_fill_paging_mem()
197 if (mvm->num_of_pages_in_last_blk > 0) { in iwl_fill_paging_mem()
198 memcpy(page_address(mvm->fw_paging_db[idx].fw_paging_block), in iwl_fill_paging_mem()
200 FW_PAGING_SIZE * mvm->num_of_pages_in_last_blk); in iwl_fill_paging_mem()
202 IWL_DEBUG_FW(mvm, in iwl_fill_paging_mem()
204 mvm->num_of_pages_in_last_blk, idx); in iwl_fill_paging_mem()
210 static int iwl_alloc_fw_paging_mem(struct iwl_mvm *mvm, in iwl_alloc_fw_paging_mem() argument
219 if (mvm->fw_paging_db[0].fw_paging_block) in iwl_alloc_fw_paging_mem()
222 dma_enabled = is_device_dma_capable(mvm->trans->dev); in iwl_alloc_fw_paging_mem()
228 mvm->num_of_paging_blk = ((num_of_pages - 1) / in iwl_alloc_fw_paging_mem()
231 mvm->num_of_pages_in_last_blk = in iwl_alloc_fw_paging_mem()
233 NUM_OF_PAGE_PER_GROUP * (mvm->num_of_paging_blk - 1); in iwl_alloc_fw_paging_mem()
235 IWL_DEBUG_FW(mvm, in iwl_alloc_fw_paging_mem()
237 mvm->num_of_paging_blk, in iwl_alloc_fw_paging_mem()
238 mvm->num_of_pages_in_last_blk); in iwl_alloc_fw_paging_mem()
245 iwl_free_fw_paging(mvm); in iwl_alloc_fw_paging_mem()
249 mvm->fw_paging_db[blk_idx].fw_paging_block = block; in iwl_alloc_fw_paging_mem()
250 mvm->fw_paging_db[blk_idx].fw_paging_size = FW_PAGING_SIZE; in iwl_alloc_fw_paging_mem()
253 phys = dma_map_page(mvm->trans->dev, block, 0, in iwl_alloc_fw_paging_mem()
255 if (dma_mapping_error(mvm->trans->dev, phys)) { in iwl_alloc_fw_paging_mem()
260 iwl_free_fw_paging(mvm); in iwl_alloc_fw_paging_mem()
263 mvm->fw_paging_db[blk_idx].fw_paging_phys = phys; in iwl_alloc_fw_paging_mem()
265 mvm->fw_paging_db[blk_idx].fw_paging_phys = PAGING_ADDR_SIG | in iwl_alloc_fw_paging_mem()
269 IWL_DEBUG_FW(mvm, in iwl_alloc_fw_paging_mem()
277 for (blk_idx = 1; blk_idx < mvm->num_of_paging_blk + 1; blk_idx++) { in iwl_alloc_fw_paging_mem()
283 iwl_free_fw_paging(mvm); in iwl_alloc_fw_paging_mem()
287 mvm->fw_paging_db[blk_idx].fw_paging_block = block; in iwl_alloc_fw_paging_mem()
288 mvm->fw_paging_db[blk_idx].fw_paging_size = PAGING_BLOCK_SIZE; in iwl_alloc_fw_paging_mem()
291 phys = dma_map_page(mvm->trans->dev, block, 0, in iwl_alloc_fw_paging_mem()
294 if (dma_mapping_error(mvm->trans->dev, phys)) { in iwl_alloc_fw_paging_mem()
299 iwl_free_fw_paging(mvm); in iwl_alloc_fw_paging_mem()
302 mvm->fw_paging_db[blk_idx].fw_paging_phys = phys; in iwl_alloc_fw_paging_mem()
304 mvm->fw_paging_db[blk_idx].fw_paging_phys = in iwl_alloc_fw_paging_mem()
309 IWL_DEBUG_FW(mvm, in iwl_alloc_fw_paging_mem()
317 static int iwl_save_fw_paging(struct iwl_mvm *mvm, in iwl_save_fw_paging() argument
322 ret = iwl_alloc_fw_paging_mem(mvm, fw); in iwl_save_fw_paging()
326 return iwl_fill_paging_mem(mvm, fw); in iwl_save_fw_paging()
330 static int iwl_send_paging_cmd(struct iwl_mvm *mvm, const struct fw_img *fw) in iwl_send_paging_cmd() argument
338 (mvm->num_of_pages_in_last_blk << in iwl_send_paging_cmd()
341 .block_num = cpu_to_le32(mvm->num_of_paging_blk), in iwl_send_paging_cmd()
345 for (blk_idx = 0; blk_idx < mvm->num_of_paging_blk + 1; blk_idx++) { in iwl_send_paging_cmd()
347 cpu_to_le32(mvm->fw_paging_db[blk_idx].fw_paging_phys >> in iwl_send_paging_cmd()
352 return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(FW_PAGING_BLOCK_CMD, in iwl_send_paging_cmd()
360 static int iwl_trans_get_paging_item(struct iwl_mvm *mvm) in iwl_trans_get_paging_item() argument
376 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_trans_get_paging_item()
378 IWL_ERR(mvm, in iwl_trans_get_paging_item()
386 IWL_ERR(mvm, in iwl_trans_get_paging_item()
393 mvm->trans->paging_download_buf = kzalloc(MAX_PAGING_IMAGE_SIZE, in iwl_trans_get_paging_item()
395 if (!mvm->trans->paging_download_buf) { in iwl_trans_get_paging_item()
399 mvm->trans->paging_req_addr = le32_to_cpu(item_resp->item_val); in iwl_trans_get_paging_item()
400 mvm->trans->paging_db = mvm->fw_paging_db; in iwl_trans_get_paging_item()
401 IWL_DEBUG_FW(mvm, in iwl_trans_get_paging_item()
403 mvm->trans->paging_req_addr); in iwl_trans_get_paging_item()
414 struct iwl_mvm *mvm = in iwl_alive_fn() local
424 mvm->support_umac_log = false; in iwl_alive_fn()
425 mvm->error_event_table = in iwl_alive_fn()
427 mvm->log_event_table = in iwl_alive_fn()
433 IWL_DEBUG_FW(mvm, in iwl_alive_fn()
440 mvm->error_event_table = in iwl_alive_fn()
442 mvm->log_event_table = in iwl_alive_fn()
445 mvm->umac_error_event_table = in iwl_alive_fn()
447 mvm->sf_space.addr = le32_to_cpu(palive2->st_fwrd_addr); in iwl_alive_fn()
448 mvm->sf_space.size = le32_to_cpu(palive2->st_fwrd_size); in iwl_alive_fn()
452 if (mvm->umac_error_event_table) in iwl_alive_fn()
453 mvm->support_umac_log = true; in iwl_alive_fn()
455 IWL_DEBUG_FW(mvm, in iwl_alive_fn()
460 IWL_DEBUG_FW(mvm, in iwl_alive_fn()
466 mvm->error_event_table = in iwl_alive_fn()
468 mvm->log_event_table = in iwl_alive_fn()
471 mvm->umac_error_event_table = in iwl_alive_fn()
473 mvm->sf_space.addr = le32_to_cpu(palive->st_fwrd_addr); in iwl_alive_fn()
474 mvm->sf_space.size = le32_to_cpu(palive->st_fwrd_size); in iwl_alive_fn()
478 if (mvm->umac_error_event_table) in iwl_alive_fn()
479 mvm->support_umac_log = true; in iwl_alive_fn()
481 IWL_DEBUG_FW(mvm, in iwl_alive_fn()
486 IWL_DEBUG_FW(mvm, in iwl_alive_fn()
510 static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm, in iwl_mvm_load_ucode_wait_alive() argument
517 enum iwl_ucode_type old_type = mvm->cur_ucode; in iwl_mvm_load_ucode_wait_alive()
522 iwl_fw_dbg_conf_usniffer(mvm->fw, FW_DBG_START_FROM_ALIVE)) in iwl_mvm_load_ucode_wait_alive()
523 fw = iwl_get_ucode_image(mvm, IWL_UCODE_REGULAR_USNIFFER); in iwl_mvm_load_ucode_wait_alive()
525 fw = iwl_get_ucode_image(mvm, ucode_type); in iwl_mvm_load_ucode_wait_alive()
528 mvm->cur_ucode = ucode_type; in iwl_mvm_load_ucode_wait_alive()
529 mvm->ucode_loaded = false; in iwl_mvm_load_ucode_wait_alive()
531 iwl_init_notification_wait(&mvm->notif_wait, &alive_wait, in iwl_mvm_load_ucode_wait_alive()
535 ret = iwl_trans_start_fw(mvm->trans, fw, ucode_type == IWL_UCODE_INIT); in iwl_mvm_load_ucode_wait_alive()
537 mvm->cur_ucode = old_type; in iwl_mvm_load_ucode_wait_alive()
538 iwl_remove_notification(&mvm->notif_wait, &alive_wait); in iwl_mvm_load_ucode_wait_alive()
546 ret = iwl_wait_notification(&mvm->notif_wait, &alive_wait, in iwl_mvm_load_ucode_wait_alive()
549 if (mvm->trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) in iwl_mvm_load_ucode_wait_alive()
550 IWL_ERR(mvm, in iwl_mvm_load_ucode_wait_alive()
552 iwl_read_prph(mvm->trans, SB_CPU_1_STATUS), in iwl_mvm_load_ucode_wait_alive()
553 iwl_read_prph(mvm->trans, SB_CPU_2_STATUS)); in iwl_mvm_load_ucode_wait_alive()
554 mvm->cur_ucode = old_type; in iwl_mvm_load_ucode_wait_alive()
559 IWL_ERR(mvm, "Loaded ucode is not valid!\n"); in iwl_mvm_load_ucode_wait_alive()
560 mvm->cur_ucode = old_type; in iwl_mvm_load_ucode_wait_alive()
568 st_fwrd_space.addr = mvm->sf_space.addr; in iwl_mvm_load_ucode_wait_alive()
569 st_fwrd_space.size = mvm->sf_space.size; in iwl_mvm_load_ucode_wait_alive()
570 ret = iwl_trans_update_sf(mvm->trans, &st_fwrd_space); in iwl_mvm_load_ucode_wait_alive()
572 IWL_ERR(mvm, "Failed to update SF size. ret %d\n", ret); in iwl_mvm_load_ucode_wait_alive()
576 iwl_trans_fw_alive(mvm->trans, alive_data.scd_base_addr); in iwl_mvm_load_ucode_wait_alive()
590 if (!is_device_dma_capable(mvm->trans->dev)) { in iwl_mvm_load_ucode_wait_alive()
591 ret = iwl_trans_get_paging_item(mvm); in iwl_mvm_load_ucode_wait_alive()
593 IWL_ERR(mvm, "failed to get FW paging item\n"); in iwl_mvm_load_ucode_wait_alive()
598 ret = iwl_save_fw_paging(mvm, fw); in iwl_mvm_load_ucode_wait_alive()
600 IWL_ERR(mvm, "failed to save the FW paging image\n"); in iwl_mvm_load_ucode_wait_alive()
604 ret = iwl_send_paging_cmd(mvm, fw); in iwl_mvm_load_ucode_wait_alive()
606 IWL_ERR(mvm, "failed to send the paging cmd\n"); in iwl_mvm_load_ucode_wait_alive()
607 iwl_free_fw_paging(mvm); in iwl_mvm_load_ucode_wait_alive()
621 memset(&mvm->queue_info, 0, sizeof(mvm->queue_info)); in iwl_mvm_load_ucode_wait_alive()
622 mvm->queue_info[IWL_MVM_CMD_QUEUE].hw_queue_refcount = 1; in iwl_mvm_load_ucode_wait_alive()
625 atomic_set(&mvm->mac80211_queue_stop_count[i], 0); in iwl_mvm_load_ucode_wait_alive()
627 mvm->ucode_loaded = true; in iwl_mvm_load_ucode_wait_alive()
632 static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm) in iwl_send_phy_cfg_cmd() argument
635 enum iwl_ucode_type ucode_type = mvm->cur_ucode; in iwl_send_phy_cfg_cmd()
638 phy_cfg_cmd.phy_cfg = cpu_to_le32(iwl_mvm_get_phy_config(mvm)); in iwl_send_phy_cfg_cmd()
640 mvm->fw->default_calib[ucode_type].event_trigger; in iwl_send_phy_cfg_cmd()
642 mvm->fw->default_calib[ucode_type].flow_trigger; in iwl_send_phy_cfg_cmd()
644 IWL_DEBUG_INFO(mvm, "Sending Phy CFG command: 0x%x\n", in iwl_send_phy_cfg_cmd()
647 return iwl_mvm_send_cmd_pdu(mvm, PHY_CONFIGURATION_CMD, 0, in iwl_send_phy_cfg_cmd()
651 int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) in iwl_run_init_mvm_ucode() argument
660 lockdep_assert_held(&mvm->mutex); in iwl_run_init_mvm_ucode()
662 if (WARN_ON_ONCE(mvm->calibrating)) in iwl_run_init_mvm_ucode()
665 iwl_init_notification_wait(&mvm->notif_wait, in iwl_run_init_mvm_ucode()
670 mvm->phy_db); in iwl_run_init_mvm_ucode()
673 ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_INIT); in iwl_run_init_mvm_ucode()
675 IWL_ERR(mvm, "Failed to start INIT ucode: %d\n", ret); in iwl_run_init_mvm_ucode()
679 ret = iwl_send_bt_init_conf(mvm); in iwl_run_init_mvm_ucode()
686 ret = iwl_nvm_init(mvm, true); in iwl_run_init_mvm_ucode()
688 IWL_ERR(mvm, "Failed to read NVM: %d\n", ret); in iwl_run_init_mvm_ucode()
694 if (mvm->nvm_file_name) in iwl_run_init_mvm_ucode()
695 iwl_mvm_load_nvm_to_nic(mvm); in iwl_run_init_mvm_ucode()
697 ret = iwl_nvm_check_version(mvm->nvm_data, mvm->trans); in iwl_run_init_mvm_ucode()
704 if (iwl_mvm_is_radio_hw_killed(mvm)) { in iwl_run_init_mvm_ucode()
705 IWL_DEBUG_RF_KILL(mvm, in iwl_run_init_mvm_ucode()
707 iwl_remove_notification(&mvm->notif_wait, &calib_wait); in iwl_run_init_mvm_ucode()
712 mvm->calibrating = true; in iwl_run_init_mvm_ucode()
715 ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm)); in iwl_run_init_mvm_ucode()
723 ret = iwl_send_phy_cfg_cmd(mvm); in iwl_run_init_mvm_ucode()
725 IWL_ERR(mvm, "Failed to run INIT calibrations: %d\n", in iwl_run_init_mvm_ucode()
734 ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait, in iwl_run_init_mvm_ucode()
737 if (ret && iwl_mvm_is_radio_hw_killed(mvm)) { in iwl_run_init_mvm_ucode()
738 IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n"); in iwl_run_init_mvm_ucode()
744 iwl_remove_notification(&mvm->notif_wait, &calib_wait); in iwl_run_init_mvm_ucode()
746 mvm->calibrating = false; in iwl_run_init_mvm_ucode()
747 if (iwlmvm_mod_params.init_dbg && !mvm->nvm_data) { in iwl_run_init_mvm_ucode()
749 mvm->nvm_data = kzalloc(sizeof(struct iwl_nvm_data) + in iwl_run_init_mvm_ucode()
753 if (!mvm->nvm_data) in iwl_run_init_mvm_ucode()
755 mvm->nvm_data->bands[0].channels = mvm->nvm_data->channels; in iwl_run_init_mvm_ucode()
756 mvm->nvm_data->bands[0].n_channels = 1; in iwl_run_init_mvm_ucode()
757 mvm->nvm_data->bands[0].n_bitrates = 1; in iwl_run_init_mvm_ucode()
758 mvm->nvm_data->bands[0].bitrates = in iwl_run_init_mvm_ucode()
759 (void *)mvm->nvm_data->channels + 1; in iwl_run_init_mvm_ucode()
760 mvm->nvm_data->bands[0].bitrates->hw_value = 10; in iwl_run_init_mvm_ucode()
766 static void iwl_mvm_get_shared_mem_conf(struct iwl_mvm *mvm) in iwl_mvm_get_shared_mem_conf() argument
778 lockdep_assert_held(&mvm->mutex); in iwl_mvm_get_shared_mem_conf()
780 if (WARN_ON(iwl_mvm_send_cmd(mvm, &cmd))) in iwl_mvm_get_shared_mem_conf()
786 mvm->shared_mem_cfg.shared_mem_addr = in iwl_mvm_get_shared_mem_conf()
788 mvm->shared_mem_cfg.shared_mem_size = in iwl_mvm_get_shared_mem_conf()
790 mvm->shared_mem_cfg.sample_buff_addr = in iwl_mvm_get_shared_mem_conf()
792 mvm->shared_mem_cfg.sample_buff_size = in iwl_mvm_get_shared_mem_conf()
794 mvm->shared_mem_cfg.txfifo_addr = le32_to_cpu(mem_cfg->txfifo_addr); in iwl_mvm_get_shared_mem_conf()
795 for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.txfifo_size); i++) in iwl_mvm_get_shared_mem_conf()
796 mvm->shared_mem_cfg.txfifo_size[i] = in iwl_mvm_get_shared_mem_conf()
798 for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.rxfifo_size); i++) in iwl_mvm_get_shared_mem_conf()
799 mvm->shared_mem_cfg.rxfifo_size[i] = in iwl_mvm_get_shared_mem_conf()
801 mvm->shared_mem_cfg.page_buff_addr = in iwl_mvm_get_shared_mem_conf()
803 mvm->shared_mem_cfg.page_buff_size = in iwl_mvm_get_shared_mem_conf()
805 IWL_DEBUG_INFO(mvm, "SHARED MEM CFG: got memory offsets/sizes\n"); in iwl_mvm_get_shared_mem_conf()
810 int iwl_mvm_fw_dbg_collect_desc(struct iwl_mvm *mvm, in iwl_mvm_fw_dbg_collect_desc() argument
819 if (test_and_set_bit(IWL_MVM_STATUS_DUMPING_FW_LOG, &mvm->status)) in iwl_mvm_fw_dbg_collect_desc()
822 if (WARN_ON(mvm->fw_dump_desc)) in iwl_mvm_fw_dbg_collect_desc()
823 iwl_mvm_free_fw_dump_desc(mvm); in iwl_mvm_fw_dbg_collect_desc()
825 IWL_WARN(mvm, "Collecting data: trigger %d fired.\n", in iwl_mvm_fw_dbg_collect_desc()
828 mvm->fw_dump_desc = desc; in iwl_mvm_fw_dbg_collect_desc()
829 mvm->fw_dump_trig = trigger; in iwl_mvm_fw_dbg_collect_desc()
831 queue_delayed_work(system_wq, &mvm->fw_dump_wk, delay); in iwl_mvm_fw_dbg_collect_desc()
836 int iwl_mvm_fw_dbg_collect(struct iwl_mvm *mvm, enum iwl_fw_dbg_trigger trig, in iwl_mvm_fw_dbg_collect() argument
850 return iwl_mvm_fw_dbg_collect_desc(mvm, desc, trigger); in iwl_mvm_fw_dbg_collect()
853 int iwl_mvm_fw_dbg_collect_trig(struct iwl_mvm *mvm, in iwl_mvm_fw_dbg_collect_trig() argument
880 ret = iwl_mvm_fw_dbg_collect(mvm, le32_to_cpu(trigger->id), buf, len, in iwl_mvm_fw_dbg_collect_trig()
890 static inline void iwl_mvm_restart_early_start(struct iwl_mvm *mvm) in iwl_mvm_restart_early_start() argument
892 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000) in iwl_mvm_restart_early_start()
893 iwl_clear_bits_prph(mvm->trans, MON_BUFF_SAMPLE_CTL, 0x100); in iwl_mvm_restart_early_start()
895 iwl_write_prph(mvm->trans, DBGC_IN_SAMPLE, 1); in iwl_mvm_restart_early_start()
898 int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, u8 conf_id) in iwl_mvm_start_fw_dbg_conf() argument
904 if (WARN_ONCE(conf_id >= ARRAY_SIZE(mvm->fw->dbg_conf_tlv), in iwl_mvm_start_fw_dbg_conf()
909 if ((!mvm->fw->dbg_conf_tlv[conf_id] || in iwl_mvm_start_fw_dbg_conf()
910 !mvm->fw->dbg_conf_tlv[conf_id]->num_of_hcmds) && in iwl_mvm_start_fw_dbg_conf()
912 iwl_mvm_restart_early_start(mvm); in iwl_mvm_start_fw_dbg_conf()
916 if (!mvm->fw->dbg_conf_tlv[conf_id]) in iwl_mvm_start_fw_dbg_conf()
919 if (mvm->fw_dbg_conf != FW_DBG_INVALID) in iwl_mvm_start_fw_dbg_conf()
920 IWL_WARN(mvm, "FW already configured (%d) - re-configuring\n", in iwl_mvm_start_fw_dbg_conf()
921 mvm->fw_dbg_conf); in iwl_mvm_start_fw_dbg_conf()
924 ptr = (void *)&mvm->fw->dbg_conf_tlv[conf_id]->hcmd; in iwl_mvm_start_fw_dbg_conf()
925 for (i = 0; i < mvm->fw->dbg_conf_tlv[conf_id]->num_of_hcmds; i++) { in iwl_mvm_start_fw_dbg_conf()
928 ret = iwl_mvm_send_cmd_pdu(mvm, cmd->id, 0, in iwl_mvm_start_fw_dbg_conf()
937 mvm->fw_dbg_conf = conf_id; in iwl_mvm_start_fw_dbg_conf()
941 static int iwl_mvm_config_ltr(struct iwl_mvm *mvm) in iwl_mvm_config_ltr() argument
947 if (!mvm->trans->ltr_enabled) in iwl_mvm_config_ltr()
950 return iwl_mvm_send_cmd_pdu(mvm, LTR_CONFIG, 0, in iwl_mvm_config_ltr()
954 int iwl_mvm_up(struct iwl_mvm *mvm) in iwl_mvm_up() argument
960 lockdep_assert_held(&mvm->mutex); in iwl_mvm_up()
962 ret = iwl_trans_start_hw(mvm->trans); in iwl_mvm_up()
971 ret = iwl_run_init_mvm_ucode(mvm, false); in iwl_mvm_up()
973 IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret); in iwl_mvm_up()
985 _iwl_trans_stop_device(mvm->trans, false); in iwl_mvm_up()
986 ret = _iwl_trans_start_hw(mvm->trans, false); in iwl_mvm_up()
994 ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR); in iwl_mvm_up()
996 IWL_ERR(mvm, "Failed to start RT ucode: %d\n", ret); in iwl_mvm_up()
1000 iwl_mvm_get_shared_mem_conf(mvm); in iwl_mvm_up()
1002 ret = iwl_mvm_sf_update(mvm, NULL, false); in iwl_mvm_up()
1004 IWL_ERR(mvm, "Failed to initialize Smart Fifo\n"); in iwl_mvm_up()
1006 mvm->fw_dbg_conf = FW_DBG_INVALID; in iwl_mvm_up()
1008 if (mvm->fw->dbg_dest_tlv) in iwl_mvm_up()
1009 mvm->fw_dbg_conf = FW_DBG_START_FROM_ALIVE; in iwl_mvm_up()
1010 iwl_mvm_start_fw_dbg_conf(mvm, FW_DBG_START_FROM_ALIVE); in iwl_mvm_up()
1012 ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_up()
1016 ret = iwl_send_bt_init_conf(mvm); in iwl_mvm_up()
1021 ret = iwl_send_phy_db_data(mvm->phy_db); in iwl_mvm_up()
1025 ret = iwl_send_phy_cfg_cmd(mvm); in iwl_mvm_up()
1031 RCU_INIT_POINTER(mvm->fw_id_to_mac_id[i], NULL); in iwl_mvm_up()
1033 mvm->tdls_cs.peer.sta_id = IWL_MVM_STATION_COUNT; in iwl_mvm_up()
1036 memset(&mvm->last_quota_cmd, 0xff, sizeof(mvm->last_quota_cmd)); in iwl_mvm_up()
1039 ret = iwl_mvm_add_aux_sta(mvm); in iwl_mvm_up()
1044 chan = &mvm->hw->wiphy->bands[IEEE80211_BAND_2GHZ]->channels[0]; in iwl_mvm_up()
1052 ret = iwl_mvm_phy_ctxt_add(mvm, &mvm->phy_ctxts[i], in iwl_mvm_up()
1059 iwl_mvm_tt_tx_backoff(mvm, 0); in iwl_mvm_up()
1061 WARN_ON(iwl_mvm_config_ltr(mvm)); in iwl_mvm_up()
1063 ret = iwl_mvm_power_update_device(mvm); in iwl_mvm_up()
1071 if (!test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status)) { in iwl_mvm_up()
1072 ret = iwl_mvm_init_mcc(mvm); in iwl_mvm_up()
1077 if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) { in iwl_mvm_up()
1078 ret = iwl_mvm_config_scan(mvm); in iwl_mvm_up()
1083 if (iwl_mvm_is_csum_supported(mvm) && in iwl_mvm_up()
1084 mvm->cfg->features & NETIF_F_RXCSUM) in iwl_mvm_up()
1085 iwl_trans_write_prph(mvm->trans, RX_EN_CSUM, 0x3); in iwl_mvm_up()
1088 if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) in iwl_mvm_up()
1089 iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN); in iwl_mvm_up()
1091 IWL_DEBUG_INFO(mvm, "RT uCode started.\n"); in iwl_mvm_up()
1094 iwl_trans_stop_device(mvm->trans); in iwl_mvm_up()
1098 int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm) in iwl_mvm_load_d3_fw() argument
1102 lockdep_assert_held(&mvm->mutex); in iwl_mvm_load_d3_fw()
1104 ret = iwl_trans_start_hw(mvm->trans); in iwl_mvm_load_d3_fw()
1108 ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_WOWLAN); in iwl_mvm_load_d3_fw()
1110 IWL_ERR(mvm, "Failed to start WoWLAN firmware: %d\n", ret); in iwl_mvm_load_d3_fw()
1114 ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm)); in iwl_mvm_load_d3_fw()
1119 ret = iwl_send_phy_db_data(mvm->phy_db); in iwl_mvm_load_d3_fw()
1123 ret = iwl_send_phy_cfg_cmd(mvm); in iwl_mvm_load_d3_fw()
1129 RCU_INIT_POINTER(mvm->fw_id_to_mac_id[i], NULL); in iwl_mvm_load_d3_fw()
1132 ret = iwl_mvm_add_aux_sta(mvm); in iwl_mvm_load_d3_fw()
1138 iwl_trans_stop_device(mvm->trans); in iwl_mvm_load_d3_fw()
1142 void iwl_mvm_rx_card_state_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_card_state_notif() argument
1149 IWL_DEBUG_RF_KILL(mvm, "Card state received: HW:%s SW:%s CT:%s\n", in iwl_mvm_rx_card_state_notif()
1156 void iwl_mvm_rx_mfuart_notif(struct iwl_mvm *mvm, in iwl_mvm_rx_mfuart_notif() argument
1162 IWL_DEBUG_INFO(mvm, in iwl_mvm_rx_mfuart_notif()