OSDN Git Service

iwlwifi: nvm: force 1x1 antenna in Series 8000
authorMoshe Harel <moshe.harel@intel.com>
Sun, 6 Sep 2015 13:50:33 +0000 (16:50 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Mon, 5 Oct 2015 09:28:44 +0000 (12:28 +0300)
This is a workaround to an OTP bug. In Series 8000 1x1, the OTP
0xA052 defines 2x2 antenna configuration. This workaround overrides
the decision based on HW id and MIMO disabled bit which is correct
in the OTP and set to disabled.

Signed-off-by: Moshe Harel <moshe.harel@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
drivers/net/wireless/iwlwifi/iwl-nvm-parse.h
drivers/net/wireless/iwlwifi/mvm/nvm.c

index 3b8e85e..d829849 100644 (file)
@@ -580,13 +580,15 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
        IWL_ERR_DEV(dev, "mac address is not found\n");
 }
 
+#define IWL_4165_DEVICE_ID 0x5501
+
 struct iwl_nvm_data *
 iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
                   const __le16 *nvm_hw, const __le16 *nvm_sw,
                   const __le16 *nvm_calib, const __le16 *regulatory,
                   const __le16 *mac_override, const __le16 *phy_sku,
                   u8 tx_chains, u8 rx_chains, bool lar_fw_supported,
-                  u32 mac_addr0, u32 mac_addr1)
+                  u32 mac_addr0, u32 mac_addr1, u32 hw_id)
 {
        struct iwl_nvm_data *data;
        u32 sku;
@@ -625,6 +627,17 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
                                    (sku & NVM_SKU_CAP_11AC_ENABLE);
        data->sku_cap_mimo_disabled = sku & NVM_SKU_CAP_MIMO_DISABLE;
 
+       /*
+        * OTP 0x52 bug work around
+        * define antenna 1x1 according to MIMO disabled
+        */
+       if (hw_id == IWL_4165_DEVICE_ID && data->sku_cap_mimo_disabled) {
+               data->valid_tx_ant = ANT_B;
+               data->valid_rx_ant = ANT_B;
+               tx_chains = ANT_B;
+               rx_chains = ANT_B;
+       }
+
        data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
 
        if (cfg->device_family != IWL_DEVICE_FAMILY_8000) {
index 822ba52..9f44d81 100644 (file)
@@ -79,7 +79,7 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
                   const __le16 *nvm_calib, const __le16 *regulatory,
                   const __le16 *mac_override, const __le16 *phy_sku,
                   u8 tx_chains, u8 rx_chains, bool lar_fw_supported,
-                  u32 mac_addr0, u32 mac_addr1);
+                  u32 mac_addr0, u32 mac_addr1, u32 hw_id);
 
 /**
  * iwl_parse_mcc_info - parse MCC (mobile country code) info coming from FW
index 328187d..0b3ffd5 100644 (file)
@@ -316,7 +316,8 @@ 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);
+                                 lar_enabled, mac_addr0, mac_addr1,
+                                 mvm->trans->hw_id);
 }
 
 #define MAX_NVM_FILE_LEN       16384