--- a/include/linux/rt2x00_platform.h +++ b/include/linux/rt2x00_platform.h @@ -14,6 +14,7 @@ struct rt2x00_platform_data { char *eeprom_file_name; + const u8 *mac_address; int disable_2ghz; int disable_5ghz; --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -931,6 +931,18 @@ static void rt2x00lib_rate(struct ieee80 entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE; } +const u8 *rt2x00lib_get_mac_address(struct rt2x00_dev *rt2x00dev) +{ + struct rt2x00_platform_data *pdata; + + pdata = rt2x00dev->dev->platform_data; + if (!pdata) + return NULL; + + return pdata->mac_address; +} +EXPORT_SYMBOL_GPL(rt2x00lib_get_mac_address); + static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev, struct hw_mode_spec *spec) { --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h @@ -1412,6 +1412,7 @@ static inline void rt2x00debug_dump_fram */ u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev, struct ieee80211_vif *vif); +const u8 *rt2x00lib_get_mac_address(struct rt2x00_dev *rt2x00dev); /* * Interrupt context handlers. --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c @@ -2390,6 +2390,7 @@ static int rt61pci_validate_eeprom(struc u32 reg; u16 word; u8 *mac; + const u8 *pdata_mac; s8 value; rt2x00mmio_register_read(rt2x00dev, E2PROM_CSR, ®); @@ -2410,7 +2411,11 @@ static int rt61pci_validate_eeprom(struc /* * Start validation of the data that has been read. */ + pdata_mac = rt2x00lib_get_mac_address(rt2x00dev); mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); + if (pdata_mac) + memcpy(mac, pdata_mac, 6); + if (!is_valid_ether_addr(mac)) { eth_random_addr(mac); rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);