aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/608-00-rt2x00-get-mac-from-device-tree.patch
diff options
context:
space:
mode:
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.patch152
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 0000000000..290f2480b0
--- /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) {