summaryrefslogtreecommitdiffstats
path: root/target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch
diff options
context:
space:
mode:
authorkaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-02-09 00:11:50 +0000
committerkaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-02-09 00:11:50 +0000
commitd4db749fd7871921ff4a6aeb6e9631c641851998 (patch)
treea1637f5df5b2c6175a4c8b17f73d0f7808361fa7 /target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch
parented2d03fdee38a559d628e947cb23ef46a04f16f8 (diff)
[pxa]: upgrade to 2.6.32.7, switch to squashfs, remove broken flag
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19562 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch')
-rw-r--r--target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch b/target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch
new file mode 100644
index 000000000..82490b33b
--- /dev/null
+++ b/target/linux/pxa/patches/004-smsc911x_verdex_pro_support.patch
@@ -0,0 +1,102 @@
+From 7645a459feb02f7aae4c3a5724b7800495d1b659 Mon Sep 17 00:00:00 2001
+From: Bobby Powers <bobbypowers@gmail.com>
+Date: Wed, 28 Oct 2009 22:41:31 -0400
+Subject: [PATCH] [ARM] smsc911x: Verdex Pro support
+
+Basically Joseph Kortje's patch, cleaned up to apply to Linus's
+tree. Some of the smsc911x.c had been applied already
+
+Signed-off-by: Bobby Powers <bobbypowers@gmail.com>
+---
+ drivers/net/smsc911x.c | 50 +++++++++++++++++++++++++++++++++++++--------
+ drivers/net/smsc911x.h | 2 +-
+ include/linux/smsc911x.h | 11 ++++++++++
+ 3 files changed, 53 insertions(+), 10 deletions(-)
+
+--- a/drivers/net/smsc911x.c
++++ b/drivers/net/smsc911x.c
+@@ -1181,7 +1181,7 @@ static int smsc911x_open(struct net_devi
+ SMSC_WARNING(IFUP,
+ "Timed out waiting for EEPROM busy bit to clear");
+
+- smsc911x_reg_write(pdata, GPIO_CFG, 0x70070000);
++ smsc911x_reg_write(pdata, GPIO_CFG, GPIO_CFG_LED1_EN_ | GPIO_CFG_LED2_EN_ | (1 << 20));
+
+ /* The soft reset above cleared the device's MAC address,
+ * restore it from local copy (set in probe) */
+@@ -1193,8 +1193,8 @@ static int smsc911x_open(struct net_devi
+ smsc911x_reg_write(pdata, INT_EN, 0);
+ smsc911x_reg_write(pdata, INT_STS, 0xFFFFFFFF);
+
+- /* Set interrupt deassertion to 100uS */
+- intcfg = ((10 << 24) | INT_CFG_IRQ_EN_);
++ /* Set interrupt deassertion to 22*10uS */
++ intcfg = ((22 << 24) | INT_CFG_IRQ_EN_);
+
+ if (pdata->config.irq_polarity) {
+ SMSC_TRACE(IFUP, "irq polarity: active high");
+@@ -1220,7 +1220,7 @@ static int smsc911x_open(struct net_devi
+ temp |= INT_EN_SW_INT_EN_;
+ smsc911x_reg_write(pdata, INT_EN, temp);
+
+- timeout = 1000;
++ timeout = 2000;
+ while (timeout--) {
+ if (pdata->software_irq_signal)
+ break;
+@@ -1948,6 +1948,38 @@ static int __devexit smsc911x_drv_remove
+ 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 */
++ (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) */
++ }
++}
++
+ static int __devinit smsc911x_drv_probe(struct platform_device *pdev)
+ {
+ struct net_device *dev;
+@@ -2081,11 +2113,11 @@ static int __devinit smsc911x_drv_probe(
+ SMSC_TRACE(PROBE,
+ "Mac Address is read from LAN911x EEPROM");
+ } else {
+- /* eeprom values are invalid, generate random MAC */
+- random_ether_addr(dev->dev_addr);
+- smsc911x_set_hw_mac_address(pdata, dev->dev_addr);
+- SMSC_TRACE(PROBE,
+- "MAC Address is set to random_ether_addr");
++ /* eeprom values are invalid, generate MAC from serial number */
++ gen_serial_ether_addr(dev->dev_addr);
++ smsc911x_set_hw_mac_address(pdata, dev->dev_addr);
++ SMSC_TRACE(PROBE,
++ "MAC Address is derived from system serial number");
+ }
+ }
+