diff --git a/linux/kernel-2.6.24-v2/drivers/net/smc911x.c b/linux/kernel-2.6.24-v2/drivers/net/smc911x.c
--- a/linux/kernel-2.6.24-v2/drivers/net/smc911x.c
+++ b/linux/kernel-2.6.24-v2/drivers/net/smc911x.c
@@ -27,32 +27,13 @@
  * History:
  *	  04/16/05	Dustin McIntire		 Initial version
  */
+
 static const char version[] =
 	 "smc911x.c: v1.0 04-16-2005 by Dustin McIntire <dustin@sensoria.com>\n";
 
-/* Debugging options */
-#define ENABLE_SMC_DEBUG_RX		0
-#define ENABLE_SMC_DEBUG_TX		0
-#define ENABLE_SMC_DEBUG_DMA		0
-#define ENABLE_SMC_DEBUG_PKTS		0
-#define ENABLE_SMC_DEBUG_MISC		0
-#define ENABLE_SMC_DEBUG_FUNC		0
-
-#define SMC_DEBUG_RX		((ENABLE_SMC_DEBUG_RX	? 1 : 0) << 0)
-#define SMC_DEBUG_TX		((ENABLE_SMC_DEBUG_TX	? 1 : 0) << 1)
-#define SMC_DEBUG_DMA		((ENABLE_SMC_DEBUG_DMA	? 1 : 0) << 2)
-#define SMC_DEBUG_PKTS		((ENABLE_SMC_DEBUG_PKTS ? 1 : 0) << 3)
-#define SMC_DEBUG_MISC		((ENABLE_SMC_DEBUG_MISC ? 1 : 0) << 4)
-#define SMC_DEBUG_FUNC		((ENABLE_SMC_DEBUG_FUNC ? 1 : 0) << 5)
-
 #ifndef SMC_DEBUG
-#define SMC_DEBUG	 ( SMC_DEBUG_RX	  | \
-			   SMC_DEBUG_TX	  | \
-			   SMC_DEBUG_DMA  | \
-			   SMC_DEBUG_PKTS | \
-			   SMC_DEBUG_MISC | \
-			   SMC_DEBUG_FUNC   \
-			 )
+#define SMC_DEBUG 0 
+#define SMC_DEBUG_PKTS 0 
 #endif
 
 #include <linux/init.h>
@@ -76,6 +57,7 @@
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 
+#include <linux/irq.h>
 #include <asm/io.h>
 
 #include "smc911x.h"
@@ -295,14 +277,14 @@
 	SMC_SET_AFC_CFG(lp->afc_cfg);
 
 
-	/* Set to LED outputs */
-	SMC_SET_GPIO_CFG(0x70070000);
+	/* Set to LED outputs and configure EEPROM pins as GP outputs */
+	SMC_SET_GPIO_CFG(GPIO_CFG_LED1_EN_ | GPIO_CFG_LED2_EN_ | 1 << 20);
 
 	/*
-	 * Deassert IRQ for 1*10us for edge type interrupts
+	 * Deassert IRQ for 22*10us for edge type interrupts
 	 * and drive IRQ pin push-pull
 	 */
-	SMC_SET_IRQ_CFG( (1 << 24) | INT_CFG_IRQ_EN_ | INT_CFG_IRQ_TYPE_ );
+	SMC_SET_IRQ_CFG( (22 << 24) | INT_CFG_IRQ_EN_ | INT_CFG_IRQ_TYPE_ );
 
 	/* clear anything saved */
 	if (lp->pending_tx_skb != NULL) {
@@ -405,7 +387,7 @@
 	if (fifo_count <= 4) {
 		/* Manually dump the packet data */
 		while (fifo_count--)
-			SMC_GET_RX_FIFO();
+			(void)SMC_GET_RX_FIFO();
 	} else	 {
 		/* Fast forward through the bad packet */
 		SMC_SET_RX_DP_CTRL(RX_DP_CTRL_FFWD_BUSY_);
@@ -891,6 +873,7 @@
 	unsigned long ioaddr = dev->base_addr;
 	unsigned int bmcr;
 
+	DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __FUNCTION__);
 	/* Enter Link Disable state */
 	SMC_GET_PHY_BMCR(phy, bmcr);
 	bmcr |= BMCR_PDOWN;
@@ -916,6 +899,7 @@
 
 	if (mii_check_media(&lp->mii, netif_msg_link(lp), init)) {
 		/* duplex state has changed */
+		DBG(SMC_DEBUG_MISC, "%s: duplex state has changed\n", dev->name);
 		SMC_GET_PHY_BMCR(phyaddr, bmcr);
 		SMC_GET_MAC_CR(cr);
 		if (lp->mii.full_duplex) {
@@ -951,6 +935,7 @@
 	int my_phy_caps; /* My PHY capabilities */
 	int my_ad_caps; /* My Advertised capabilities */
 	int status;
+	int bmcr;
 	unsigned long flags;
 
 	DBG(SMC_DEBUG_FUNC, "%s: --> %s()\n", dev->name, __FUNCTION__);
@@ -1024,9 +1009,12 @@
 
 	DBG(SMC_DEBUG_MISC, "%s: phy caps=0x%04x\n", dev->name, my_phy_caps);
 	DBG(SMC_DEBUG_MISC, "%s: phy advertised caps=0x%04x\n", dev->name, my_ad_caps);
+	DBG(SMC_DEBUG_MISC, "%s: phy advertised readback caps=0x%04x\n", dev->name, status);
 
 	/* Restart auto-negotiation process in order to advertise my caps */
-	SMC_SET_PHY_BMCR(phyaddr, BMCR_ANENABLE | BMCR_ANRESTART);
+	SMC_GET_PHY_BMCR(phyaddr, bmcr);
+	bmcr |= BMCR_ANENABLE | BMCR_ANRESTART;
+	SMC_SET_PHY_BMCR(phyaddr, bmcr);
 
 	smc911x_phy_check_media(dev, 1);
 
@@ -1856,6 +1844,48 @@
 	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)
+{
+#ifdef CONFIG_CELL
+	addr [0] = 0x00;
+	addr [1] = 0x15;
+	addr [2] = 0xC9;
+	addr [3] = 0x83;
+	addr [4] = 0x82;
+	addr [5] = 0x81;
+#else
+	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 */
+#endif
+
+	if(!is_gumstix_oui(addr))
+	{
+		addr [0] &= 0xfe;		/* clear multicast bit */
+		addr [0] |= 0x02;		/* set local assignment bit (IEEE802) */
+	}
+}
+
+
 /*
  * Function: smc911x_probe(unsigned long ioaddr)
  *
@@ -2082,15 +2112,13 @@
 #endif
 		printk("\n");
 		if (!is_valid_ether_addr(dev->dev_addr)) {
-			printk("%s: Invalid ethernet MAC address. Please "
-					"set using ifconfig\n", dev->name);
-		} else {
-			/* 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]);
+			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);
@@ -2265,8 +2293,15 @@
 	},
 };
 
+#ifdef CONFIG_ARCH_GUMSTIX
+extern void gumstix_smc911x_load(void);
+#endif
+
 static int __init smc911x_init(void)
 {
+#ifdef CONFIG_ARCH_GUMSTIX
+	gumstix_smc911x_load();
+#endif
 	return platform_driver_register(&smc911x_driver);
 }
 
diff --git a/linux/kernel-2.6.24-v2/drivers/net/smc911x.h b/linux/kernel-2.6.24-v2/drivers/net/smc911x.h
--- a/linux/kernel-2.6.24-v2/drivers/net/smc911x.h
+++ b/linux/kernel-2.6.24-v2/drivers/net/smc911x.h
@@ -33,7 +33,9 @@
  * Use the DMA feature on PXA chips
  */
 #ifdef CONFIG_ARCH_PXA
+#if !defined( CONFIG_SMC911X_GUMSTIX ) && !defined( CONFIG_SMC911X_GUMSTIX_MODULE )
   #define SMC_USE_PXA_DMA	1
+#endif
   #define SMC_USE_16BIT		0
   #define SMC_USE_32BIT		1
   #define SMC_IRQ_SENSE		IRQF_TRIGGER_FALLING
@@ -52,13 +54,13 @@
 #if	SMC_USE_16BIT
 #define SMC_inb(a, r)			 readb((a) + (r))
 #define SMC_inw(a, r)			 readw((a) + (r))
-#define SMC_inl(a, r)			 ((SMC_inw(a, r) & 0xFFFF)+(SMC_inw(a+2, r)<<16))
+#define SMC_inl(a, r)			 ((SMC_inw(a, r) & 0xFFFF)+(SMC_inw((a)+2, r)<<16))
 #define SMC_outb(v, a, r)		 writeb(v, (a) + (r))
 #define SMC_outw(v, a, r)		 writew(v, (a) + (r))
 #define SMC_outl(v, a, r) 			 \
 	do{					 \
-		 writel(v & 0xFFFF, (a) + (r));	 \
-		 writel(v >> 16, (a) + (r) + 2); \
+		 writel((v) & 0xFFFF, (a) + (r));	 \
+		 writel((v) >> 16, (a) + (r) + 2); \
 	 } while (0)
 #define SMC_insl(a, r, p, l)	 readsw((short*)((a) + (r)), p, l*2)
 #define SMC_outsl(a, r, p, l)	 writesw((short*)((a) + (r)), p, l*2)
diff --git a/linux/kernel-2.6.24-v2/l4linux_config_gumstix_cell b/linux/kernel-2.6.24-v2/l4linux_config_gumstix_cell
--- a/linux/kernel-2.6.24-v2/l4linux_config_gumstix_cell
+++ b/linux/kernel-2.6.24-v2/l4linux_config_gumstix_cell
@@ -475,10 +475,12 @@
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_AX88796 is not set
-CONFIG_SMC91X_GUMSTIX=y
-CONFIG_SMC91X=y
+CONFIG_SMC91X_GUMSTIX=n
+CONFIG_SMC91X=n
 # CONFIG_DM9000 is not set
-# CONFIG_SMC911X is not set
+CONFIG_SMC911X=y
+CONFIG_SMC911X_GUMSTIX=y
+
 # CONFIG_IBM_NEW_EMAC_ZMII is not set
 # CONFIG_IBM_NEW_EMAC_RGMII is not set
 # CONFIG_IBM_NEW_EMAC_TAH is not set
diff --git a/linux/kernel-2.6.24-v2/drivers/net/gumstix-smc911x.c b/linux/kernel-2.6.24-v2/drivers/net/gumstix-smc911x.c
new file mode 100644
--- /dev/null
+++ b/linux/kernel-2.6.24-v2/drivers/net/gumstix-smc911x.c
@@ -0,0 +1,209 @@
+/*
+ *  Gumstix SMC911x chip intialization driver
+ *
+ *  Author:     Craig Hughes
+ *  Created:    December 9, 2004
+ *  Copyright:  (C) 2004 Craig Hughes
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/mii.h>
+
+#include <asm/hardware.h>
+#include <asm/arch/pxa-regs.h>
+#include <asm/delay.h>
+
+#include <asm/arch/gumstix.h>
+
+#define SMC_DEBUG               9
+#include <asm/io.h>
+#include "smc911x.h"
+
+static struct resource gumstix_smc911x0_resources[] = {
+	[0] = {
+		.name	= "smc911x-regs",
+#if defined(CONFIG_CELL)
+		.start  = 0x00000000,
+		.end    = 0x000fffff,
+#else
+		.start  = PXA_CS1_PHYS,
+		.end    = PXA_CS1_PHYS + 0x000fffff,
+#endif
+		.flags  = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start  = GUMSTIX_ETH0_IRQ,
+		.end    = GUMSTIX_ETH0_IRQ,
+		.flags  = IORESOURCE_IRQ,
+	},
+	[2] = {
+               .name   = "smc91x-dma",
+#if defined(CONFIG_CELL)
+               .start  = 0x00000000,
+               .end    = 0x000fffff,
+#else
+               .start  = PXA_CS1_DMA,
+               .end    = PXA_CS1_DMA + 0x000fffff,
+#endif
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct resource gumstix_smc911x1_resources[] = {
+	[0] = {
+		.name	= "smc911x-regs",
+#if defined(CONFIG_CELL)
+		.start	= 0x00000000,
+		.end	= 0x000fffff,
+#else
+		.start	= PXA_CS2_PHYS,
+		.end	= PXA_CS2_PHYS + 0x000fffff,
+#endif
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= GUMSTIX_ETH1_IRQ,
+		.end	= GUMSTIX_ETH1_IRQ,
+		.flags	= IORESOURCE_IRQ,
+	},
+	[2] = {
+               .name   = "smc91x-dma",
+#if defined(CONFIG_CELL)
+               .start  = 0x00000000,
+               .end    = 0x000fffff,
+#else
+               .start  = PXA_CS1_DMA,
+               .end    = PXA_CS1_DMA + 0x000fffff,
+#endif
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device gumstix_smc911x0_device = {
+	.name           = "smc911x",
+	.id             = 0,
+	.num_resources  = ARRAY_SIZE(gumstix_smc911x0_resources),
+	.resource       = gumstix_smc911x0_resources,
+};
+
+static struct platform_device gumstix_smc911x1_device = {
+	.name           = "smc911x",
+	.id             = 1,
+	.num_resources  = ARRAY_SIZE(gumstix_smc911x1_resources),
+	.resource       = gumstix_smc911x1_resources,
+};
+
+static struct platform_device *smc911x_devices[] = {
+	&gumstix_smc911x0_device,
+	&gumstix_smc911x1_device,
+};
+
+/* First we're going to test if there's a 2nd SMC911x, and if not, then we'll free up those resources and the GPIO lines
+ * that it would otherwise use.  We have no choice but to probe by doing:
+ * Set nCS2 to CS2 mode
+ * Set the reset line to GPIO out mode, and pull it high, then drop it low (to trigger reset)
+ * Read from the memory space to check for the sentinel sequence identifying a likely SMC911x device
+ */
+int __init gumstix_smc911x_init(void)
+{
+	unsigned int val, num_devices=ARRAY_SIZE(smc911x_devices);
+	void *ioaddr;
+	printk("%s\n", __FUNCTION__);
+#if defined(CONFIG_CELL)
+	gumstix_smc911x0_resources[0].start += PXA_CS1_PHYS;
+	printk("start: %lx\n", gumstix_smc911x0_resources[0].start);
+	gumstix_smc911x0_resources[0].end += PXA_CS1_PHYS;
+	gumstix_smc911x1_resources[0].start += PXA_CS2_PHYS;
+	gumstix_smc911x1_resources[0].end += PXA_CS2_PHYS;
+
+	gumstix_smc911x0_resources[2].start += PXA_CS1_DMA;
+	gumstix_smc911x0_resources[2].end += PXA_CS1_DMA;
+	gumstix_smc911x1_resources[2].start += PXA_CS2_DMA;
+	gumstix_smc911x1_resources[2].end += PXA_CS2_DMA;
+#endif
+
+	printk("%s %d\n", __FILE__, __LINE__);
+
+	/* Set up nPWE */
+	pxa_gpio_mode(GPIO49_nPWE_MD);
+
+	pxa_gpio_mode(GPIO78_nCS_2_MD);
+	// If either if statement fails, then we'll drop out and turn_off_eth1,
+	// if both succeed, then we'll skip that and just proceed with 2 cards
+	printk("%s %d\n", __FILE__, __LINE__);
+#if 0 /* do not check for second network interface */
+	if(request_mem_region(gumstix_smc911x1_resources[1].start, SMC911X_IO_EXTENT, "smc911x probe"))
+	{
+		printk("%s %d\n", __FILE__, __LINE__);
+		ioaddr = ioremap(gumstix_smc911x1_resources[1].start, SMC911X_IO_EXTENT);
+		printk("%s %d ioaddr 0x%p\n", __FILE__, __LINE__, ioaddr);
+		val = SMC_GET_PN();
+		printk("%s %d\n", __FILE__, __LINE__);
+		iounmap(ioaddr);
+		printk("%s %d\n", __FILE__, __LINE__);
+		release_mem_region(gumstix_smc911x1_resources[1].start, SMC911X_IO_EXTENT);
+		printk("%s %d\n", __FILE__, __LINE__);
+		if (CHIP_9115 == val ||
+				CHIP_9116 == val ||
+				CHIP_9117 == val ||
+				CHIP_9118 == val ) {
+			goto proceed;
+		}
+		printk("%s %d\n", __FILE__, __LINE__);
+	}
+#endif
+
+	printk("%s %d\n", __FILE__, __LINE__);
+turn_off_eth1:
+	// This is apparently not an SMC911x
+	// So, let's decrement the number of devices to request, and reset the GPIO lines to GPIO IN mode
+	num_devices--;
+	smc911x_devices[1] = NULL;
+	pxa_gpio_mode(78 | GPIO_IN);
+	
+	printk("%s %d\n", __FILE__, __LINE__);
+proceed:
+	pxa_gpio_mode(GPIO15_nCS_1_MD);
+
+	if(smc911x_devices[1]) pxa_gpio_mode(GPIO_GUMSTIX_ETH1_RST_MD);
+	pxa_gpio_mode(GPIO_GUMSTIX_ETH0_RST_MD);
+
+	if(smc911x_devices[1]) GPCR(GPIO_GUMSTIX_ETH1_RST) = GPIO_bit(GPIO_GUMSTIX_ETH1_RST);
+	GPCR(GPIO_GUMSTIX_ETH0_RST) = GPIO_bit(GPIO_GUMSTIX_ETH0_RST);
+	msleep(500); // Hold RESET for at least 200Âµ
+
+	if(smc911x_devices[1]) GPSR(GPIO_GUMSTIX_ETH1_RST) = GPIO_bit(GPIO_GUMSTIX_ETH1_RST);
+	GPSR(GPIO_GUMSTIX_ETH0_RST) = GPIO_bit(GPIO_GUMSTIX_ETH0_RST);
+	msleep(50);
+
+	printk("%s %d\n", __FILE__, __LINE__);
+	return platform_add_devices(smc911x_devices, num_devices);
+}
+
+void __exit gumstix_smc911x_exit(void)
+{
+	if(smc911x_devices[1] != NULL) platform_device_unregister(&gumstix_smc911x1_device);
+	platform_device_unregister(&gumstix_smc911x0_device);
+}
+
+void gumstix_smc911x_load(void) {}
+EXPORT_SYMBOL(gumstix_smc911x_load);
+
+module_init(gumstix_smc911x_init);
+module_exit(gumstix_smc911x_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Craig Hughes <craig@gumstix.com>");
+MODULE_DESCRIPTION("Gumstix board SMC911x chip initialization driver");
+MODULE_VERSION("1:0.1");
