iwlwifi: mvm: fix bug in set_hw_address function
authorEran Harary <eran.harary@intel.com>
Wed, 7 May 2014 08:09:11 +0000 (11:09 +0300)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Tue, 24 Jun 2014 18:55:31 +0000 (21:55 +0300)
Don't use nvm_hw pointer if it is NULL. Print an error
message if the MAC address isn't valid.

Signed-off-by: Eran Harary <eran.harary@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/iwl-nvm-parse.c

index 0e3322a..f0ae038 100644 (file)
@@ -476,7 +476,8 @@ static void iwl_set_hw_address(const struct iwl_cfg *cfg,
        data->hw_addr[5] = hw_addr[4];
 }
 
-static void iwl_set_hw_address_family_8000(const struct iwl_cfg *cfg,
+static void iwl_set_hw_address_family_8000(struct device *dev,
+                                          const struct iwl_cfg *cfg,
                                           struct iwl_nvm_data *data,
                                           const __le16 *mac_override,
                                           const __le16 *nvm_hw)
@@ -495,20 +496,28 @@ static void iwl_set_hw_address_family_8000(const struct iwl_cfg *cfg,
                data->hw_addr[4] = hw_addr[5];
                data->hw_addr[5] = hw_addr[4];
 
-               if (is_valid_ether_addr(hw_addr))
+               if (is_valid_ether_addr(data->hw_addr))
                        return;
+
+               IWL_ERR_DEV(dev,
+                           "mac address from nvm override section is not valid\n");
        }
 
-       /* take the MAC address from the OTP */
-       hw_addr = (const u8 *)(nvm_hw + HW_ADDR0_FAMILY_8000);
-       data->hw_addr[0] = hw_addr[3];
-       data->hw_addr[1] = hw_addr[2];
-       data->hw_addr[2] = hw_addr[1];
-       data->hw_addr[3] = hw_addr[0];
+       if (nvm_hw) {
+               /* take the MAC address from the OTP */
+               hw_addr = (const u8 *)(nvm_hw + HW_ADDR0_FAMILY_8000);
+               data->hw_addr[0] = hw_addr[3];
+               data->hw_addr[1] = hw_addr[2];
+               data->hw_addr[2] = hw_addr[1];
+               data->hw_addr[3] = hw_addr[0];
+
+               hw_addr = (const u8 *)(nvm_hw + HW_ADDR1_FAMILY_8000);
+               data->hw_addr[4] = hw_addr[1];
+               data->hw_addr[5] = hw_addr[0];
+               return;
+       }
 
-       hw_addr = (const u8 *)(nvm_hw + HW_ADDR1_FAMILY_8000);
-       data->hw_addr[4] = hw_addr[1];
-       data->hw_addr[5] = hw_addr[0];
+       IWL_ERR_DEV(dev, "mac address is not found\n");
 }
 
 struct iwl_nvm_data *
@@ -570,7 +579,8 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
                                rx_chains);
        } else {
                /* MAC address in family 8000 */
-               iwl_set_hw_address_family_8000(cfg, data, mac_override, nvm_hw);
+               iwl_set_hw_address_family_8000(dev, cfg, data, mac_override,
+                                              nvm_hw);
 
                iwl_init_sbands(dev, cfg, data, regulatory,
                                sku & NVM_SKU_CAP_11AC_ENABLE, tx_chains,