build/patch/kernel/archive/sunxi-6.5/patches.megous/bes2600-Read-MAC-address-from-DT-if-available.patch

147 lines
5.2 KiB
Diff
Raw Normal View History

From 58ff79d56066acb9e9ab499caf128ea9c6c67055 Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Sun, 30 Jul 2023 10:31:01 +0200
Subject: [PATCH 409/464] bes2600: Read MAC address from DT if available
Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
drivers/staging/bes2600/main.c | 88 ++++++++++------------------------
1 file changed, 25 insertions(+), 63 deletions(-)
diff --git a/drivers/staging/bes2600/main.c b/drivers/staging/bes2600/main.c
index 29c2e5a6cbb2..412293ba1ed2 100644
--- a/drivers/staging/bes2600/main.c
+++ b/drivers/staging/bes2600/main.c
@@ -19,6 +19,7 @@
#include <linux/vmalloc.h>
#include <linux/random.h>
#include <linux/sched.h>
+#include <linux/of.h>
#include <net/mac80211.h>
#include "bes2600.h"
@@ -50,31 +51,11 @@ MODULE_ALIAS("bes2600");
MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
#endif
-static u8 bes2600_mac_template[ETH_ALEN] = {
-#if (GET_MAC_ADDR_METHOD == 2)||(GET_MAC_ADDR_METHOD == 3)
- 0x00, 0x12, 0x34, 0x00, 0x00, 0x00
-#else
- 0x02, 0x80, 0xe1, 0x00, 0x00, 0x00 /* To use macaddr of customers */
-#endif
-};
-
-#if (GET_MAC_ADDR_METHOD == 2) /* To use macaddr and PS Mode of customers */
-#ifndef PATH_WIFI_MACADDR
-#define PATH_WIFI_MACADDR "/efs/wifi/.mac.info"
-#endif
-#elif (GET_MAC_ADDR_METHOD == 3)
-#define PATH_WIFI_MACADDR_TMP "/data/.mac.info"
-#endif
-
#ifdef CUSTOM_FEATURE
#define PATH_WIFI_PSM_INFO "/data/.psm.info"
static int savedpsm = 0;
#endif
-#if defined(CUSTOM_FEATURE) ||(GET_MAC_ADDR_METHOD == 2) || (GET_MAC_ADDR_METHOD == 3)
-int access_file(char *path, char *buffer, int size, int isRead);
-#endif
-
/* TODO: use rates and channels from the device */
#define RATETAB_ENT(_rate, _rateid, _flags) \
{ \
@@ -345,56 +326,37 @@ static const struct wiphy_wowlan_support bes2600_wowlan_support = {
static void bes2600_get_base_mac(struct bes2600_common *hw_priv)
{
-#if (GET_MAC_ADDR_METHOD == 1)
- u8 fixed_mac[ETH_ALEN];
-#endif
-#if (GET_MAC_ADDR_METHOD == 2)||(GET_MAC_ADDR_METHOD == 3) /* To use macaddr of customers */
- char readmac[17+1]={0,};
-#endif
- memcpy(hw_priv->addresses[0].addr, bes2600_mac_template, ETH_ALEN);
-
-#if (GET_MAC_ADDR_METHOD == 1)
- rockchip_wifi_mac_addr(fixed_mac);
- memcpy(hw_priv->addresses[0].addr, fixed_mac, ETH_ALEN * sizeof(u8));
- bes2600_info(BES2600_DBG_INIT, "get fixed mac address from flash=[%02x:%02x:%02x:%02x:%02x:%02x]\n", fixed_mac[0], fixed_mac[1],
- fixed_mac[2], fixed_mac[3], fixed_mac[4], fixed_mac[5]);
- if(fixed_mac[0] & (0x01)){
- bes2600_warn(BES2600_DBG_INIT, "The MAC address is not suitable for unicast, change to random MAC\n");
- memcpy(hw_priv->addresses[0].addr, bes2600_mac_template, ETH_ALEN);
- }
+ struct device_node *np;
+ const u8* addr = NULL;
+ bool ok = false;
+ int len;
+
+ np = of_find_compatible_node(NULL, NULL, "bestechnic,bes2600");
+ if (np) {
+ addr = of_get_property(np, "local-mac-address", &len);
+ if (addr && len == ETH_ALEN) {
+ memcpy(hw_priv->addresses[0].addr, addr, ETH_ALEN);
+ ok = true;
+ } else {
+ pr_err("bestechnic,bes2600 device node does not have valid local-mac-address property, random mac will be used!\n");
+ }
-#elif (GET_MAC_ADDR_METHOD == 2) /* To use macaddr of customers */
- if(access_file(PATH_WIFI_MACADDR,readmac,17,1) > 0) {
- sscanf(readmac,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
- (u8 *)&hw_priv->addresses[0].addr[0],
- (u8 *)&hw_priv->addresses[0].addr[1],
- (u8 *)&hw_priv->addresses[0].addr[2],
- (u8 *)&hw_priv->addresses[0].addr[3],
- (u8 *)&hw_priv->addresses[0].addr[4],
- (u8 *)&hw_priv->addresses[0].addr[5]);
+ of_node_put(np);
+ } else {
+ pr_err("bestechnic,bes2600 device node NOT found, random mac will be used!\n");
}
-#elif (GET_MAC_ADDR_METHOD == 3)
- if(access_file(PATH_WIFI_MACADDR_TMP,readmac,17,1) > 0) {
- sscanf(readmac,"%02X:%02X:%02X:%02X:%02X:%02X",
- (u8 *)&hw_priv->addresses[0].addr[0],
- (u8 *)&hw_priv->addresses[0].addr[1],
- (u8 *)&hw_priv->addresses[0].addr[2],
- (u8 *)&hw_priv->addresses[0].addr[3],
- (u8 *)&hw_priv->addresses[0].addr[4],
- (u8 *)&hw_priv->addresses[0].addr[5]);
+
+ if (!ok) {
+ get_random_bytes(hw_priv->addresses[0].addr, ETH_ALEN);
}
-#endif
- if (hw_priv->addresses[0].addr[3] == 0 &&
- hw_priv->addresses[0].addr[4] == 0 &&
- hw_priv->addresses[0].addr[5] == 0)
- get_random_bytes(&hw_priv->addresses[0].addr[3], 3);
+
+ hw_priv->addresses[0].addr[0] &= ~1u;
}
static void bes2600_derive_mac(struct bes2600_common *hw_priv)
{
memcpy(hw_priv->addresses[1].addr, hw_priv->addresses[0].addr, ETH_ALEN);
- hw_priv->addresses[1].addr[5] =
- hw_priv->addresses[0].addr[5] + 1;
+ hw_priv->addresses[1].addr[5] = hw_priv->addresses[0].addr[5] + 1;
#ifdef P2P_MULTIVIF
memcpy(hw_priv->addresses[2].addr, hw_priv->addresses[1].addr,
@@ -986,7 +948,7 @@ void bes2600_core_release(struct bes2600_common *self)
return;
}
-#if defined(CUSTOM_FEATURE) ||(GET_MAC_ADDR_METHOD == 2) || (GET_MAC_ADDR_METHOD == 3) /* To use macaddr and ps mode of customers */
+#if defined(CUSTOM_FEATURE) /* To use macaddr and ps mode of customers */
int access_file(char *path, char *buffer, int size, int isRead)
{
int ret=0;
--
2.34.1