mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	ENOENT could not be found by the compiler when compiling again kernel 4.9. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- 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");
 | |
| +}
 |