|
@@ -6,7 +6,7 @@
|
|
* GPL LICENSE SUMMARY
|
|
* GPL LICENSE SUMMARY
|
|
*
|
|
*
|
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
|
- * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
|
|
|
|
|
+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
@@ -32,7 +32,7 @@
|
|
* BSD LICENSE
|
|
* BSD LICENSE
|
|
*
|
|
*
|
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
|
- * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
|
|
|
|
|
+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
* All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* Redistribution and use in source and binary forms, with or without
|
|
@@ -116,10 +116,11 @@ enum family_8000_nvm_offsets {
|
|
|
|
|
|
/* SKU Capabilities (actual values from NVM definition) */
|
|
/* SKU Capabilities (actual values from NVM definition) */
|
|
enum nvm_sku_bits {
|
|
enum nvm_sku_bits {
|
|
- NVM_SKU_CAP_BAND_24GHZ = BIT(0),
|
|
|
|
- NVM_SKU_CAP_BAND_52GHZ = BIT(1),
|
|
|
|
- NVM_SKU_CAP_11N_ENABLE = BIT(2),
|
|
|
|
- NVM_SKU_CAP_11AC_ENABLE = BIT(3),
|
|
|
|
|
|
+ NVM_SKU_CAP_BAND_24GHZ = BIT(0),
|
|
|
|
+ NVM_SKU_CAP_BAND_52GHZ = BIT(1),
|
|
|
|
+ NVM_SKU_CAP_11N_ENABLE = BIT(2),
|
|
|
|
+ NVM_SKU_CAP_11AC_ENABLE = BIT(3),
|
|
|
|
+ NVM_SKU_CAP_MIMO_DISABLE = BIT(5),
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -368,6 +369,11 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
|
|
if (cfg->ht_params->ldpc)
|
|
if (cfg->ht_params->ldpc)
|
|
vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
|
|
vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
|
|
|
|
|
|
|
|
+ if (data->sku_cap_mimo_disabled) {
|
|
|
|
+ num_rx_ants = 1;
|
|
|
|
+ num_tx_ants = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (num_tx_ants > 1)
|
|
if (num_tx_ants > 1)
|
|
vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
|
|
vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
|
|
else
|
|
else
|
|
@@ -527,6 +533,10 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
|
|
const u8 *hw_addr;
|
|
const u8 *hw_addr;
|
|
|
|
|
|
if (mac_override) {
|
|
if (mac_override) {
|
|
|
|
+ static const u8 reserved_mac[] = {
|
|
|
|
+ 0x02, 0xcc, 0xaa, 0xff, 0xee, 0x00
|
|
|
|
+ };
|
|
|
|
+
|
|
hw_addr = (const u8 *)(mac_override +
|
|
hw_addr = (const u8 *)(mac_override +
|
|
MAC_ADDRESS_OVERRIDE_FAMILY_8000);
|
|
MAC_ADDRESS_OVERRIDE_FAMILY_8000);
|
|
|
|
|
|
@@ -538,7 +548,12 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
|
|
data->hw_addr[4] = hw_addr[5];
|
|
data->hw_addr[4] = hw_addr[5];
|
|
data->hw_addr[5] = hw_addr[4];
|
|
data->hw_addr[5] = hw_addr[4];
|
|
|
|
|
|
- if (is_valid_ether_addr(data->hw_addr))
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Force the use of the OTP MAC address in case of reserved MAC
|
|
|
|
+ * address in the NVM, or if address is given but invalid.
|
|
|
|
+ */
|
|
|
|
+ if (is_valid_ether_addr(data->hw_addr) &&
|
|
|
|
+ memcmp(reserved_mac, hw_addr, ETH_ALEN) != 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
IWL_ERR_DEV(dev,
|
|
IWL_ERR_DEV(dev,
|
|
@@ -610,6 +625,7 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
|
|
data->sku_cap_11n_enable = false;
|
|
data->sku_cap_11n_enable = false;
|
|
data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
|
|
data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
|
|
(sku & NVM_SKU_CAP_11AC_ENABLE);
|
|
(sku & NVM_SKU_CAP_11AC_ENABLE);
|
|
|
|
+ data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE;
|
|
|
|
|
|
data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
|
|
data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
|
|
|
|
|