Lines Matching refs:mvm
95 static int iwl_nvm_write_chunk(struct iwl_mvm *mvm, u16 section, in iwl_nvm_write_chunk() argument
113 return iwl_mvm_send_cmd(mvm, &cmd); in iwl_nvm_write_chunk()
116 static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section, in iwl_nvm_read_chunk() argument
137 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_nvm_read_chunk()
160 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
165 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
167 ret, mvm->cfg->name); in iwl_nvm_read_chunk()
174 IWL_ERR(mvm, "NVM ACCESS response with invalid offset %d\n", in iwl_nvm_read_chunk()
189 static int iwl_nvm_write_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_write_section() argument
202 ret = iwl_nvm_write_chunk(mvm, section, offset, in iwl_nvm_write_section()
223 static int iwl_nvm_read_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_read_section() argument
238 mvm->cfg->base_params->eeprom_size) { in iwl_nvm_read_section()
239 IWL_ERR(mvm, "EEPROM size is too small for NVM\n"); in iwl_nvm_read_section()
243 ret = iwl_nvm_read_chunk(mvm, section, offset, length, data); in iwl_nvm_read_section()
245 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
253 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
259 iwl_parse_nvm_sections(struct iwl_mvm *mvm) in iwl_parse_nvm_sections() argument
261 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_parse_nvm_sections()
267 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) { in iwl_parse_nvm_sections()
268 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
269 !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) { in iwl_parse_nvm_sections()
270 IWL_ERR(mvm, "Can't parse empty OTP/NVM sections\n"); in iwl_parse_nvm_sections()
275 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
276 !mvm->nvm_sections[NVM_SECTION_TYPE_REGULATORY].data) { in iwl_parse_nvm_sections()
277 IWL_ERR(mvm, in iwl_parse_nvm_sections()
282 if (!mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data && in iwl_parse_nvm_sections()
283 !mvm->nvm_sections[NVM_SECTION_TYPE_MAC_OVERRIDE].data) { in iwl_parse_nvm_sections()
284 IWL_ERR(mvm, in iwl_parse_nvm_sections()
290 if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { in iwl_parse_nvm_sections()
291 IWL_ERR(mvm, in iwl_parse_nvm_sections()
297 if (WARN_ON(!mvm->cfg)) in iwl_parse_nvm_sections()
301 mac_addr0 = iwl_trans_read_prph(mvm->trans, WFMP_MAC_ADDR_0); in iwl_parse_nvm_sections()
302 mac_addr1 = iwl_trans_read_prph(mvm->trans, WFMP_MAC_ADDR_1); in iwl_parse_nvm_sections()
304 hw = (const __le16 *)sections[mvm->cfg->nvm_hw_section_num].data; in iwl_parse_nvm_sections()
313 fw_has_capa(&mvm->fw->ucode_capa, in iwl_parse_nvm_sections()
316 return iwl_parse_nvm_data(mvm->trans->dev, mvm->cfg, hw, sw, calib, in iwl_parse_nvm_sections()
318 mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant, in iwl_parse_nvm_sections()
320 mvm->trans->hw_id); in iwl_parse_nvm_sections()
346 static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm) in iwl_mvm_read_external_nvm() argument
368 IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from external NVM\n"); in iwl_mvm_read_external_nvm()
371 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) in iwl_mvm_read_external_nvm()
382 ret = request_firmware(&fw_entry, mvm->nvm_file_name, in iwl_mvm_read_external_nvm()
383 mvm->trans->dev); in iwl_mvm_read_external_nvm()
385 IWL_ERR(mvm, "ERROR: %s isn't available %d\n", in iwl_mvm_read_external_nvm()
386 mvm->nvm_file_name, ret); in iwl_mvm_read_external_nvm()
390 IWL_INFO(mvm, "Loaded NVM file %s (%zu bytes)\n", in iwl_mvm_read_external_nvm()
391 mvm->nvm_file_name, fw_entry->size); in iwl_mvm_read_external_nvm()
394 IWL_ERR(mvm, "NVM file too large\n"); in iwl_mvm_read_external_nvm()
413 IWL_INFO(mvm, "NVM Version %08X\n", le32_to_cpu(dword_buff[2])); in iwl_mvm_read_external_nvm()
414 IWL_INFO(mvm, "NVM Manufacturing date %08X\n", in iwl_mvm_read_external_nvm()
418 if ((CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_C_STEP && in iwl_mvm_read_external_nvm()
420 (CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_B_STEP && in iwl_mvm_read_external_nvm()
431 IWL_ERR(mvm, in iwl_mvm_read_external_nvm()
443 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) { in iwl_mvm_read_external_nvm()
455 IWL_ERR(mvm, "ERROR - section too large (%d)\n", in iwl_mvm_read_external_nvm()
462 IWL_ERR(mvm, "ERROR - section empty\n"); in iwl_mvm_read_external_nvm()
468 IWL_ERR(mvm, in iwl_mvm_read_external_nvm()
486 kfree(mvm->nvm_sections[section_id].data); in iwl_mvm_read_external_nvm()
487 mvm->nvm_sections[section_id].data = temp; in iwl_mvm_read_external_nvm()
488 mvm->nvm_sections[section_id].length = section_size; in iwl_mvm_read_external_nvm()
499 int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm) in iwl_mvm_load_nvm_to_nic() argument
502 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_mvm_load_nvm_to_nic()
504 IWL_DEBUG_EEPROM(mvm->trans->dev, "'Write to NVM\n"); in iwl_mvm_load_nvm_to_nic()
506 for (i = 0; i < ARRAY_SIZE(mvm->nvm_sections); i++) { in iwl_mvm_load_nvm_to_nic()
507 if (!mvm->nvm_sections[i].data || !mvm->nvm_sections[i].length) in iwl_mvm_load_nvm_to_nic()
509 ret = iwl_nvm_write_section(mvm, i, sections[i].data, in iwl_mvm_load_nvm_to_nic()
512 IWL_ERR(mvm, "iwl_mvm_send_cmd failed: %d\n", ret); in iwl_mvm_load_nvm_to_nic()
519 int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic) in iwl_nvm_init() argument
524 const char *nvm_file_B = mvm->cfg->default_nvm_file_B_step; in iwl_nvm_init()
525 const char *nvm_file_C = mvm->cfg->default_nvm_file_C_step; in iwl_nvm_init()
527 if (WARN_ON_ONCE(mvm->cfg->nvm_hw_section_num >= NVM_MAX_NUM_SECTIONS)) in iwl_nvm_init()
533 IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from NVM\n"); in iwl_nvm_init()
535 nvm_buffer = kmalloc(mvm->cfg->base_params->eeprom_size, in iwl_nvm_init()
541 ret = iwl_nvm_read_section(mvm, section, nvm_buffer, in iwl_nvm_init()
551 mvm->nvm_sections[section].data = temp; in iwl_nvm_init()
552 mvm->nvm_sections[section].length = ret; in iwl_nvm_init()
557 mvm->nvm_sw_blob.data = temp; in iwl_nvm_init()
558 mvm->nvm_sw_blob.size = ret; in iwl_nvm_init()
561 mvm->nvm_calib_blob.data = temp; in iwl_nvm_init()
562 mvm->nvm_calib_blob.size = ret; in iwl_nvm_init()
565 mvm->nvm_prod_blob.data = temp; in iwl_nvm_init()
566 mvm->nvm_prod_blob.size = ret; in iwl_nvm_init()
569 mvm->nvm_phy_sku_blob.data = temp; in iwl_nvm_init()
570 mvm->nvm_phy_sku_blob.size = ret; in iwl_nvm_init()
573 if (section == mvm->cfg->nvm_hw_section_num) { in iwl_nvm_init()
574 mvm->nvm_hw_blob.data = temp; in iwl_nvm_init()
575 mvm->nvm_hw_blob.size = ret; in iwl_nvm_init()
582 IWL_ERR(mvm, "OTP is blank\n"); in iwl_nvm_init()
587 if (mvm->nvm_file_name) { in iwl_nvm_init()
589 ret = iwl_mvm_read_external_nvm(mvm); in iwl_nvm_init()
594 if (CSR_HW_REV_STEP(mvm->trans->hw_rev) == in iwl_nvm_init()
596 mvm->nvm_file_name = nvm_file_B; in iwl_nvm_init()
598 mvm->nvm_file_name = nvm_file_C; in iwl_nvm_init()
600 if (ret == -EFAULT && mvm->nvm_file_name) { in iwl_nvm_init()
602 ret = iwl_mvm_read_external_nvm(mvm); in iwl_nvm_init()
612 mvm->nvm_data = iwl_parse_nvm_sections(mvm); in iwl_nvm_init()
613 if (!mvm->nvm_data) in iwl_nvm_init()
615 IWL_DEBUG_EEPROM(mvm->trans->dev, "nvm version = %x\n", in iwl_nvm_init()
616 mvm->nvm_data->nvm_version); in iwl_nvm_init()
622 iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2, in iwl_mvm_update_mcc() argument
642 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm))) in iwl_mvm_update_mcc()
647 IWL_DEBUG_LAR(mvm, "send MCC update to FW with '%c%c' src = %d\n", in iwl_mvm_update_mcc()
650 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_mvm_update_mcc()
669 IWL_DEBUG_LAR(mvm, in iwl_mvm_update_mcc()
694 static u32 iwl_mvm_wrdd_get_mcc(struct iwl_mvm *mvm, union acpi_object *wrdd) in iwl_mvm_wrdd_get_mcc() argument
703 IWL_DEBUG_LAR(mvm, "Unsupported wrdd structure\n"); in iwl_mvm_wrdd_get_mcc()
733 static int iwl_mvm_get_bios_mcc(struct iwl_mvm *mvm, char *mcc) in iwl_mvm_get_bios_mcc() argument
740 struct pci_dev *pdev = to_pci_dev(mvm->dev); in iwl_mvm_get_bios_mcc()
744 IWL_DEBUG_LAR(mvm, in iwl_mvm_get_bios_mcc()
752 IWL_DEBUG_LAR(mvm, "WRD method not found\n"); in iwl_mvm_get_bios_mcc()
759 IWL_DEBUG_LAR(mvm, "WRDC invocation failed (0x%x)\n", status); in iwl_mvm_get_bios_mcc()
763 mcc_val = iwl_mvm_wrdd_get_mcc(mvm, wrdd.pointer); in iwl_mvm_get_bios_mcc()
774 static int iwl_mvm_get_bios_mcc(struct iwl_mvm *mvm, char *mcc) in iwl_mvm_get_bios_mcc() argument
780 int iwl_mvm_init_mcc(struct iwl_mvm *mvm) in iwl_mvm_init_mcc() argument
788 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000) { in iwl_mvm_init_mcc()
789 tlv_lar = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_init_mcc()
791 nvm_lar = mvm->nvm_data->lar_enabled; in iwl_mvm_init_mcc()
793 IWL_INFO(mvm, in iwl_mvm_init_mcc()
799 if (!iwl_mvm_is_lar_supported(mvm)) in iwl_mvm_init_mcc()
806 retval = iwl_mvm_init_fw_regd(mvm); in iwl_mvm_init_mcc()
816 mvm->lar_regdom_set = false; in iwl_mvm_init_mcc()
818 regd = iwl_mvm_get_current_regdomain(mvm, NULL); in iwl_mvm_init_mcc()
822 if (iwl_mvm_is_wifi_mcc_supported(mvm) && in iwl_mvm_init_mcc()
823 !iwl_mvm_get_bios_mcc(mvm, mcc)) { in iwl_mvm_init_mcc()
825 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, in iwl_mvm_init_mcc()
831 retval = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd); in iwl_mvm_init_mcc()
836 void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm, in iwl_mvm_rx_chub_update_mcc() argument
845 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_chub_update_mcc()
847 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm))) in iwl_mvm_rx_chub_update_mcc()
855 IWL_DEBUG_LAR(mvm, in iwl_mvm_rx_chub_update_mcc()
858 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, src, NULL); in iwl_mvm_rx_chub_update_mcc()
862 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd); in iwl_mvm_rx_chub_update_mcc()