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()
143 IWL_ERR(mvm, "Bad return from NVM_ACCES_COMMAND (0x%08X)\n", in iwl_nvm_read_chunk()
166 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
171 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
173 ret, mvm->cfg->name); in iwl_nvm_read_chunk()
180 IWL_ERR(mvm, "NVM ACCESS response with invalid offset %d\n", in iwl_nvm_read_chunk()
195 static int iwl_nvm_write_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_write_section() argument
208 ret = iwl_nvm_write_chunk(mvm, section, offset, in iwl_nvm_write_section()
229 static int iwl_nvm_read_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_read_section() argument
244 mvm->cfg->base_params->eeprom_size) { in iwl_nvm_read_section()
245 IWL_ERR(mvm, "EEPROM size is too small for NVM\n"); in iwl_nvm_read_section()
249 ret = iwl_nvm_read_chunk(mvm, section, offset, length, data); in iwl_nvm_read_section()
251 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
259 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
265 iwl_parse_nvm_sections(struct iwl_mvm *mvm) in iwl_parse_nvm_sections() argument
267 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_parse_nvm_sections()
273 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) { in iwl_parse_nvm_sections()
274 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
275 !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) { in iwl_parse_nvm_sections()
276 IWL_ERR(mvm, "Can't parse empty OTP/NVM sections\n"); in iwl_parse_nvm_sections()
281 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
282 !mvm->nvm_sections[NVM_SECTION_TYPE_REGULATORY].data) { in iwl_parse_nvm_sections()
283 IWL_ERR(mvm, in iwl_parse_nvm_sections()
288 if (!mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data && in iwl_parse_nvm_sections()
289 !mvm->nvm_sections[NVM_SECTION_TYPE_MAC_OVERRIDE].data) { in iwl_parse_nvm_sections()
290 IWL_ERR(mvm, in iwl_parse_nvm_sections()
296 if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { in iwl_parse_nvm_sections()
297 IWL_ERR(mvm, in iwl_parse_nvm_sections()
303 if (WARN_ON(!mvm->cfg)) in iwl_parse_nvm_sections()
307 mac_addr0 = iwl_trans_read_prph(mvm->trans, WFMP_MAC_ADDR_0); in iwl_parse_nvm_sections()
308 mac_addr1 = iwl_trans_read_prph(mvm->trans, WFMP_MAC_ADDR_1); in iwl_parse_nvm_sections()
310 hw = (const __le16 *)sections[mvm->cfg->nvm_hw_section_num].data; in iwl_parse_nvm_sections()
319 (mvm->fw->ucode_capa.capa[0] & in iwl_parse_nvm_sections()
322 return iwl_parse_nvm_data(mvm->trans->dev, mvm->cfg, hw, sw, calib, in iwl_parse_nvm_sections()
324 mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant, in iwl_parse_nvm_sections()
351 static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm) in iwl_mvm_read_external_nvm() argument
373 IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from external NVM\n"); in iwl_mvm_read_external_nvm()
376 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) in iwl_mvm_read_external_nvm()
387 ret = request_firmware(&fw_entry, mvm->nvm_file_name, in iwl_mvm_read_external_nvm()
388 mvm->trans->dev); in iwl_mvm_read_external_nvm()
390 IWL_ERR(mvm, "ERROR: %s isn't available %d\n", in iwl_mvm_read_external_nvm()
391 mvm->nvm_file_name, ret); in iwl_mvm_read_external_nvm()
395 IWL_INFO(mvm, "Loaded NVM file %s (%zu bytes)\n", in iwl_mvm_read_external_nvm()
396 mvm->nvm_file_name, fw_entry->size); in iwl_mvm_read_external_nvm()
399 IWL_ERR(mvm, "NVM file too large\n"); in iwl_mvm_read_external_nvm()
418 IWL_INFO(mvm, "NVM Version %08X\n", le32_to_cpu(dword_buff[2])); in iwl_mvm_read_external_nvm()
419 IWL_INFO(mvm, "NVM Manufacturing date %08X\n", in iwl_mvm_read_external_nvm()
423 if ((CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_C_STEP && in iwl_mvm_read_external_nvm()
425 (CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_B_STEP && in iwl_mvm_read_external_nvm()
436 IWL_ERR(mvm, in iwl_mvm_read_external_nvm()
448 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) { in iwl_mvm_read_external_nvm()
460 IWL_ERR(mvm, "ERROR - section too large (%d)\n", in iwl_mvm_read_external_nvm()
467 IWL_ERR(mvm, "ERROR - section empty\n"); in iwl_mvm_read_external_nvm()
473 IWL_ERR(mvm, in iwl_mvm_read_external_nvm()
491 mvm->nvm_sections[section_id].data = temp; in iwl_mvm_read_external_nvm()
492 mvm->nvm_sections[section_id].length = section_size; in iwl_mvm_read_external_nvm()
503 int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm) in iwl_mvm_load_nvm_to_nic() argument
506 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_mvm_load_nvm_to_nic()
508 IWL_DEBUG_EEPROM(mvm->trans->dev, "'Write to NVM\n"); in iwl_mvm_load_nvm_to_nic()
510 for (i = 0; i < ARRAY_SIZE(mvm->nvm_sections); i++) { in iwl_mvm_load_nvm_to_nic()
511 if (!mvm->nvm_sections[i].data || !mvm->nvm_sections[i].length) in iwl_mvm_load_nvm_to_nic()
513 ret = iwl_nvm_write_section(mvm, i, sections[i].data, in iwl_mvm_load_nvm_to_nic()
516 IWL_ERR(mvm, "iwl_mvm_send_cmd failed: %d\n", ret); in iwl_mvm_load_nvm_to_nic()
523 int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic) in iwl_nvm_init() argument
528 const char *nvm_file_B = mvm->cfg->default_nvm_file_B_step; in iwl_nvm_init()
529 const char *nvm_file_C = mvm->cfg->default_nvm_file_C_step; in iwl_nvm_init()
531 if (WARN_ON_ONCE(mvm->cfg->nvm_hw_section_num >= NVM_MAX_NUM_SECTIONS)) in iwl_nvm_init()
537 IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from NVM\n"); in iwl_nvm_init()
539 nvm_buffer = kmalloc(mvm->cfg->base_params->eeprom_size, in iwl_nvm_init()
545 ret = iwl_nvm_read_section(mvm, section, nvm_buffer, in iwl_nvm_init()
555 mvm->nvm_sections[section].data = temp; in iwl_nvm_init()
556 mvm->nvm_sections[section].length = ret; in iwl_nvm_init()
561 mvm->nvm_sw_blob.data = temp; in iwl_nvm_init()
562 mvm->nvm_sw_blob.size = ret; in iwl_nvm_init()
565 mvm->nvm_calib_blob.data = temp; in iwl_nvm_init()
566 mvm->nvm_calib_blob.size = ret; in iwl_nvm_init()
569 mvm->nvm_prod_blob.data = temp; in iwl_nvm_init()
570 mvm->nvm_prod_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()
656 IWL_ERR(mvm, "Bad return from MCC_UPDATE_COMMAND (0x%08X)\n", in iwl_mvm_update_mcc()
675 IWL_DEBUG_LAR(mvm, in iwl_mvm_update_mcc()
700 static u32 iwl_mvm_wrdd_get_mcc(struct iwl_mvm *mvm, union acpi_object *wrdd) in iwl_mvm_wrdd_get_mcc() argument
709 IWL_DEBUG_LAR(mvm, "Unsupported wrdd structure\n"); in iwl_mvm_wrdd_get_mcc()
739 static int iwl_mvm_get_bios_mcc(struct iwl_mvm *mvm, char *mcc) in iwl_mvm_get_bios_mcc() argument
746 struct pci_dev *pdev = to_pci_dev(mvm->dev); in iwl_mvm_get_bios_mcc()
750 IWL_DEBUG_LAR(mvm, in iwl_mvm_get_bios_mcc()
758 IWL_DEBUG_LAR(mvm, "WRD method not found\n"); in iwl_mvm_get_bios_mcc()
765 IWL_DEBUG_LAR(mvm, "WRDC invocation failed (0x%x)\n", status); in iwl_mvm_get_bios_mcc()
769 mcc_val = iwl_mvm_wrdd_get_mcc(mvm, wrdd.pointer); in iwl_mvm_get_bios_mcc()
780 static int iwl_mvm_get_bios_mcc(struct iwl_mvm *mvm, char *mcc) in iwl_mvm_get_bios_mcc() argument
786 int iwl_mvm_init_mcc(struct iwl_mvm *mvm) in iwl_mvm_init_mcc() argument
794 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000) { in iwl_mvm_init_mcc()
795 tlv_lar = mvm->fw->ucode_capa.capa[0] & in iwl_mvm_init_mcc()
797 nvm_lar = mvm->nvm_data->lar_enabled; in iwl_mvm_init_mcc()
799 IWL_INFO(mvm, in iwl_mvm_init_mcc()
805 if (!iwl_mvm_is_lar_supported(mvm)) in iwl_mvm_init_mcc()
812 retval = iwl_mvm_init_fw_regd(mvm); in iwl_mvm_init_mcc()
822 mvm->lar_regdom_set = false; in iwl_mvm_init_mcc()
824 regd = iwl_mvm_get_current_regdomain(mvm, NULL); in iwl_mvm_init_mcc()
828 if (iwl_mvm_is_wifi_mcc_supported(mvm) && in iwl_mvm_init_mcc()
829 !iwl_mvm_get_bios_mcc(mvm, mcc)) { in iwl_mvm_init_mcc()
831 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, in iwl_mvm_init_mcc()
837 retval = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd); in iwl_mvm_init_mcc()
842 int iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm, in iwl_mvm_rx_chub_update_mcc() argument
852 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_chub_update_mcc()
854 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm))) in iwl_mvm_rx_chub_update_mcc()
862 IWL_DEBUG_LAR(mvm, in iwl_mvm_rx_chub_update_mcc()
865 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, src, NULL); in iwl_mvm_rx_chub_update_mcc()
869 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd); in iwl_mvm_rx_chub_update_mcc()