mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 15:56:49 +00:00
946e42ed89
The MAC can be stored in OTP memory or in flash memory, currently the driver could read it only from OTP. Backport the patch allowing setting the MAC address from flash. Some modules have the OTP programmed but the ODM/OEM decided to overwrite it with value stored in flash. Signed-off-by: Tomasz Maciej Nowak <tmn505@gmail.com>
104 lines
3.5 KiB
Diff
104 lines
3.5 KiB
Diff
From 716c220b4d990a4fe7800d0685ca69dee99e4e8f Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Pavel=20L=C3=B6bl?= <pavel@loebl.cz>
|
|
Date: Fri, 6 May 2022 06:42:46 +0200
|
|
Subject: [PATCH] brcmfmac: allow setting wlan MAC address using device tree
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This allows firmware to provide MAC address using device tree. Like in
|
|
case there is no MAC burned in wlan NVRAM.
|
|
|
|
Signed-off-by: Pavel Löbl <pavel@loebl.cz>
|
|
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
|
Link: https://lore.kernel.org/r/20220506044246.67146-1-pavel@loebl.cz
|
|
---
|
|
.../broadcom/brcm80211/brcmfmac/common.c | 23 ++++++++++++++-----
|
|
.../broadcom/brcm80211/brcmfmac/common.h | 1 +
|
|
.../broadcom/brcm80211/brcmfmac/core.c | 4 +++-
|
|
.../wireless/broadcom/brcm80211/brcmfmac/of.c | 3 +++
|
|
4 files changed, 24 insertions(+), 7 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
@@ -202,13 +202,24 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
|
|
char *ptr;
|
|
s32 err;
|
|
|
|
- /* retreive mac address */
|
|
- err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
|
- sizeof(ifp->mac_addr));
|
|
- if (err < 0) {
|
|
- bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
|
|
- goto done;
|
|
+ if (is_valid_ether_addr(ifp->mac_addr)) {
|
|
+ /* set mac address */
|
|
+ err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr,
|
|
+ ETH_ALEN);
|
|
+ if (err < 0) {
|
|
+ bphy_err(ifp->drvr, "Setting cur_etheraddr failed, %d\n", err);
|
|
+ goto done;
|
|
+ }
|
|
+ } else {
|
|
+ /* retrieve mac address */
|
|
+ err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
|
|
+ sizeof(ifp->mac_addr));
|
|
+ if (err < 0) {
|
|
+ bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
|
|
+ goto done;
|
|
+ }
|
|
}
|
|
+
|
|
memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
|
|
memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
|
|
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
@@ -50,6 +50,7 @@ struct brcmf_mp_device {
|
|
bool ignore_probe_fail;
|
|
struct brcmfmac_pd_cc *country_codes;
|
|
const char *board_type;
|
|
+ unsigned char mac[ETH_ALEN];
|
|
union {
|
|
struct brcmfmac_sdio_pd sdio;
|
|
} bus;
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
|
|
@@ -7,6 +7,7 @@
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/module.h>
|
|
#include <linux/inetdevice.h>
|
|
+#include <linux/property.h>
|
|
#include <net/cfg80211.h>
|
|
#include <net/rtnetlink.h>
|
|
#include <net/addrconf.h>
|
|
@@ -1226,7 +1227,8 @@ static int brcmf_bus_started(struct brcm
|
|
brcmf_dbg(TRACE, "\n");
|
|
|
|
/* add primary networking interface */
|
|
- ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d", NULL);
|
|
+ ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d",
|
|
+ is_valid_ether_addr(drvr->settings->mac) ? drvr->settings->mac : NULL);
|
|
if (IS_ERR(ifp))
|
|
return PTR_ERR(ifp);
|
|
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
|
@@ -5,6 +5,7 @@
|
|
#include <linux/init.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_irq.h>
|
|
+#include <linux/of_net.h>
|
|
|
|
#include <defs.h>
|
|
#include "debug.h"
|
|
@@ -97,6 +98,8 @@ void brcmf_of_probe(struct device *dev,
|
|
if (err)
|
|
brcmf_err("failed to get OF country code map (err=%d)\n", err);
|
|
|
|
+ of_get_mac_address(np, settings->mac);
|
|
+
|
|
if (bus_type != BRCMF_BUSTYPE_SDIO)
|
|
return;
|
|
|