Commit 1e0b393a authored by Eran Harary's avatar Eran Harary Committed by Emmanuel Grumbach

iwlwifi: mvm: read the mac address in family 8000

In family 8000 products the MAC address in the OTP could be in either:
- WFPM address
- PCIE address
In sdio product we should read it from the WFPM, in pcie product we
should read it from the PCIe location.
This is relevant only from otp version 0xE08 and above.
While at it, fix the bytes order in version 0xE08.
Signed-off-by: default avatarEran Harary <eran.harary@intel.com>
Reviewed-by: default avatarLiad Kaufman <liad.kaufman@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent d40fc489
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/pci.h>
#include "iwl-drv.h" #include "iwl-drv.h"
#include "iwl-modparams.h" #include "iwl-modparams.h"
#include "iwl-nvm-parse.h" #include "iwl-nvm-parse.h"
...@@ -87,8 +88,10 @@ enum wkp_nvm_offsets { ...@@ -87,8 +88,10 @@ enum wkp_nvm_offsets {
enum family_8000_nvm_offsets { enum family_8000_nvm_offsets {
/* NVM HW-Section offset (in words) definitions */ /* NVM HW-Section offset (in words) definitions */
HW_ADDR0_FAMILY_8000 = 0x12, HW_ADDR0_WFPM_FAMILY_8000 = 0x12,
HW_ADDR1_FAMILY_8000 = 0x16, HW_ADDR1_WFPM_FAMILY_8000 = 0x16,
HW_ADDR0_PCIE_FAMILY_8000 = 0x8A,
HW_ADDR1_PCIE_FAMILY_8000 = 0x8E,
MAC_ADDRESS_OVERRIDE_FAMILY_8000 = 1, MAC_ADDRESS_OVERRIDE_FAMILY_8000 = 1,
/* NVM SW-Section offset (in words) definitions */ /* NVM SW-Section offset (in words) definitions */
...@@ -504,16 +507,49 @@ static void iwl_set_hw_address_family_8000(struct device *dev, ...@@ -504,16 +507,49 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
} }
if (nvm_hw) { if (nvm_hw) {
/* take the MAC address from the OTP */ /* read the MAC address from OTP */
hw_addr = (const u8 *)(nvm_hw + HW_ADDR0_FAMILY_8000); if (!dev_is_pci(dev) || (data->nvm_version < 0xE08)) {
data->hw_addr[0] = hw_addr[3]; /* read the mac address from the WFPM location */
data->hw_addr[1] = hw_addr[2]; hw_addr = (const u8 *)(nvm_hw +
data->hw_addr[2] = hw_addr[1]; HW_ADDR0_WFPM_FAMILY_8000);
data->hw_addr[3] = hw_addr[0]; data->hw_addr[0] = hw_addr[3];
data->hw_addr[1] = hw_addr[2];
hw_addr = (const u8 *)(nvm_hw + HW_ADDR1_FAMILY_8000); data->hw_addr[2] = hw_addr[1];
data->hw_addr[4] = hw_addr[1]; data->hw_addr[3] = hw_addr[0];
data->hw_addr[5] = hw_addr[0];
hw_addr = (const u8 *)(nvm_hw +
HW_ADDR1_WFPM_FAMILY_8000);
data->hw_addr[4] = hw_addr[1];
data->hw_addr[5] = hw_addr[0];
} else if ((data->nvm_version >= 0xE08) &&
(data->nvm_version < 0xE0B)) {
/* read "reverse order" from the PCIe location */
hw_addr = (const u8 *)(nvm_hw +
HW_ADDR0_PCIE_FAMILY_8000);
data->hw_addr[5] = hw_addr[2];
data->hw_addr[4] = hw_addr[1];
data->hw_addr[3] = hw_addr[0];
hw_addr = (const u8 *)(nvm_hw +
HW_ADDR1_PCIE_FAMILY_8000);
data->hw_addr[2] = hw_addr[3];
data->hw_addr[1] = hw_addr[2];
data->hw_addr[0] = hw_addr[1];
} else {
/* read from the PCIe location */
hw_addr = (const u8 *)(nvm_hw +
HW_ADDR0_PCIE_FAMILY_8000);
data->hw_addr[5] = hw_addr[0];
data->hw_addr[4] = hw_addr[1];
data->hw_addr[3] = hw_addr[2];
hw_addr = (const u8 *)(nvm_hw +
HW_ADDR1_PCIE_FAMILY_8000);
data->hw_addr[2] = hw_addr[1];
data->hw_addr[1] = hw_addr[2];
data->hw_addr[0] = hw_addr[3];
}
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment