93535fa47b1e796ec514a429f3a3714ee5fbfa22
[openwrt/svn-archive/archive.git] / target / linux / pxa / patches-2.6.21 / 012-serial-ether-addr.patch
1 Index: linux-2.6.21.7/drivers/usb/gadget/ether.c
2 ===================================================================
3 --- linux-2.6.21.7.orig/drivers/usb/gadget/ether.c
4 +++ linux-2.6.21.7/drivers/usb/gadget/ether.c
5 @@ -2249,6 +2249,38 @@ static u8 __devinit nibble (unsigned cha
6 return 0;
7 }
8
9 +static inline unsigned int is_gumstix_oui(u8 *addr)
10 +{
11 + return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9);
12 +}
13 +
14 +/**
15 + * gen_serial_ether_addr - Generate software assigned Ethernet address
16 + * based on the system_serial number
17 + * @addr: Pointer to a six-byte array containing the Ethernet address
18 + *
19 + * Generate an Ethernet address (MAC) that is not multicast
20 + * and has the local assigned bit set, keyed on the system_serial
21 + */
22 +static inline void gen_serial_ether_addr(u8 *addr)
23 +{
24 + static u8 ether_serial_digit = 0;
25 + addr [0] = system_serial_high >> 8;
26 + addr [1] = system_serial_high;
27 + addr [2] = system_serial_low >> 24;
28 + addr [3] = system_serial_low >> 16;
29 + addr [4] = system_serial_low >> 8;
30 + addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */
31 + (2 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */
32 + ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */
33 +
34 + if(!is_gumstix_oui(addr))
35 + {
36 + addr [0] &= 0xfe; /* clear multicast bit */
37 + addr [0] |= 0x02; /* set local assignment bit (IEEE802) */
38 + }
39 +}
40 +
41 static int __devinit get_ether_addr(const char *str, u8 *dev_addr)
42 {
43 if (str) {
44 @@ -2266,8 +2298,16 @@ static int __devinit get_ether_addr(cons
45 if (is_valid_ether_addr (dev_addr))
46 return 0;
47 }
48 - random_ether_addr(dev_addr);
49 - return 1;
50 + if(system_serial_high | system_serial_low)
51 + {
52 + gen_serial_ether_addr(dev_addr);
53 + return 0;
54 + }
55 + else
56 + {
57 + random_ether_addr(dev_addr);
58 + return 1;
59 + }
60 }
61
62 static int __devinit