mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-20 02:34:23 +08:00
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> Acked-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
b9824cb891
commit
9766cb7090
@ -1459,10 +1459,7 @@ static int rt2400pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* 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) {
|
||||
|
@ -1585,10 +1585,7 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* 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) {
|
||||
|
@ -1349,10 +1349,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* 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) {
|
||||
|
@ -6919,10 +6919,7 @@ static int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* 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) {
|
||||
|
@ -1403,6 +1403,7 @@ static inline void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
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.
|
||||
|
@ -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 ieee80211_rate *entry,
|
||||
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)
|
||||
{
|
||||
|
@ -2413,10 +2413,7 @@ static int rt61pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* 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) {
|
||||
|
@ -1766,10 +1766,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* 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) {
|
||||
|
Loading…
Reference in New Issue
Block a user