|
|
@@ -210,6 +210,19 @@ static int iwl_nvm_write_section(struct iwl_mvm *mvm, u16 section,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void iwl_mvm_nvm_fixups(struct iwl_mvm *mvm, unsigned int section,
|
|
|
+ u8 *data, unsigned int len)
|
|
|
+{
|
|
|
+#define IWL_4165_DEVICE_ID 0x5501
|
|
|
+#define NVM_SKU_CAP_MIMO_DISABLE BIT(5)
|
|
|
+
|
|
|
+ if (section == NVM_SECTION_TYPE_PHY_SKU &&
|
|
|
+ mvm->trans->hw_id == IWL_4165_DEVICE_ID && data && len >= 5 &&
|
|
|
+ (data[4] & NVM_SKU_CAP_MIMO_DISABLE))
|
|
|
+ /* OTP 0x52 bug work around: it's a 1x1 device */
|
|
|
+ data[3] = ANT_B | (ANT_B << 4);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Reads an NVM section completely.
|
|
|
* NICs prior to 7000 family doesn't have a real NVM, but just read
|
|
|
@@ -250,6 +263,8 @@ static int iwl_nvm_read_section(struct iwl_mvm *mvm, u16 section,
|
|
|
offset += ret;
|
|
|
}
|
|
|
|
|
|
+ iwl_mvm_nvm_fixups(mvm, section, data, offset);
|
|
|
+
|
|
|
IWL_DEBUG_EEPROM(mvm->trans->dev,
|
|
|
"NVM section %d read completed\n", section);
|
|
|
return offset;
|
|
|
@@ -316,8 +331,7 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
|
|
|
return iwl_parse_nvm_data(mvm->trans->dev, mvm->cfg, hw, sw, calib,
|
|
|
regulatory, mac_override, phy_sku,
|
|
|
mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant,
|
|
|
- lar_enabled, mac_addr0, mac_addr1,
|
|
|
- mvm->trans->hw_id);
|
|
|
+ lar_enabled, mac_addr0, mac_addr1);
|
|
|
}
|
|
|
|
|
|
#define MAX_NVM_FILE_LEN 16384
|
|
|
@@ -353,7 +367,8 @@ static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)
|
|
|
__le16 word2;
|
|
|
u8 data[];
|
|
|
} *file_sec;
|
|
|
- const u8 *eof, *temp;
|
|
|
+ const u8 *eof;
|
|
|
+ u8 *temp;
|
|
|
int max_section_size;
|
|
|
const __le32 *dword_buff;
|
|
|
|
|
|
@@ -483,6 +498,9 @@ static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)
|
|
|
ret = -ENOMEM;
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ iwl_mvm_nvm_fixups(mvm, section_id, temp, section_size);
|
|
|
+
|
|
|
kfree(mvm->nvm_sections[section_id].data);
|
|
|
mvm->nvm_sections[section_id].data = temp;
|
|
|
mvm->nvm_sections[section_id].length = section_size;
|
|
|
@@ -548,6 +566,9 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
|
|
|
ret = -ENOMEM;
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ iwl_mvm_nvm_fixups(mvm, section, temp, ret);
|
|
|
+
|
|
|
mvm->nvm_sections[section].data = temp;
|
|
|
mvm->nvm_sections[section].length = ret;
|
|
|
|