015-smc-ether-addr.patch 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. Index: linux-2.6.21.7/drivers/net/smc91x.c
  2. ===================================================================
  3. --- linux-2.6.21.7.orig/drivers/net/smc91x.c
  4. +++ linux-2.6.21.7/drivers/net/smc91x.c
  5. @@ -1815,6 +1815,39 @@ static int __init smc_findirq(void __iom
  6. return probe_irq_off(cookie);
  7. }
  8. +static inline unsigned int is_gumstix_oui(u8 *addr)
  9. +{
  10. + return (addr[0] == 0x00 && addr[1] == 0x15 && addr[2] == 0xC9);
  11. +}
  12. +
  13. +/**
  14. + * gen_serial_ether_addr - Generate software assigned Ethernet address
  15. + * based on the system_serial number
  16. + * @addr: Pointer to a six-byte array containing the Ethernet address
  17. + *
  18. + * Generate an Ethernet address (MAC) that is not multicast
  19. + * and has the local assigned bit set, keyed on the system_serial
  20. + */
  21. +static inline void gen_serial_ether_addr(u8 *addr)
  22. +{
  23. + static u8 ether_serial_digit = 0;
  24. + addr [0] = system_serial_high >> 8;
  25. + addr [1] = system_serial_high;
  26. + addr [2] = system_serial_low >> 24;
  27. + addr [3] = system_serial_low >> 16;
  28. + addr [4] = system_serial_low >> 8;
  29. + addr [5] = (system_serial_low & 0xc0) | /* top bits are from system serial */
  30. + (1 << 4) | /* 2 bits identify interface type 1=ether, 2=usb, 3&4 undef */
  31. + ((ether_serial_digit++) & 0x0f); /* 15 possible interfaces of each type */
  32. +
  33. + if(!is_gumstix_oui(addr))
  34. + {
  35. + addr [0] &= 0xfe; /* clear multicast bit */
  36. + addr [0] |= 0x02; /* set local assignment bit (IEEE802) */
  37. + }
  38. +}
  39. +
  40. +
  41. /*
  42. * Function: smc_probe(unsigned long ioaddr)
  43. *
  44. @@ -2032,15 +2065,13 @@ static int __init smc_probe(struct net_d
  45. THROTTLE_TX_PKTS ? " [throttle_tx]" : "");
  46. if (!is_valid_ether_addr(dev->dev_addr)) {
  47. - printk("%s: Invalid ethernet MAC address. Please "
  48. - "set using ifconfig\n", dev->name);
  49. - } else {
  50. + gen_serial_ether_addr(dev->dev_addr);
  51. + }
  52. /* Print the Ethernet address */
  53. printk("%s: Ethernet addr: ", dev->name);
  54. for (i = 0; i < 5; i++)
  55. printk("%2.2x:", dev->dev_addr[i]);
  56. printk("%2.2x\n", dev->dev_addr[5]);
  57. - }
  58. if (lp->phy_type == 0) {
  59. PRINTK("%s: No PHY found\n", dev->name);