diff options
Diffstat (limited to 'packages/linux/gumstix-kernel-2.6.21/smc-ether-addr.patch')
-rw-r--r-- | packages/linux/gumstix-kernel-2.6.21/smc-ether-addr.patch | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/packages/linux/gumstix-kernel-2.6.21/smc-ether-addr.patch b/packages/linux/gumstix-kernel-2.6.21/smc-ether-addr.patch new file mode 100644 index 0000000000..b4957b7a0d --- /dev/null +++ b/packages/linux/gumstix-kernel-2.6.21/smc-ether-addr.patch @@ -0,0 +1,62 @@ +Index: linux-2.6.21gum/drivers/net/smc91x.c +=================================================================== +--- linux-2.6.21gum.orig/drivers/net/smc91x.c ++++ linux-2.6.21gum/drivers/net/smc91x.c +@@ -1815,6 +1815,39 @@ static int __init smc_findirq(void __iom + return probe_irq_off(cookie); + } + ++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 */ ++ (1 << 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) */ ++ } ++} ++ ++ + /* + * Function: smc_probe(unsigned long ioaddr) + * +@@ -2032,15 +2065,13 @@ static int __init smc_probe(struct net_d + THROTTLE_TX_PKTS ? " [throttle_tx]" : ""); + + if (!is_valid_ether_addr(dev->dev_addr)) { +- printk("%s: Invalid ethernet MAC address. Please " +- "set using ifconfig\n", dev->name); +- } else { ++ gen_serial_ether_addr(dev->dev_addr); ++ } + /* Print the Ethernet address */ + printk("%s: Ethernet addr: ", dev->name); + for (i = 0; i < 5; i++) + printk("%2.2x:", dev->dev_addr[i]); + printk("%2.2x\n", dev->dev_addr[5]); +- } + + if (lp->phy_type == 0) { + PRINTK("%s: No PHY found\n", dev->name); |