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); }