Lines Matching refs:mvm
91 static int iwl_nvm_write_chunk(struct iwl_mvm *mvm, u16 section, in iwl_nvm_write_chunk() argument
112 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_nvm_write_chunk()
120 IWL_ERR(mvm, in iwl_nvm_write_chunk()
130 static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section, in iwl_nvm_read_chunk() argument
151 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_nvm_read_chunk()
174 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
179 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
181 ret, mvm->cfg->name); in iwl_nvm_read_chunk()
188 IWL_ERR(mvm, "NVM ACCESS response with invalid offset %d\n", in iwl_nvm_read_chunk()
203 static int iwl_nvm_write_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_write_section() argument
216 ret = iwl_nvm_write_chunk(mvm, section, offset, in iwl_nvm_write_section()
237 static int iwl_nvm_read_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_read_section() argument
252 mvm->trans->trans_cfg->base_params->eeprom_size) { in iwl_nvm_read_section()
253 IWL_ERR(mvm, "EEPROM size is too small for NVM\n"); in iwl_nvm_read_section()
257 ret = iwl_nvm_read_chunk(mvm, section, offset, length, data); in iwl_nvm_read_section()
259 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
267 iwl_nvm_fixups(mvm->trans->hw_id, section, data, offset); in iwl_nvm_read_section()
269 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
275 iwl_parse_nvm_sections(struct iwl_mvm *mvm) in iwl_parse_nvm_sections() argument
277 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_parse_nvm_sections()
284 if (mvm->trans->cfg->nvm_type != IWL_NVM_EXT) { in iwl_parse_nvm_sections()
285 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
286 !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) { in iwl_parse_nvm_sections()
287 IWL_ERR(mvm, "Can't parse empty OTP/NVM sections\n"); in iwl_parse_nvm_sections()
291 if (mvm->trans->cfg->nvm_type == IWL_NVM_SDP) in iwl_parse_nvm_sections()
297 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
298 !mvm->nvm_sections[regulatory_type].data) { in iwl_parse_nvm_sections()
299 IWL_ERR(mvm, in iwl_parse_nvm_sections()
304 if (!mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data && in iwl_parse_nvm_sections()
305 !mvm->nvm_sections[NVM_SECTION_TYPE_MAC_OVERRIDE].data) { in iwl_parse_nvm_sections()
306 IWL_ERR(mvm, in iwl_parse_nvm_sections()
312 if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { in iwl_parse_nvm_sections()
313 IWL_ERR(mvm, in iwl_parse_nvm_sections()
319 hw = (const __be16 *)sections[mvm->cfg->nvm_hw_section_num].data; in iwl_parse_nvm_sections()
326 regulatory = mvm->trans->cfg->nvm_type == IWL_NVM_SDP ? in iwl_parse_nvm_sections()
331 fw_has_capa(&mvm->fw->ucode_capa, in iwl_parse_nvm_sections()
334 return iwl_parse_nvm_data(mvm->trans, mvm->cfg, hw, sw, calib, in iwl_parse_nvm_sections()
336 mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant, in iwl_parse_nvm_sections()
341 int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm) in iwl_mvm_load_nvm_to_nic() argument
344 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_mvm_load_nvm_to_nic()
346 IWL_DEBUG_EEPROM(mvm->trans->dev, "'Write to NVM\n"); in iwl_mvm_load_nvm_to_nic()
348 for (i = 0; i < ARRAY_SIZE(mvm->nvm_sections); i++) { in iwl_mvm_load_nvm_to_nic()
349 if (!mvm->nvm_sections[i].data || !mvm->nvm_sections[i].length) in iwl_mvm_load_nvm_to_nic()
351 ret = iwl_nvm_write_section(mvm, i, sections[i].data, in iwl_mvm_load_nvm_to_nic()
354 IWL_ERR(mvm, "iwl_mvm_send_cmd failed: %d\n", ret); in iwl_mvm_load_nvm_to_nic()
361 int iwl_nvm_init(struct iwl_mvm *mvm) in iwl_nvm_init() argument
366 const char *nvm_file_C = mvm->cfg->default_nvm_file_C_step; in iwl_nvm_init()
368 if (WARN_ON_ONCE(mvm->cfg->nvm_hw_section_num >= NVM_MAX_NUM_SECTIONS)) in iwl_nvm_init()
373 IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from NVM\n"); in iwl_nvm_init()
375 nvm_buffer = kmalloc(mvm->trans->trans_cfg->base_params->eeprom_size, in iwl_nvm_init()
381 ret = iwl_nvm_read_section(mvm, section, nvm_buffer, in iwl_nvm_init()
396 iwl_nvm_fixups(mvm->trans->hw_id, section, temp, ret); in iwl_nvm_init()
398 mvm->nvm_sections[section].data = temp; in iwl_nvm_init()
399 mvm->nvm_sections[section].length = ret; in iwl_nvm_init()
404 mvm->nvm_sw_blob.data = temp; in iwl_nvm_init()
405 mvm->nvm_sw_blob.size = ret; in iwl_nvm_init()
408 mvm->nvm_calib_blob.data = temp; in iwl_nvm_init()
409 mvm->nvm_calib_blob.size = ret; in iwl_nvm_init()
412 mvm->nvm_prod_blob.data = temp; in iwl_nvm_init()
413 mvm->nvm_prod_blob.size = ret; in iwl_nvm_init()
416 mvm->nvm_phy_sku_blob.data = temp; in iwl_nvm_init()
417 mvm->nvm_phy_sku_blob.size = ret; in iwl_nvm_init()
421 mvm->nvm_reg_blob.data = temp; in iwl_nvm_init()
422 mvm->nvm_reg_blob.size = ret; in iwl_nvm_init()
425 if (section == mvm->cfg->nvm_hw_section_num) { in iwl_nvm_init()
426 mvm->nvm_hw_blob.data = temp; in iwl_nvm_init()
427 mvm->nvm_hw_blob.size = ret; in iwl_nvm_init()
434 IWL_ERR(mvm, "OTP is blank\n"); in iwl_nvm_init()
438 if (mvm->nvm_file_name) { in iwl_nvm_init()
440 ret = iwl_read_external_nvm(mvm->trans, mvm->nvm_file_name, in iwl_nvm_init()
441 mvm->nvm_sections); in iwl_nvm_init()
443 mvm->nvm_file_name = nvm_file_C; in iwl_nvm_init()
446 mvm->nvm_file_name) { in iwl_nvm_init()
448 ret = iwl_read_external_nvm(mvm->trans, in iwl_nvm_init()
449 mvm->nvm_file_name, in iwl_nvm_init()
450 mvm->nvm_sections); in iwl_nvm_init()
460 mvm->nvm_data = iwl_parse_nvm_sections(mvm); in iwl_nvm_init()
461 if (!mvm->nvm_data) in iwl_nvm_init()
463 IWL_DEBUG_EEPROM(mvm->trans->dev, "nvm version = %x\n", in iwl_nvm_init()
464 mvm->nvm_data->nvm_version); in iwl_nvm_init()
470 iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2, in iwl_mvm_update_mcc() argument
490 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm))) in iwl_mvm_update_mcc()
495 IWL_DEBUG_LAR(mvm, "send MCC update to FW with '%c%c' src = %d\n", in iwl_mvm_update_mcc()
498 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_mvm_update_mcc()
505 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_update_mcc()
550 IWL_DEBUG_LAR(mvm, in iwl_mvm_update_mcc()
559 int iwl_mvm_init_mcc(struct iwl_mvm *mvm) in iwl_mvm_init_mcc() argument
567 if (mvm->cfg->nvm_type == IWL_NVM_EXT) { in iwl_mvm_init_mcc()
568 tlv_lar = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_init_mcc()
570 nvm_lar = mvm->nvm_data->lar_enabled; in iwl_mvm_init_mcc()
572 IWL_INFO(mvm, in iwl_mvm_init_mcc()
578 if (!iwl_mvm_is_lar_supported(mvm)) in iwl_mvm_init_mcc()
585 retval = iwl_mvm_init_fw_regd(mvm); in iwl_mvm_init_mcc()
595 mvm->lar_regdom_set = false; in iwl_mvm_init_mcc()
597 regd = iwl_mvm_get_current_regdomain(mvm, NULL); in iwl_mvm_init_mcc()
601 if (iwl_mvm_is_wifi_mcc_supported(mvm) && in iwl_mvm_init_mcc()
602 !iwl_acpi_get_mcc(mvm->dev, mcc)) { in iwl_mvm_init_mcc()
604 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, in iwl_mvm_init_mcc()
610 retval = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd); in iwl_mvm_init_mcc()
615 void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm, in iwl_mvm_rx_chub_update_mcc() argument
625 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_chub_update_mcc()
627 if (iwl_mvm_is_vif_assoc(mvm) && notif->source_id == MCC_SOURCE_WIFI) { in iwl_mvm_rx_chub_update_mcc()
628 IWL_DEBUG_LAR(mvm, "Ignore mcc update while associated\n"); in iwl_mvm_rx_chub_update_mcc()
632 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm))) in iwl_mvm_rx_chub_update_mcc()
640 IWL_DEBUG_LAR(mvm, in iwl_mvm_rx_chub_update_mcc()
643 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, src, NULL); in iwl_mvm_rx_chub_update_mcc()
647 wgds_tbl_idx = iwl_mvm_get_sar_geo_profile(mvm); in iwl_mvm_rx_chub_update_mcc()
649 IWL_DEBUG_INFO(mvm, "SAR WGDS is disabled (%d)\n", in iwl_mvm_rx_chub_update_mcc()
652 IWL_DEBUG_INFO(mvm, "SAR WGDS: geo profile %d is configured\n", in iwl_mvm_rx_chub_update_mcc()
655 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd); in iwl_mvm_rx_chub_update_mcc()