Archived
1
0
This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
archive/package/kernel/broadcom-wl/patches/120-fixup-mac-addresses.patch
Hauke Mehrtens d254a87c0c broadcom-wl: assign first increased mac address to internal wifi core
When the original mac addresses are not valid assign the first one to 
the internal wifi core, this matches the manufacture mac address in 
most cases. In addition refresh the patches.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>


SVN-Revision: 41545
2014-07-07 17:38:54 +00:00

93 lines
2.2 KiB
Diff

--- a/driver/nvram_stub.c
+++ b/driver/nvram_stub.c
@@ -5,6 +5,7 @@
#include <siutils.h>
#include <bcmendian.h>
#include <bcmnvram.h>
+#include <proto/ethernet.h>
#ifdef BCMDBG_ERR
#define NVR_MSG(x) printf x
@@ -24,6 +25,7 @@ typedef struct _vars {
static vars_t *vars = NULL;
static int nvram_init_done = 0;
extern char *nvram_buf[];
+static void fixup_mac_addr(vars_t *new);
int
BCMATTACHFN(nvram_init)(void *si)
@@ -55,6 +57,7 @@ BCMATTACHFN(nvram_init)(void *si)
vars = new;
bcopy((char *)(&nvh[1]), new->vars, nvs);
+ fixup_mac_addr(new);
return 0;
}
@@ -164,3 +167,65 @@ nvram_getall(char *buf, int count)
*buf = '\0';
return 0;
}
+
+static bool nvram_is_valid_mac(struct ether_addr *mac)
+{
+ return mac && !(mac->octet[0] == 0x00 && mac->octet[1] == 0x90 && mac->octet[2] == 0x4c);
+}
+
+static int nvram_increase_mac_addr(struct ether_addr *mac, u8 num)
+{
+ u8 *oui = mac->octet + ETHER_ADDR_LEN/2 - 1;
+ u8 *p = mac->octet + ETHER_ADDR_LEN - 1;
+
+ do {
+ (*p) += num;
+ if (*p > num)
+ break;
+ p--;
+ num = 1;
+ } while (p != oui);
+
+ if (p == oui) {
+ pr_err("unable to fetch mac address\n");
+ return -ENOENT;
+ }
+ return 0;
+}
+
+static void nvram_change_mac_addr(vars_t *new, struct ether_addr *valid, const char *name)
+{
+ char *macaddr_c;
+ struct ether_addr macaddr;
+
+ macaddr_c = findvar(new->vars, new->vars + new->size, name);
+ if (!macaddr_c)
+ return;
+
+ bcm_ether_atoe(macaddr_c, &macaddr);
+ if (nvram_is_valid_mac(&macaddr))
+ return;
+ nvram_increase_mac_addr(valid, 1);
+ bcm_ether_ntoa(valid, macaddr_c);
+}
+
+static void fixup_mac_addr(vars_t *new)
+{
+ char *macaddr_base_c;
+ struct ether_addr macaddr_base;
+
+ macaddr_base_c = findvar(new->vars, new->vars + new->size, "et0macaddr");
+ if (!macaddr_base_c)
+ return;
+
+ bcm_ether_atoe(macaddr_base_c, &macaddr_base);
+ if (!nvram_is_valid_mac(&macaddr_base))
+ return;
+
+ /* jump over the first free address so it can be used for wan */
+ nvram_increase_mac_addr(&macaddr_base, 1);
+ nvram_change_mac_addr(new, &macaddr_base, "sb/1/macaddr");
+ nvram_change_mac_addr(new, &macaddr_base, "pci/1/1/macaddr");
+ nvram_change_mac_addr(new, &macaddr_base, "pci/1/2/macaddr");
+ nvram_change_mac_addr(new, &macaddr_base, "pci/2/1/macaddr");
+}