diff -uprN linux-2.4.28-vanilla/drivers/net/tulip/eeprom.c linux-2.4.28/drivers/net/tulip/eeprom.c
--- linux-2.4.28-vanilla/drivers/net/tulip/eeprom.c	2003-06-13 22:51:35.000000000 +0800
+++ linux-2.4.28/drivers/net/tulip/eeprom.c	2004-11-22 14:35:32.000000000 +0800
@@ -257,7 +257,7 @@ subsequent_board:
 				if (p[1] == 0x05) {
 					mtable->has_reset = i;
 					leaf->media = p[2] & 0x0f;
-				} else if (tp->chip_id == DM910X && p[1] == 0x80) {
+				} else if ((tp->chip_id == DM910X || tp->chip_id == ULi526X) && p[1] == 0x80) {
 					/* Hack to ignore Davicom delay period block */
 					mtable->leafcount--;
 					count--;
@@ -277,7 +277,7 @@ subsequent_board:
 					mtable->has_nonmii = 1;
 					leaf->media = p[2] & MEDIA_MASK;
 					/* Davicom's media number for 100BaseTX is strange */
-					if (tp->chip_id == DM910X && leaf->media == 1)
+					if ((tp->chip_id == DM910X || tp->chip_id == ULi526X) && leaf->media == 1)
 						leaf->media = 3;
 					switch (leaf->media) {
 					case 0: new_advertise |= 0x0020; break;
diff -uprN linux-2.4.28-vanilla/drivers/net/tulip/media.c linux-2.4.28/drivers/net/tulip/media.c
--- linux-2.4.28-vanilla/drivers/net/tulip/media.c	2003-06-13 22:51:35.000000000 +0800
+++ linux-2.4.28/drivers/net/tulip/media.c	2004-11-22 14:35:33.000000000 +0800
@@ -85,7 +85,33 @@ int tulip_mdio_read(struct net_device *d
 		spin_unlock_irqrestore(&tp->mii_lock, flags);
 		return retval & 0xffff;
 	}
+	/* For ULi M5263 MII read *///add by clearzhang 2004/11/22
+	if((tp->chip_id == ULi526X) && (tp->revision >= 0x40))
+	{
+		int valule;
+		int i = 1000;
+		//printk("read use cr10\n");
+		
+		valule = inl(ioaddr + CSR9);	
+		outl((valule & 0xffefffff), ioaddr + CSR9);
+	
+		//printk("location=0x%x\n",location);	
+		valule = (phy_id<<21) + (location<<16) + 0x8000000;
+
+		
+		outl((phy_id<<21) + (location<<16) + 0x8000000, ioaddr + CSR10);
+
+		while (--i > 0) {
+			mdio_delay();
+			if  ( retval =( inl(ioaddr + CSR10) & 0x10000000) ) 
+				break;
 
+		}
+		retval =inl(ioaddr + CSR10);
+		//printk("retval=0x%x\n",retval);
+		spin_unlock_irqrestore(&tp->mii_lock, flags);
+		return retval & 0xffff;
+	}
 	/* Establish sync by sending at least 32 logic ones. */
 	for (i = 32; i >= 0; i--) {
 		outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
@@ -145,7 +171,33 @@ void tulip_mdio_write(struct net_device 
 		spin_unlock_irqrestore(&tp->mii_lock, flags);
 		return;
 	}
+	/* For ULi M5263 MII write *///add by clearzhang 2004/11/22
+	if((tp->chip_id == ULi526X) && (tp->revision >= 0x40))
+	{
+
+		int valule=0;
+		int i = 1000;
+		//printk("write use cr10\n");
+		
+		valule = inl(ioaddr + CSR9);
+		//printk("csr9value=0x%x\n", valule);
+		outl((valule & 0xffefffff), ioaddr + CSR9);
+		
+		valule = (phy_id<<21) + (location<<16) + 0x4000000 + (val & 0xffff);
+		//printk("csr10value=0x%x\n", valule);
+		
+		outl((phy_id<<21) + (location<<16) + 0x4000000 + (val & 0xffff), ioaddr + CSR10);
 
+		while (--i > 0) {
+			barrier();
+			if ( inl(ioaddr + CSR10) & 0x10000000)  
+				break;
+
+		}
+
+		spin_unlock_irqrestore(&tp->mii_lock, flags);
+		return;
+	}
 	/* Establish sync by sending 32 logic ones. */
 	for (i = 32; i >= 0; i--) {
 		outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
diff -uprN linux-2.4.28-vanilla/drivers/net/tulip/timer.c linux-2.4.28/drivers/net/tulip/timer.c
--- linux-2.4.28-vanilla/drivers/net/tulip/timer.c	2004-08-08 07:26:05.000000000 +0800
+++ linux-2.4.28/drivers/net/tulip/timer.c	2004-11-22 14:35:34.000000000 +0800
@@ -92,6 +92,7 @@ void tulip_timer(unsigned long data)
 	case MX98713:
 	case COMPEX9881:
 	case DM910X:
+	case ULi526X://add by clear 2004/11/22
 	default: {
 		struct medialeaf *mleaf;
 		unsigned char *p;
diff -uprN linux-2.4.28-vanilla/drivers/net/tulip/tulip_core.c linux-2.4.28/drivers/net/tulip/tulip_core.c
--- linux-2.4.28-vanilla/drivers/net/tulip/tulip_core.c	2004-08-08 07:26:05.000000000 +0800
+++ linux-2.4.28/drivers/net/tulip/tulip_core.c	2004-11-22 14:35:35.000000000 +0800
@@ -195,6 +195,10 @@ struct tulip_chip_table tulip_tbl[] = {
   /* CONEXANT */
   {	"Conexant LANfinity", 256, 0x0001ebef,
 	HAS_MII, tulip_timer },
+  /* ULi526X *///add by clear 2004/11/22
+  { "ULi M5261/M5263", 128, 0x0001ebef,
+	HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM | HAS_ACPI,
+	tulip_timer },
 };
 
 
@@ -233,7 +237,8 @@ static struct pci_device_id tulip_pci_tb
 	{ 0x1737, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
 	{ 0x17B3, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
 	{ 0x14f1, 0x1803, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CONEXANT },
-	{ 0x10b9, 0x5261, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DM910X },	/* ALi 1563 integrated ethernet */
+	{ 0x10b9, 0x5261, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULi526X },	/* ULi 1563 integrated ethernet */
+	{ 0x10b9, 0x5263, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULi526X },	/* ULi 1689,1573 integrated ethernet */
 	{ 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },	/* 3Com 3CSOHO100B-TX */
 	{ } /* terminate list */
 };
@@ -586,7 +591,7 @@ static void tulip_tx_timeout(struct net_
 		}
 	} else if (tp->chip_id == DC21140 || tp->chip_id == DC21142
 			   || tp->chip_id == MX98713 || tp->chip_id == COMPEX9881
-			   || tp->chip_id == DM910X) {
+			   || tp->chip_id == DM910X || tp->chip_id == ULi526X) {
 		printk(KERN_WARNING "%s: 21140 transmit timed out, status %8.8x, "
 			   "SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n",
 			   dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR12),
@@ -1409,13 +1414,13 @@ static int __devinit tulip_init_one (str
 
 	/* DM9102A has troubles with MRM & clear reserved bits 24:22, 20, 16, 7:1 */
 	if ((pdev->vendor == 0x1282 && pdev->device == 0x9102)
-		|| (pdev->vendor == 0x10b9 && pdev->device == 0x5261))
+		|| (pdev->vendor == 0x10b9 && (pdev->device == 0x5261 || pdev->device == 0x5263)))
 		csr0 &= ~0x01f100ff;
 
 #if defined(__sparc__)
         /* DM9102A needs 32-dword alignment/burst length on sparc - chip bug? */
 	if ((pdev->vendor == 0x1282 && pdev->device == 0x9102)
-		|| (pdev->vendor == 0x10b9 && pdev->device == 0x5261))
+		|| (pdev->vendor == 0x10b9 && (pdev->device == 0x5261 || pdev->device == 0x5263)))
                 csr0 = (csr0 & ~0xff00) | 0xe000;
 #endif
 
@@ -1771,6 +1776,7 @@ static int __devinit tulip_init_one (str
 		break;
 	case DC21140:
 	case DM910X:
+	case ULi526X:
 	default:
 		if (tp->mtable)
 			outl(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
diff -uprN linux-2.4.28-vanilla/drivers/net/tulip/tulip.h linux-2.4.28/drivers/net/tulip/tulip.h
--- linux-2.4.28-vanilla/drivers/net/tulip/tulip.h	2002-11-29 07:53:14.000000000 +0800
+++ linux-2.4.28/drivers/net/tulip/tulip.h	2004-11-22 14:35:41.000000000 +0800
@@ -86,6 +86,7 @@ enum chips {
 	I21145,
 	DM910X,
 	CONEXANT,
+	ULi526X,
 };
 
 
@@ -492,8 +493,12 @@ static inline void tulip_stop_rxtx(struc
 
 static inline void tulip_restart_rxtx(struct tulip_private *tp)
 {
-	tulip_stop_rxtx(tp);
-	udelay(5);
+	// modify by clear 2004/11/22
+	if(!(tp->chip_id == ULi526X && (tp->revision==0x40 || tp->revision==0x50)))
+	{
+		tulip_stop_rxtx(tp);
+		udelay(5);
+	}
 	tulip_start_rxtx(tp);
 }