diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath5k/pci.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/pci.c | 32 | 
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath5k/pci.c b/drivers/net/wireless/ath/ath5k/pci.c index 3c44689a700..296c316a834 100644 --- a/drivers/net/wireless/ath/ath5k/pci.c +++ b/drivers/net/wireless/ath/ath5k/pci.c @@ -17,6 +17,7 @@  #include <linux/nl80211.h>  #include <linux/pci.h>  #include <linux/pci-aspm.h> +#include <linux/etherdevice.h>  #include "../ath.h"  #include "ath5k.h"  #include "debug.h" @@ -108,11 +109,42 @@ int ath5k_hw_read_srev(struct ath5k_hw *ah)  	return 0;  } +/* + * Read the MAC address from eeprom or platform_data + */ +static int ath5k_pci_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac) +{ +	u8 mac_d[ETH_ALEN] = {}; +	u32 total, offset; +	u16 data; +	int octet; + +	AR5K_EEPROM_READ(0x20, data); + +	for (offset = 0x1f, octet = 0, total = 0; offset >= 0x1d; offset--) { +		AR5K_EEPROM_READ(offset, data); + +		total += data; +		mac_d[octet + 1] = data & 0xff; +		mac_d[octet] = data >> 8; +		octet += 2; +	} + +	if (!total || total == 3 * 0xffff) +		return -EINVAL; + +	memcpy(mac, mac_d, ETH_ALEN); + +	return 0; +} + +  /* Common ath_bus_opts structure */  static const struct ath_bus_ops ath_pci_bus_ops = {  	.ath_bus_type = ATH_PCI,  	.read_cachesize = ath5k_pci_read_cachesize,  	.eeprom_read = ath5k_pci_eeprom_read, +	.eeprom_read_mac = ath5k_pci_eeprom_read_mac,  };  /********************\  |