aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2010-07-15 08:58:30 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2010-07-23 11:42:31 -0400
commitc6fa17ed3fadaf056173c409c0877df428a152ec (patch)
treefb9a2a294b29e919a6e467f4238c1dfad602df6e
parent0bc5774f4e1df0204e68bfcd84e122d430dcf35c (diff)
iwlwifi: read multiple MAC addresses
Some devices may have multiple MAC addresses in their EEPROM, read them and advertise them to cfg80211. Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c17
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-eeprom.h1
3 files changed, 16 insertions, 5 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 573a81b494ea..f8f8ea220ce1 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3932,8 +3932,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
3932 struct ieee80211_hw *hw; 3932 struct ieee80211_hw *hw;
3933 struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data); 3933 struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
3934 unsigned long flags; 3934 unsigned long flags;
3935 u16 pci_cmd; 3935 u16 pci_cmd, num_mac;
3936 u8 perm_addr[ETH_ALEN];
3937 3936
3938 /************************ 3937 /************************
3939 * 1. Allocating HW data 3938 * 1. Allocating HW data
@@ -4051,9 +4050,17 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
4051 goto out_free_eeprom; 4050 goto out_free_eeprom;
4052 4051
4053 /* extract MAC Address */ 4052 /* extract MAC Address */
4054 iwl_eeprom_get_mac(priv, perm_addr); 4053 iwl_eeprom_get_mac(priv, priv->addresses[0].addr);
4055 IWL_DEBUG_INFO(priv, "MAC address: %pM\n", perm_addr); 4054 IWL_DEBUG_INFO(priv, "MAC address: %pM\n", priv->addresses[0].addr);
4056 SET_IEEE80211_PERM_ADDR(priv->hw, perm_addr); 4055 priv->hw->wiphy->addresses = priv->addresses;
4056 priv->hw->wiphy->n_addresses = 1;
4057 num_mac = iwl_eeprom_query16(priv, EEPROM_NUM_MAC_ADDRESS);
4058 if (num_mac > 1) {
4059 memcpy(priv->addresses[1].addr, priv->addresses[0].addr,
4060 ETH_ALEN);
4061 priv->addresses[1].addr[5]++;
4062 priv->hw->wiphy->n_addresses++;
4063 }
4057 4064
4058 /************************ 4065 /************************
4059 * 5. Setup HW constants 4066 * 5. Setup HW constants
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 4fa8cdd8f96c..5e4745db5dc6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1154,6 +1154,9 @@ struct iwl_priv {
1154 u32 hw_wa_rev; 1154 u32 hw_wa_rev;
1155 u8 rev_id; 1155 u8 rev_id;
1156 1156
1157 /* EEPROM MAC addresses */
1158 struct mac_address addresses[2];
1159
1157 /* uCode images, save to reload in case of failure */ 1160 /* uCode images, save to reload in case of failure */
1158 int fw_index; /* firmware we're trying to load */ 1161 int fw_index; /* firmware we're trying to load */
1159 u32 ucode_ver; /* version of ucode, copy of 1162 u32 ucode_ver; /* version of ucode, copy of
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
index f8b707d0d8a2..3209b37997b6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
@@ -402,6 +402,7 @@ struct iwl_eeprom_calib_info {
402#define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */ 402#define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */
403#define EEPROM_RADIO_CONFIG (2*0x48) /* 2 bytes */ 403#define EEPROM_RADIO_CONFIG (2*0x48) /* 2 bytes */
404#define EEPROM_3945_M_VERSION (2*0x4A) /* 1 bytes */ 404#define EEPROM_3945_M_VERSION (2*0x4A) /* 1 bytes */
405#define EEPROM_NUM_MAC_ADDRESS (2*0x4C) /* 2 bytes */
405 406
406/* The following masks are to be applied on EEPROM_RADIO_CONFIG */ 407/* The following masks are to be applied on EEPROM_RADIO_CONFIG */
407#define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3) /* bits 0-1 */ 408#define EEPROM_RF_CFG_TYPE_MSK(x) (x & 0x3) /* bits 0-1 */