Lines Matching refs:mvm
34 static int iwl_nvm_write_chunk(struct iwl_mvm *mvm, u16 section, in iwl_nvm_write_chunk() argument
55 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_nvm_write_chunk()
63 IWL_ERR(mvm, in iwl_nvm_write_chunk()
73 static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section, in iwl_nvm_read_chunk() argument
94 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_nvm_read_chunk()
117 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
122 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_chunk()
124 ret, mvm->trans->name); in iwl_nvm_read_chunk()
131 IWL_ERR(mvm, "NVM ACCESS response with invalid offset %d\n", in iwl_nvm_read_chunk()
146 static int iwl_nvm_write_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_write_section() argument
159 ret = iwl_nvm_write_chunk(mvm, section, offset, in iwl_nvm_write_section()
180 static int iwl_nvm_read_section(struct iwl_mvm *mvm, u16 section, in iwl_nvm_read_section() argument
195 mvm->trans->trans_cfg->base_params->eeprom_size) { in iwl_nvm_read_section()
196 IWL_ERR(mvm, "EEPROM size is too small for NVM\n"); in iwl_nvm_read_section()
200 ret = iwl_nvm_read_chunk(mvm, section, offset, length, data); in iwl_nvm_read_section()
202 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
210 iwl_nvm_fixups(mvm->trans->hw_id, section, data, offset); in iwl_nvm_read_section()
212 IWL_DEBUG_EEPROM(mvm->trans->dev, in iwl_nvm_read_section()
218 iwl_parse_nvm_sections(struct iwl_mvm *mvm) in iwl_parse_nvm_sections() argument
220 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_parse_nvm_sections()
226 if (mvm->trans->cfg->nvm_type == IWL_NVM) { in iwl_parse_nvm_sections()
227 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
228 !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) { in iwl_parse_nvm_sections()
229 IWL_ERR(mvm, "Can't parse empty OTP/NVM sections\n"); in iwl_parse_nvm_sections()
233 if (mvm->trans->cfg->nvm_type == IWL_NVM_SDP) in iwl_parse_nvm_sections()
239 if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || in iwl_parse_nvm_sections()
240 !mvm->nvm_sections[regulatory_type].data) { in iwl_parse_nvm_sections()
241 IWL_ERR(mvm, in iwl_parse_nvm_sections()
246 if (!mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data && in iwl_parse_nvm_sections()
247 !mvm->nvm_sections[NVM_SECTION_TYPE_MAC_OVERRIDE].data) { in iwl_parse_nvm_sections()
248 IWL_ERR(mvm, in iwl_parse_nvm_sections()
254 if (mvm->trans->cfg->nvm_type == IWL_NVM_EXT && in iwl_parse_nvm_sections()
255 !mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { in iwl_parse_nvm_sections()
256 IWL_ERR(mvm, in iwl_parse_nvm_sections()
262 hw = (const __be16 *)sections[mvm->cfg->nvm_hw_section_num].data; in iwl_parse_nvm_sections()
269 regulatory = mvm->trans->cfg->nvm_type == IWL_NVM_SDP ? in iwl_parse_nvm_sections()
273 return iwl_parse_nvm_data(mvm->trans, mvm->cfg, mvm->fw, hw, sw, calib, in iwl_parse_nvm_sections()
275 mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant); in iwl_parse_nvm_sections()
279 int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm) in iwl_mvm_load_nvm_to_nic() argument
282 struct iwl_nvm_section *sections = mvm->nvm_sections; in iwl_mvm_load_nvm_to_nic()
284 IWL_DEBUG_EEPROM(mvm->trans->dev, "'Write to NVM\n"); in iwl_mvm_load_nvm_to_nic()
286 for (i = 0; i < ARRAY_SIZE(mvm->nvm_sections); i++) { in iwl_mvm_load_nvm_to_nic()
287 if (!mvm->nvm_sections[i].data || !mvm->nvm_sections[i].length) in iwl_mvm_load_nvm_to_nic()
289 ret = iwl_nvm_write_section(mvm, i, sections[i].data, in iwl_mvm_load_nvm_to_nic()
292 IWL_ERR(mvm, "iwl_mvm_send_cmd failed: %d\n", ret); in iwl_mvm_load_nvm_to_nic()
299 int iwl_nvm_init(struct iwl_mvm *mvm) in iwl_nvm_init() argument
304 const char *nvm_file_C = mvm->cfg->default_nvm_file_C_step; in iwl_nvm_init()
306 if (WARN_ON_ONCE(mvm->cfg->nvm_hw_section_num >= NVM_MAX_NUM_SECTIONS)) in iwl_nvm_init()
311 IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from NVM\n"); in iwl_nvm_init()
313 nvm_buffer = kmalloc(mvm->trans->trans_cfg->base_params->eeprom_size, in iwl_nvm_init()
319 ret = iwl_nvm_read_section(mvm, section, nvm_buffer, in iwl_nvm_init()
334 iwl_nvm_fixups(mvm->trans->hw_id, section, temp, ret); in iwl_nvm_init()
336 mvm->nvm_sections[section].data = temp; in iwl_nvm_init()
337 mvm->nvm_sections[section].length = ret; in iwl_nvm_init()
342 mvm->nvm_sw_blob.data = temp; in iwl_nvm_init()
343 mvm->nvm_sw_blob.size = ret; in iwl_nvm_init()
346 mvm->nvm_calib_blob.data = temp; in iwl_nvm_init()
347 mvm->nvm_calib_blob.size = ret; in iwl_nvm_init()
350 mvm->nvm_prod_blob.data = temp; in iwl_nvm_init()
351 mvm->nvm_prod_blob.size = ret; in iwl_nvm_init()
354 mvm->nvm_phy_sku_blob.data = temp; in iwl_nvm_init()
355 mvm->nvm_phy_sku_blob.size = ret; in iwl_nvm_init()
359 mvm->nvm_reg_blob.data = temp; in iwl_nvm_init()
360 mvm->nvm_reg_blob.size = ret; in iwl_nvm_init()
363 if (section == mvm->cfg->nvm_hw_section_num) { in iwl_nvm_init()
364 mvm->nvm_hw_blob.data = temp; in iwl_nvm_init()
365 mvm->nvm_hw_blob.size = ret; in iwl_nvm_init()
372 IWL_ERR(mvm, "OTP is blank\n"); in iwl_nvm_init()
376 if (mvm->nvm_file_name) { in iwl_nvm_init()
378 ret = iwl_read_external_nvm(mvm->trans, mvm->nvm_file_name, in iwl_nvm_init()
379 mvm->nvm_sections); in iwl_nvm_init()
381 mvm->nvm_file_name = nvm_file_C; in iwl_nvm_init()
384 mvm->nvm_file_name) { in iwl_nvm_init()
386 ret = iwl_read_external_nvm(mvm->trans, in iwl_nvm_init()
387 mvm->nvm_file_name, in iwl_nvm_init()
388 mvm->nvm_sections); in iwl_nvm_init()
398 mvm->nvm_data = iwl_parse_nvm_sections(mvm); in iwl_nvm_init()
399 if (!mvm->nvm_data) in iwl_nvm_init()
401 IWL_DEBUG_EEPROM(mvm->trans->dev, "nvm version = %x\n", in iwl_nvm_init()
402 mvm->nvm_data->nvm_version); in iwl_nvm_init()
408 iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2, in iwl_mvm_update_mcc() argument
428 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm))) in iwl_mvm_update_mcc()
433 IWL_DEBUG_LAR(mvm, "send MCC update to FW with '%c%c' src = %d\n", in iwl_mvm_update_mcc()
436 ret = iwl_mvm_send_cmd(mvm, &cmd); in iwl_mvm_update_mcc()
443 if (fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_update_mcc()
488 IWL_DEBUG_LAR(mvm, in iwl_mvm_update_mcc()
497 int iwl_mvm_init_mcc(struct iwl_mvm *mvm) in iwl_mvm_init_mcc() argument
505 if (mvm->cfg->nvm_type == IWL_NVM_EXT) { in iwl_mvm_init_mcc()
506 tlv_lar = fw_has_capa(&mvm->fw->ucode_capa, in iwl_mvm_init_mcc()
508 nvm_lar = mvm->nvm_data->lar_enabled; in iwl_mvm_init_mcc()
510 IWL_INFO(mvm, in iwl_mvm_init_mcc()
516 if (!iwl_mvm_is_lar_supported(mvm)) in iwl_mvm_init_mcc()
523 retval = iwl_mvm_init_fw_regd(mvm); in iwl_mvm_init_mcc()
533 mvm->lar_regdom_set = false; in iwl_mvm_init_mcc()
535 regd = iwl_mvm_get_current_regdomain(mvm, NULL); in iwl_mvm_init_mcc()
539 if (iwl_mvm_is_wifi_mcc_supported(mvm) && in iwl_mvm_init_mcc()
540 !iwl_acpi_get_mcc(mvm->dev, mcc)) { in iwl_mvm_init_mcc()
542 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, in iwl_mvm_init_mcc()
548 retval = regulatory_set_wiphy_regd_sync(mvm->hw->wiphy, regd); in iwl_mvm_init_mcc()
553 void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm, in iwl_mvm_rx_chub_update_mcc() argument
563 lockdep_assert_held(&mvm->mutex); in iwl_mvm_rx_chub_update_mcc()
565 if (iwl_mvm_is_vif_assoc(mvm) && notif->source_id == MCC_SOURCE_WIFI) { in iwl_mvm_rx_chub_update_mcc()
566 IWL_DEBUG_LAR(mvm, "Ignore mcc update while associated\n"); in iwl_mvm_rx_chub_update_mcc()
570 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm))) in iwl_mvm_rx_chub_update_mcc()
578 IWL_DEBUG_LAR(mvm, in iwl_mvm_rx_chub_update_mcc()
581 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, src, NULL); in iwl_mvm_rx_chub_update_mcc()
585 wgds_tbl_idx = iwl_mvm_get_sar_geo_profile(mvm); in iwl_mvm_rx_chub_update_mcc()
587 IWL_DEBUG_INFO(mvm, in iwl_mvm_rx_chub_update_mcc()
591 IWL_DEBUG_INFO(mvm, "SAR WGDS: geo profile %d is configured\n", in iwl_mvm_rx_chub_update_mcc()
594 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd); in iwl_mvm_rx_chub_update_mcc()