diff options
Diffstat (limited to 'package/kernel/mac80211/patches/608-00-rt2x00-get-mac-from-device-tree.patch')
-rw-r--r-- | package/kernel/mac80211/patches/608-00-rt2x00-get-mac-from-device-tree.patch | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/608-00-rt2x00-get-mac-from-device-tree.patch b/package/kernel/mac80211/patches/608-00-rt2x00-get-mac-from-device-tree.patch new file mode 100644 index 0000000..290f248 --- /dev/null +++ b/package/kernel/mac80211/patches/608-00-rt2x00-get-mac-from-device-tree.patch @@ -0,0 +1,152 @@ +From 0e31738ef78a814fcd2a55f2d57a21d322794da1 Mon Sep 17 00:00:00 2001 +From: Mathias Kresin <dev@kresin.me> +Date: Fri, 26 Aug 2016 09:16:53 +0200 +Subject: rt2x00: add support for mac addr from device tree + +On some devices the EEPROMs of Ralink Wi-Fi chips have a default Ralink +MAC address set (RT3062F: 00:0C:43:30:62:00, RT3060F: +00:0C:43:30:60:00). Using multiple of these devices in the same network +can cause nasty issues. + +Allow to override the MAC in the EEPROM with (a known good) one set in +the device tree to bypass the issue. + +Signed-off-by: Mathias Kresin <dev@kresin.me> +--- + drivers/net/wireless/ralink/rt2x00/rt2400pci.c | 5 +---- + drivers/net/wireless/ralink/rt2x00/rt2500pci.c | 5 +---- + drivers/net/wireless/ralink/rt2x00/rt2500usb.c | 5 +---- + drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 5 +---- + drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 + + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 16 ++++++++++++++++ + drivers/net/wireless/ralink/rt2x00/rt61pci.c | 5 +---- + drivers/net/wireless/ralink/rt2x00/rt73usb.c | 5 +---- + 8 files changed, 23 insertions(+), 24 deletions(-) + +--- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c +@@ -1459,10 +1459,7 @@ static int rt2400pci_validate_eeprom(str + * Start validation of the data that has been read. + */ + mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); +- if (!is_valid_ether_addr(mac)) { +- eth_random_addr(mac); +- rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac); +- } ++ rt2x00lib_set_mac_address(rt2x00dev, mac); + + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word); + if (word == 0xffff) { +--- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c +@@ -1585,10 +1585,7 @@ static int rt2500pci_validate_eeprom(str + * Start validation of the data that has been read. + */ + mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); +- if (!is_valid_ether_addr(mac)) { +- eth_random_addr(mac); +- rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac); +- } ++ rt2x00lib_set_mac_address(rt2x00dev, mac); + + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word); + if (word == 0xffff) { +--- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c +@@ -1349,10 +1349,7 @@ static int rt2500usb_validate_eeprom(str + * Start validation of the data that has been read. + */ + mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); +- if (!is_valid_ether_addr(mac)) { +- eth_random_addr(mac); +- rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac); +- } ++ rt2x00lib_set_mac_address(rt2x00dev, mac); + + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word); + if (word == 0xffff) { +--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +@@ -7531,10 +7531,7 @@ static int rt2800_validate_eeprom(struct + * Start validation of the data that has been read. + */ + mac = rt2800_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); +- if (!is_valid_ether_addr(mac)) { +- eth_random_addr(mac); +- rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac); +- } ++ rt2x00lib_set_mac_address(rt2x00dev, mac); + + rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &word); + if (word == 0xffff) { +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h +@@ -1416,6 +1416,7 @@ static inline void rt2x00debug_dump_fram + */ + u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev, + struct ieee80211_vif *vif); ++void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr); + + /* + * Interrupt context handlers. +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +@@ -26,6 +26,8 @@ + #include <linux/module.h> + #include <linux/slab.h> + #include <linux/log2.h> ++#include <linux/of.h> ++#include <linux/of_net.h> + + #include "rt2x00.h" + #include "rt2x00lib.h" +@@ -931,6 +933,21 @@ static void rt2x00lib_rate(struct ieee80 + entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE; + } + ++void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr) ++{ ++ const char *mac_addr; ++ ++ mac_addr = of_get_mac_address(rt2x00dev->dev->of_node); ++ if (mac_addr) ++ ether_addr_copy(eeprom_mac_addr, mac_addr); ++ ++ if (!is_valid_ether_addr(eeprom_mac_addr)) { ++ eth_random_addr(eeprom_mac_addr); ++ rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", eeprom_mac_addr); ++ } ++} ++EXPORT_SYMBOL_GPL(rt2x00lib_set_mac_address); ++ + static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev, + struct hw_mode_spec *spec) + { +--- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c +@@ -2413,10 +2413,7 @@ static int rt61pci_validate_eeprom(struc + * Start validation of the data that has been read. + */ + mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); +- if (!is_valid_ether_addr(mac)) { +- eth_random_addr(mac); +- rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac); +- } ++ rt2x00lib_set_mac_address(rt2x00dev, mac); + + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word); + if (word == 0xffff) { +--- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c +@@ -1766,10 +1766,7 @@ static int rt73usb_validate_eeprom(struc + * Start validation of the data that has been read. + */ + mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0); +- if (!is_valid_ether_addr(mac)) { +- eth_random_addr(mac); +- rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac); +- } ++ rt2x00lib_set_mac_address(rt2x00dev, mac); + + rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word); + if (word == 0xffff) { |