diff options
author | Michael Lauer <mickey@vanille-media.de> | 2007-08-23 11:47:15 +0000 |
---|---|---|
committer | Michael Lauer <mickey@vanille-media.de> | 2007-08-23 11:47:15 +0000 |
commit | f1d0d79f48ab191a1ed0b5065e39046e1d95fef4 (patch) | |
tree | 860036a8554d604726a256d7408c711df834b7cb /packages/linux/linux-2.6.21/serial-ether-addr.patch | |
parent | 2534c12ac4c879178132751e51db09c6e4f22cf9 (diff) | |
parent | 958b8822656bed6e5526f9441fea36570787f9c7 (diff) |
merge of '88dd6a801655485b76bb6d591c1f763d51ff47b8'
and 'ea2a23cae4f4d939a07f699c39b603c4c2559ad1'
Diffstat (limited to 'packages/linux/linux-2.6.21/serial-ether-addr.patch')
-rw-r--r-- | packages/linux/linux-2.6.21/serial-ether-addr.patch | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/packages/linux/linux-2.6.21/serial-ether-addr.patch b/packages/linux/linux-2.6.21/serial-ether-addr.patch new file mode 100644 index 0000000000..3161472e90 --- /dev/null +++ b/packages/linux/linux-2.6.21/serial-ether-addr.patch @@ -0,0 +1,62 @@ +Index: linux-2.6.21gum/drivers/usb/gadget/ether.c +=================================================================== +--- linux-2.6.21gum.orig/drivers/usb/gadget/ether.c ++++ linux-2.6.21gum/drivers/usb/gadget/ether.c +@@ -2249,6 +2249,38 @@ static u8 __devinit nibble (unsigned cha + return 0; + } + ++static inline unsigned int is_gumstix_oui(u8 *addr) ++{ ++ return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9); ++} ++ ++/** ++ * gen_serial_ether_addr - Generate software assigned Ethernet address ++ * based on the system_serial number ++ * @addr: Pointer to a six-byte array containing the Ethernet address ++ * ++ * Generate an Ethernet address (MAC) that is not multicast ++ * and has the local assigned bit set, keyed on the system_serial ++ */ ++static inline void gen_serial_ether_addr(u8 *addr) ++{ ++ static u8 ether_serial_digit = 0; ++ addr [0] = system_serial_high >> 8; ++ addr [1] = system_serial_high; ++ addr [2] = system_serial_low >> 24; ++ addr [3] = system_serial_low >> 16; ++ addr [4] = system_serial_low >> 8; ++ addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */ ++ (2 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */ ++ ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */ ++ ++ if(!is_gumstix_oui(addr)) ++ { ++ addr [0] &= 0xfe; /* clear multicast bit */ ++ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ ++ } ++} ++ + static int __devinit get_ether_addr(const char *str, u8 *dev_addr) + { + if (str) { +@@ -2266,8 +2298,16 @@ static int __devinit get_ether_addr(cons + if (is_valid_ether_addr (dev_addr)) + return 0; + } +- random_ether_addr(dev_addr); +- return 1; ++ if(system_serial_high | system_serial_low) ++ { ++ gen_serial_ether_addr(dev_addr); ++ return 0; ++ } ++ else ++ { ++ random_ether_addr(dev_addr); ++ return 1; ++ } + } + + static int __devinit |