diff options
Diffstat (limited to 'package/kernel/broadcom-wl/patches/120-fixup-mac-addresses.patch')
-rw-r--r-- | package/kernel/broadcom-wl/patches/120-fixup-mac-addresses.patch | 93 |
1 files changed, 0 insertions, 93 deletions
diff --git a/package/kernel/broadcom-wl/patches/120-fixup-mac-addresses.patch b/package/kernel/broadcom-wl/patches/120-fixup-mac-addresses.patch deleted file mode 100644 index 422f7f784f..0000000000 --- a/package/kernel/broadcom-wl/patches/120-fixup-mac-addresses.patch +++ /dev/null @@ -1,93 +0,0 @@ ---- a/driver/nvram_stub.c -+++ b/driver/nvram_stub.c -@@ -5,6 +5,8 @@ - #include <siutils.h> - #include <bcmendian.h> - #include <bcmnvram.h> -+#include <proto/ethernet.h> -+#include <linux/errno.h> - - #ifdef BCMDBG_ERR - #define NVR_MSG(x) printf x -@@ -24,6 +26,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 +58,7 @@ BCMATTACHFN(nvram_init)(void *si) - vars = new; - - bcopy((char *)(&nvh[1]), new->vars, nvs); -+ fixup_mac_addr(new); - return 0; - } - -@@ -164,3 +168,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"); -+} |