diff -urN linux-2.6.20.at91.orig/drivers/net/arm/at91_ether.c linux-2.6.20.at91.mod/drivers/net/arm/at91_ether.c
--- linux-2.6.20.at91.orig/drivers/net/arm/at91_ether.c	2007-03-28 18:48:56 +0300
+++ linux-2.6.20.at91.mod/drivers/net/arm/at91_ether.c	2007-03-28 18:39:07 +0300
@@ -10,6 +10,7 @@
  *   (Polaroid Corporation)
  *
  * Realtek RTL8201(B)L PHY support by Roman Avramenko <roman@imsystems.ru>
+ * National Semiconductor DP83848 PHY support by Ivan Kuten <ivan DOT kuten AT promwad DOT com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -225,6 +226,11 @@
 		if (!(phy & ((1 << 2) | 1)))
 			goto done;
 	}
+	else if (lp->phy_type == MII_DP83848_ID) {
+		read_phy(lp->phy_address, MII_DPPHYSTS_REG, &phy);	/* ack interrupt */
+		if (!(phy & (1 << 7)))
+			goto done;
+	}
 
 	update_linkspeed(dev, 0);
 
@@ -280,6 +286,14 @@
 		dsintr = (1 << 10) | ( 1 << 8);
 		write_phy(lp->phy_address, MII_TPISTATUS, dsintr);
 	}
+	else if (lp->phy_type == MII_DP83848_ID) {	/* for National Semiconductor DP83848 PHY */
+		read_phy(lp->phy_address, MII_DPMICR_REG, &dsintr);
+		dsintr = dsintr | 0x3;					/* set bits 0,1 */
+		write_phy(lp->phy_address, MII_DPMICR_REG, dsintr);
+		read_phy(lp->phy_address, MII_DPMISR_REG, &dsintr);
+		dsintr = dsintr | 0x7f;					/* set bits 0..6 */
+		write_phy(lp->phy_address, MII_DPMISR_REG, dsintr);
+	}
 
 	disable_mdi();
 	spin_unlock_irq(&lp->lock);
@@ -323,6 +337,14 @@
 		dsintr = ~((1 << 10) | (1 << 8));
 		write_phy(lp->phy_address, MII_TPISTATUS, dsintr);
 	}
+	else if (lp->phy_type == MII_DP83848_ID) {	/* for National Semiconductor DP83848 PHY */
+		read_phy(lp->phy_address, MII_DPMICR_REG, &dsintr);
+		dsintr = dsintr & ~0x3;					/* clear bits 0,1 */
+		write_phy(lp->phy_address, MII_DPMICR_REG, dsintr);
+		read_phy(lp->phy_address, MII_DPMISR_REG, &dsintr);
+		dsintr = dsintr & ~0x7f;					/* clear bits 0..6 */
+		write_phy(lp->phy_address, MII_DPMISR_REG, dsintr);
+	}
 
 	disable_mdi();
 	spin_unlock_irq(&lp->lock);
@@ -1071,6 +1093,8 @@
 		printk(KERN_INFO "%s: Broadcom BCM5221 PHY\n", dev->name);
 	else if (phy_type == MII_DP83847_ID)
 		printk(KERN_INFO "%s: National Semiconductor DP83847 PHY\n", dev->name);
+	else if (phy_type == MII_DP83848_ID)
+		printk(KERN_INFO "%s: National Semiconductor DP83848 PHY\n", dev->name);
 	else if (phy_type == MII_AC101L_ID)
 		printk(KERN_INFO "%s: Altima AC101L PHY\n", dev->name);
 	else if (phy_type == MII_KS8721_ID)
@@ -1112,6 +1136,7 @@
 			case MII_RTL8201_ID:		/* Realtek RTL8201: PHY_ID1 = 0, PHY_ID2 = 0x8201 */
 			case MII_BCM5221_ID:		/* Broadcom BCM5221: PHY_ID1 = 0x40, PHY_ID2 = 0x61e0 */
 			case MII_DP83847_ID:		/* National Semiconductor DP83847: */
+			case MII_DP83848_ID:		/* National Semiconductor DP83848: */
 			case MII_AC101L_ID:		/* Altima AC101L: PHY_ID1 = 0x22, PHY_ID2 = 0x5520 */
 			case MII_KS8721_ID:		/* Micrel KS8721: PHY_ID1 = 0x22, PHY_ID2 = 0x1610 */
 				detected = at91ether_setup(phy_id, phy_address, pdev, ether_clk);
diff -urN linux-2.6.20.at91.orig/drivers/net/arm/at91_ether.h linux-2.6.20.at91.mod/drivers/net/arm/at91_ether.h
--- linux-2.6.20.at91.orig/drivers/net/arm/at91_ether.h	2007-02-04 20:44:54 +0200
+++ linux-2.6.20.at91.mod/drivers/net/arm/at91_ether.h	2007-03-28 01:12:11 +0300
@@ -45,6 +45,14 @@
 /* National Semiconductor DP83847 */
 #define MII_DP83847_ID	0x20005c30
 
+/* National Semiconductor DP83848 */
+#define MII_DP83848_ID	0x20005c90
+
+/* National Semiconductor DP83848 specific registers */
+#define MII_DPPHYSTS_REG 16
+#define MII_DPMICR_REG   17
+#define MII_DPMISR_REG   18
+
 /* Altima AC101L PHY */
 #define MII_AC101L_ID	0x00225520
 
