diff -Naur linux-2.6.25.at91-20080908/arch/arm/configs/som9260m_defconfig linux-2.6.25.at91-20080909/arch/arm/configs/som9260m_defconfig
--- linux-2.6.25.at91-20080908/arch/arm/configs/som9260m_defconfig	2008-08-08 11:00:35.000000000 -0500
+++ linux-2.6.25.at91-20080909/arch/arm/configs/som9260m_defconfig	2008-09-09 09:19:44.000000000 -0500
@@ -597,6 +597,7 @@
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 CONFIG_MACB=y
+CONFIG_MACB_TX_SRAM=y
 CONFIG_MACB_FAKE_IRQ=y
 # CONFIG_AX88796 is not set
 # CONFIG_SMC91X is not set
diff -Naur linux-2.6.25.at91-20080908/arch/arm/mach-at91/at91sam9260_devices.c linux-2.6.25.at91-20080909/arch/arm/mach-at91/at91sam9260_devices.c
--- linux-2.6.25.at91-20080908/arch/arm/mach-at91/at91sam9260_devices.c	2008-09-08 13:09:09.000000000 -0500
+++ linux-2.6.25.at91-20080909/arch/arm/mach-at91/at91sam9260_devices.c	2008-09-09 09:17:56.000000000 -0500
@@ -141,6 +141,13 @@
 		.end	= AT91SAM9260_ID_EMAC,
 		.flags	= IORESOURCE_IRQ,
 	},
+#if defined(CONFIG_MACB_TX_SRAM)
+        [2] = {
+               .start  = AT91SAM9260_SRAM0_BASE,
+               .end    = AT91SAM9260_SRAM0_BASE + AT91SAM9260_SRAM0_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+#endif
 };
 
 static struct platform_device at91sam9260_eth_device = {
diff -Naur linux-2.6.25.at91-20080908/arch/arm/mach-at91/at91sam9263_devices.c linux-2.6.25.at91-20080909/arch/arm/mach-at91/at91sam9263_devices.c
--- linux-2.6.25.at91-20080908/arch/arm/mach-at91/at91sam9263_devices.c	2008-07-24 11:43:16.000000000 -0500
+++ linux-2.6.25.at91-20080909/arch/arm/mach-at91/at91sam9263_devices.c	2008-09-09 09:17:56.000000000 -0500
@@ -151,6 +151,13 @@
 		.end	= AT91SAM9263_ID_EMAC,
 		.flags	= IORESOURCE_IRQ,
 	},
+#if defined(CONFIG_MACB_TX_SRAM)
+	[2] = {
+               .start  = AT91SAM9263_SRAM0_BASE,
+               .end    = AT91SAM9263_SRAM0_BASE + AT91SAM9263_SRAM0_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+#endif
 };
 
 static struct platform_device at91sam9263_eth_device = {
diff -Naur linux-2.6.25.at91-20080908/drivers/net/Kconfig linux-2.6.25.at91-20080909/drivers/net/Kconfig
--- linux-2.6.25.at91-20080908/drivers/net/Kconfig	2008-08-28 11:59:05.000000000 -0500
+++ linux-2.6.25.at91-20080909/drivers/net/Kconfig	2008-09-09 09:17:56.000000000 -0500
@@ -226,6 +226,13 @@
 	  To compile this driver as a module, choose M here: the module
 	  will be called macb.
 
+config MACB_TX_SRAM
+	bool "Use internal SRAM for EMAC (Ethernet) transmit buffers"
+	depends on (ARCH_AT91SAM9263 || ARCH_AT91SAM9260) && MACB
+	help
+	  Select this if you are using internal SRAM for EMAC transmit buffers.
+
+
 source "drivers/net/arm/Kconfig"
 
 config AX88796
diff -Naur linux-2.6.25.at91-20080908/drivers/net/macb.c linux-2.6.25.at91-20080909/drivers/net/macb.c
--- linux-2.6.25.at91-20080908/drivers/net/macb.c	2008-09-03 16:58:59.000000000 -0500
+++ linux-2.6.25.at91-20080909/drivers/net/macb.c	2008-09-09 09:17:56.000000000 -0500
@@ -33,22 +33,26 @@
 /* Make the IP header word-aligned (the ethernet header is 14 bytes) */
 #define RX_OFFSET		2
 
-#define TX_RING_SIZE		128
-#define DEF_TX_RING_PENDING	(TX_RING_SIZE - 1)
-#define TX_RING_BYTES		(sizeof(struct dma_desc) * TX_RING_SIZE)
+#define TX_MAX_PKT_SIZE		1536
+#define TX_DEFAULT_RING_SIZE	128
+
+#define DEF_TX_RING_PENDING(bp)	((bp)->tx_ring_size - 1)
+
+#define TX_RING_BYTES(bp)	(sizeof(struct dma_desc) * (bp)->tx_ring_size)
 
 #define TX_RING_GAP(bp)						\
-	(TX_RING_SIZE - (bp)->tx_pending)
+	((bp)->tx_ring_size - (bp)->tx_pending)
+
 #define TX_BUFFS_AVAIL(bp)					\
 	(((bp)->tx_tail <= (bp)->tx_head) ?			\
 	 (bp)->tx_tail + (bp)->tx_pending - (bp)->tx_head :	\
 	 (bp)->tx_tail - (bp)->tx_head - TX_RING_GAP(bp))
-#define NEXT_TX(n)		(((n) + 1) & (TX_RING_SIZE - 1))
 
-#define NEXT_RX(n)		(((n) + 1) & (RX_RING_SIZE - 1))
+#define NEXT_TX(bp, n)		(((n) + 1) % ((bp)->tx_ring_size))
+#define NEXT_RX(n)		(((n) + 1) % (RX_RING_SIZE))
 
 /* minimum number of free TX descriptors before waking up TX process */
-#define MACB_TX_WAKEUP_THRESH	(TX_RING_SIZE / 4)
+#define MACB_TX_WAKEUP_THRESH(bp)	((bp)->tx_ring_size / 4)
 
 #define MACB_RX_INT_FLAGS	(MACB_BIT(RCOMP) | MACB_BIT(RXUBR)	\
 				 | MACB_BIT(ISR_ROVR))
@@ -314,11 +318,11 @@
 		head = bp->tx_head;
 
 		/*Mark all the buffer as used to avoid sending a lost buffer*/
-		for (i = 0; i < TX_RING_SIZE; i++)
+		for (i = 0; i < bp->tx_ring_size; i++)
 			bp->tx_ring[i].ctrl = MACB_BIT(TX_USED);
 
 		/* free transmit buffer in upper layer*/
-		for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) {
+		for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(bp, tail)) {
 			struct ring_info *rp = &bp->tx_skb[tail];
 			struct sk_buff *skb = rp->skb;
 
@@ -344,7 +348,7 @@
 		return;
 
 	head = bp->tx_head;
-	for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) {
+	for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(bp, tail)) {
 		struct ring_info *rp = &bp->tx_skb[tail];
 		struct sk_buff *skb = rp->skb;
 		u32 bufstat;
@@ -369,7 +373,7 @@
 
 	bp->tx_tail = tail;
 	if (netif_queue_stopped(bp->dev) &&
-	    TX_BUFFS_AVAIL(bp) > MACB_TX_WAKEUP_THRESH)
+	    TX_BUFFS_AVAIL(bp) > MACB_TX_WAKEUP_THRESH(bp))
 		netif_wake_queue(bp->dev);
 }
 
@@ -399,6 +403,7 @@
 	}
 
 	skb_reserve(skb, RX_OFFSET);
+	skb->dev = bp->dev;
 	skb->ip_summed = CHECKSUM_NONE;
 	skb_put(skb, len);
 
@@ -642,8 +647,17 @@
 
 	entry = bp->tx_head;
 	dev_dbg(&bp->pdev->dev, "Allocated ring entry %u\n", entry);
-	mapping = dma_map_single(&bp->pdev->dev, skb->data,
-				 len, DMA_TO_DEVICE);
+
+	if (bp->smem_start) {
+		mapping = bp->tx_ring[entry].addr;
+		memcpy(bp->tx_buffers + entry * TX_MAX_PKT_SIZE, \
+			skb->data, len);
+	} else {
+		mapping = dma_map_single(&bp->pdev->dev, skb->data,
+					 len, DMA_TO_DEVICE);
+		bp->tx_ring[entry].addr = mapping;
+	}
+
 	bp->tx_skb[entry].skb = skb;
 	bp->tx_skb[entry].mapping = mapping;
 	dev_dbg(&bp->pdev->dev, "Mapped skb data %p to DMA addr %08lx\n",
@@ -651,14 +665,13 @@
 
 	ctrl = MACB_BF(TX_FRMLEN, len);
 	ctrl |= MACB_BIT(TX_LAST);
-	if (entry == (TX_RING_SIZE - 1))
+	if (entry == (bp->tx_ring_size - 1))
 		ctrl |= MACB_BIT(TX_WRAP);
 
-	bp->tx_ring[entry].addr = mapping;
 	bp->tx_ring[entry].ctrl = ctrl;
 	wmb();
 
-	entry = NEXT_TX(entry);
+	entry = NEXT_TX(bp, entry);
 	bp->tx_head = entry;
 
 	macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
@@ -685,8 +698,9 @@
 		bp->rx_ring = NULL;
 	}
 	if (bp->tx_ring) {
-		dma_free_coherent(&bp->pdev->dev, TX_RING_BYTES,
-				  bp->tx_ring, bp->tx_ring_dma);
+		if (!bp->smem_start)
+			dma_free_coherent(&bp->pdev->dev, TX_RING_BYTES(bp),
+				  	bp->tx_ring, bp->tx_ring_dma);
 		bp->tx_ring = NULL;
 	}
 	if (bp->rx_buffers) {
@@ -695,13 +709,16 @@
 				  bp->rx_buffers, bp->rx_buffers_dma);
 		bp->rx_buffers = NULL;
 	}
+
+	if (bp->smem_start && bp->tx_ring_dma)
+		release_mem_region(bp->tx_ring_dma, bp->smem_size);
 }
 
 static int macb_alloc_consistent(struct macb *bp)
 {
 	int size;
 
-	size = TX_RING_SIZE * sizeof(struct ring_info);
+	size = bp->tx_ring_size * sizeof(struct ring_info);
 	bp->tx_skb = kmalloc(size, GFP_KERNEL);
 	if (!bp->tx_skb)
 		goto out_err;
@@ -715,11 +732,28 @@
 		"Allocated RX ring of %d bytes at %08lx (mapped %p)\n",
 		size, (unsigned long)bp->rx_ring_dma, bp->rx_ring);
 
-	size = TX_RING_BYTES;
-	bp->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size,
-					 &bp->tx_ring_dma, GFP_KERNEL);
-	if (!bp->tx_ring)
-		goto out_err;
+	if (bp->smem_start) {
+		if (request_mem_region(bp->smem_start,  \
+			bp->smem_size, "macb")) {
+			bp->tx_ring_dma = bp->smem_start;
+		}
+		bp->tx_ring = ioremap(bp->tx_ring_dma, bp->smem_size);
+		if (bp->tx_ring) {
+			bp->tx_buffers_dma = bp->tx_ring_dma + \
+			TX_RING_BYTES(bp);
+			bp->tx_buffers = (char *) bp->tx_ring + \
+			TX_RING_BYTES(bp);
+		}
+	}
+
+	if (!bp->tx_ring) {
+		size = TX_RING_BYTES(bp);
+		bp->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size, \
+ 						 &bp->tx_ring_dma, GFP_KERNEL);
+
+		if (!bp->tx_ring)
+			goto out_err;
+	}
 	dev_dbg(&bp->pdev->dev,
 		"Allocated TX ring of %d bytes at %08lx (mapped %p)\n",
 		size, (unsigned long)bp->tx_ring_dma, bp->tx_ring);
@@ -753,12 +787,16 @@
 	}
 	bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP);
 
-	for (i = 0; i < TX_RING_SIZE; i++) {
-		bp->tx_ring[i].addr = 0;
+	for (i = 0; i < bp->tx_ring_size; i++) {
+		bp->tx_ring[i].addr = (bp->smem_start) ? \
+			bp->tx_buffers_dma + i * TX_MAX_PKT_SIZE : 0;
 		bp->tx_ring[i].ctrl = MACB_BIT(TX_USED);
-	}
-	bp->tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
 
+		bp->tx_ring[i].addr = (u32) (bp->tx_buffers_dma + \
+					(i * TX_MAX_PKT_SIZE));
+	}
+	
+	bp->tx_ring[bp->tx_ring_size - 1].ctrl |= MACB_BIT(TX_WRAP);
 	bp->rx_tail = bp->tx_head = bp->tx_tail = 0;
 }
 
@@ -1095,6 +1133,7 @@
 {
 	struct eth_platform_data *pdata;
 	struct resource *regs;
+	struct resource *smem;
 	struct net_device *dev;
 	struct macb *bp;
 	struct phy_device *phydev;
@@ -1206,7 +1245,23 @@
 		macb_writel(bp, USRIO, MACB_BIT(MII));
 #endif
 
-	bp->tx_pending = DEF_TX_RING_PENDING;
+	/* Check  mem region for TX buffers */
+	smem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+	if (smem) {
+		bp->smem_start = smem->start;
+		bp->smem_size  = smem->end - smem->start + 1;
+		bp->tx_ring_size = bp->smem_size / (TX_MAX_PKT_SIZE + \
+				sizeof(struct dma_desc));
+	}
+
+	/* if ring_size == 0 then mem to small and use standard memory */
+	if (!bp->tx_ring_size) {
+		bp->smem_start = 0;
+		bp->tx_ring_size = TX_DEFAULT_RING_SIZE;
+	}
+
+	bp->tx_pending   = DEF_TX_RING_PENDING(bp);
+
 	/* clear statistics from transfers before Linux booted (i.e. u-boot) */
 	macb_writel(bp, NCR, MACB_BIT(CLRSTAT));
 
diff -Naur linux-2.6.25.at91-20080908/drivers/net/macb.h linux-2.6.25.at91-20080909/drivers/net/macb.h
--- linux-2.6.25.at91-20080908/drivers/net/macb.h	2008-07-24 11:43:16.000000000 -0500
+++ linux-2.6.25.at91-20080909/drivers/net/macb.h	2008-09-09 09:17:56.000000000 -0500
@@ -364,11 +364,13 @@
 	unsigned int		rx_tail;
 	struct dma_desc		*rx_ring;
 	void			*rx_buffers;
-
+	void			*tx_buffers;
+	unsigned int		tx_ring_size;
 	unsigned int		tx_head, tx_tail;
 	struct dma_desc		*tx_ring;
 	struct ring_info	*tx_skb;
-
+	unsigned int		smem_start;
+	unsigned int		smem_size;
 	spinlock_t		lock;
 	struct platform_device	*pdev;
 	struct clk		*pclk;
@@ -377,7 +379,7 @@
 	struct napi_struct	napi;
 	struct net_device_stats	stats;
 	struct macb_stats	hw_stats;
-
+	dma_addr_t		tx_buffers_dma;
 	dma_addr_t		rx_ring_dma;
 	dma_addr_t		tx_ring_dma;
 	dma_addr_t		rx_buffers_dma;
