[patch] net/tulip: Modify a bug for ULi M526X(kernel 2.6.10)
Hi, Jeff There is a bug about ULi M526X. It cannot deal with the dummy descriptor. For example: Des0:0x8000 Des1:0 Des2:0 Des3:pointer to next descriptor This patch is applied to kernel 2.6.10. Please apply to new kernels. Thanks a lot. Signed-off-by: Clear Zhang <[EMAIL PROTECTED]> BRs, Clear diff -uprN linux-2.6.10-vanilla/drivers/net/tulip/media.c linux-2.6.10/drivers/net/tulip/media.c --- linux-2.6.10-vanilla/drivers/net/tulip/media.c2004-12-25 05:34:27.0 +0800 +++ linux-2.6.10/drivers/net/tulip/media.c 2005-01-28 10:57:13.0 +0800 @@ -81,6 +81,25 @@ int tulip_mdio_read(struct net_device *d return retval & 0x; } + if(tp->chip_id == ULI526X && tp->revision >= 0x40) { + int value; + int i = 1000; + + value = ioread32(ioaddr + CSR9); + iowrite32(value & 0xFFEF, ioaddr + CSR9); + + value = (phy_id << 21) | (location << 16) | 0x800; + iowrite32(value, ioaddr + CSR10); + + while(--i > 0) { + mdio_delay(); + if(ioread32(ioaddr + CSR10) & 0x1000) + break; + } + retval = ioread32(ioaddr + CSR10); + spin_unlock_irqrestore(>mii_lock, flags); + return retval & 0x; + } /* Establish sync by sending at least 32 logic ones. */ for (i = 32; i >= 0; i--) { iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); @@ -140,7 +159,24 @@ void tulip_mdio_write(struct net_device spin_unlock_irqrestore(>mii_lock, flags); return; } - + + if (tp->chip_id == ULI526X && tp->revision >= 0x40) { + int value; + int i = 1000; + + value = ioread32(ioaddr + CSR9); + iowrite32(value & 0xFFEF, ioaddr + CSR9); + + value = (phy_id << 21) | (location << 16) | 0x400 | (val & 0x); + iowrite32(value, ioaddr + CSR10); + + while(--i > 0) { + if (ioread32(ioaddr + CSR10) & 0x1000) + break; + } + spin_unlock_irqrestore(>mii_lock, flags); + } + /* Establish sync by sending 32 logic ones. */ for (i = 32; i >= 0; i--) { iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); diff -uprN linux-2.6.10-vanilla/drivers/net/tulip/timer.c linux-2.6.10/drivers/net/tulip/timer.c --- linux-2.6.10-vanilla/drivers/net/tulip/timer.c2004-12-25 05:33:47.0 +0800 +++ linux-2.6.10/drivers/net/tulip/timer.c 2005-01-28 10:57:14.0 +0800 @@ -39,6 +39,7 @@ void tulip_timer(unsigned long data) case MX98713: case COMPEX9881: case DM910X: + case ULI526X: default: { struct medialeaf *mleaf; unsigned char *p; diff -uprN linux-2.6.10-vanilla/drivers/net/tulip/tulip_core.c linux-2.6.10/drivers/net/tulip/tulip_core.c --- linux-2.6.10-vanilla/drivers/net/tulip/tulip_core.c 2004-12-25 05:34:58.0 +0800 +++ linux-2.6.10/drivers/net/tulip/tulip_core.c 2005-01-28 10:57:14.0 +0800 @@ -197,6 +197,10 @@ struct tulip_chip_table tulip_tbl[] = { /* RS7112 */ { "Conexant LANfinity", 256, 0x0001ebef, HAS_MII | HAS_ACPI, tulip_timer }, + + /* ULi526X */ + { "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, 0xAB09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x1737, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x17B3, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, - { 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 }, /* ALi 1563 integrated ethernet */ + { 0x10b9, 0x5263, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULI526X }, /* ALi 1563 integrated ethernet */ { 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* 3Com 3CSOHO100B-TX */ { } /* terminate list */ }; @@ -514,7 +519,7 @@ static void tulip_tx_timeout(struct net_ dev->name); } 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, ioread32(ioaddr + CSR5), ioread32(ioaddr + CSR12), @@ -1094,6 +1099,8 @@ static void set_rx_mode(struct net_devic entry = tp->cur_tx++ % TX_RING_SIZE; +
[patch] net/tulip: Modify a bug for ULi M526X(kernel 2.6.10)
Hi, Jeff There is a bug about ULi M526X. It cannot deal with the dummy descriptor. For example: Des0:0x8000 Des1:0 Des2:0 Des3:pointer to next descriptor This patch is applied to kernel 2.6.10. Please apply to new kernels. Thanks a lot. Signed-off-by: Clear Zhang [EMAIL PROTECTED] BRs, Clear diff -uprN linux-2.6.10-vanilla/drivers/net/tulip/media.c linux-2.6.10/drivers/net/tulip/media.c --- linux-2.6.10-vanilla/drivers/net/tulip/media.c2004-12-25 05:34:27.0 +0800 +++ linux-2.6.10/drivers/net/tulip/media.c 2005-01-28 10:57:13.0 +0800 @@ -81,6 +81,25 @@ int tulip_mdio_read(struct net_device *d return retval 0x; } + if(tp-chip_id == ULI526X tp-revision = 0x40) { + int value; + int i = 1000; + + value = ioread32(ioaddr + CSR9); + iowrite32(value 0xFFEF, ioaddr + CSR9); + + value = (phy_id 21) | (location 16) | 0x800; + iowrite32(value, ioaddr + CSR10); + + while(--i 0) { + mdio_delay(); + if(ioread32(ioaddr + CSR10) 0x1000) + break; + } + retval = ioread32(ioaddr + CSR10); + spin_unlock_irqrestore(tp-mii_lock, flags); + return retval 0x; + } /* Establish sync by sending at least 32 logic ones. */ for (i = 32; i = 0; i--) { iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); @@ -140,7 +159,24 @@ void tulip_mdio_write(struct net_device spin_unlock_irqrestore(tp-mii_lock, flags); return; } - + + if (tp-chip_id == ULI526X tp-revision = 0x40) { + int value; + int i = 1000; + + value = ioread32(ioaddr + CSR9); + iowrite32(value 0xFFEF, ioaddr + CSR9); + + value = (phy_id 21) | (location 16) | 0x400 | (val 0x); + iowrite32(value, ioaddr + CSR10); + + while(--i 0) { + if (ioread32(ioaddr + CSR10) 0x1000) + break; + } + spin_unlock_irqrestore(tp-mii_lock, flags); + } + /* Establish sync by sending 32 logic ones. */ for (i = 32; i = 0; i--) { iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); diff -uprN linux-2.6.10-vanilla/drivers/net/tulip/timer.c linux-2.6.10/drivers/net/tulip/timer.c --- linux-2.6.10-vanilla/drivers/net/tulip/timer.c2004-12-25 05:33:47.0 +0800 +++ linux-2.6.10/drivers/net/tulip/timer.c 2005-01-28 10:57:14.0 +0800 @@ -39,6 +39,7 @@ void tulip_timer(unsigned long data) case MX98713: case COMPEX9881: case DM910X: + case ULI526X: default: { struct medialeaf *mleaf; unsigned char *p; diff -uprN linux-2.6.10-vanilla/drivers/net/tulip/tulip_core.c linux-2.6.10/drivers/net/tulip/tulip_core.c --- linux-2.6.10-vanilla/drivers/net/tulip/tulip_core.c 2004-12-25 05:34:58.0 +0800 +++ linux-2.6.10/drivers/net/tulip/tulip_core.c 2005-01-28 10:57:14.0 +0800 @@ -197,6 +197,10 @@ struct tulip_chip_table tulip_tbl[] = { /* RS7112 */ { Conexant LANfinity, 256, 0x0001ebef, HAS_MII | HAS_ACPI, tulip_timer }, + + /* ULi526X */ + { 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, 0xAB09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x1737, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x17B3, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, - { 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 }, /* ALi 1563 integrated ethernet */ + { 0x10b9, 0x5263, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULI526X }, /* ALi 1563 integrated ethernet */ { 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* 3Com 3CSOHO100B-TX */ { } /* terminate list */ }; @@ -514,7 +519,7 @@ static void tulip_tx_timeout(struct net_ dev-name); } 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, ioread32(ioaddr + CSR5), ioread32(ioaddr + CSR12), @@ -1094,6 +1099,8 @@ static void set_rx_mode(struct net_devic entry = tp-cur_tx++ % TX_RING_SIZE; + if( !(tp-chip_id==ULI526X (tp-revision == 0x40 || tp-revision == 0x50)) ) + { if (entry != 0) { /* Avoid a chip errata by prefixing a dummy entry