[patch] net/tulip: Modify a bug for ULi M526X(kernel 2.6.10)

From: Clear . Zhang
Date: Thu Jan 27 2005 - 22:39:14 EST


Hi, Jeff

There is a bug about ULi M526X. It cannot deal with the dummy descriptor.

For example:
Des0:0x80000000
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 <Clear.Zhang@xxxxxxxxxx>


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.c 2004-12-25
05:34:27.000000000 +0800
+++ linux-2.6.10/drivers/net/tulip/media.c 2005-01-28
10:57:13.000000000 +0800
@@ -81,6 +81,25 @@ int tulip_mdio_read(struct net_device *d
return retval & 0xffff;
}

+ if(tp->chip_id == ULI526X && tp->revision >= 0x40) {
+ int value;
+ int i = 1000;
+
+ value = ioread32(ioaddr + CSR9);
+ iowrite32(value & 0xFFEFFFFF, ioaddr + CSR9);
+
+ value = (phy_id << 21) | (location << 16) | 0x8000000;
+ iowrite32(value, ioaddr + CSR10);
+
+ while(--i > 0) {
+ mdio_delay();
+ if(ioread32(ioaddr + CSR10) & 0x10000000)
+ break;
+ }
+ retval = ioread32(ioaddr + CSR10);
+ 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--) {
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 & 0xFFEFFFFF, ioaddr + CSR9);
+
+ value = (phy_id << 21) | (location << 16) | 0x4000000 | (val &
0xFFFF);
+ iowrite32(value, ioaddr + CSR10);
+
+ while(--i > 0) {
+ if (ioread32(ioaddr + CSR10) & 0x10000000)
+ 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.c 2004-12-25
05:33:47.000000000 +0800
+++ linux-2.6.10/drivers/net/tulip/timer.c 2005-01-28
10:57:14.000000000 +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.000000000 +0800
+++ linux-2.6.10/drivers/net/tulip/tulip_core.c 2005-01-28
10:57:14.000000000 +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.
*/
tp->tx_buffers[entry].skb = NULL;
@@ -1105,6 +1112,7 @@ static void set_rx_mode(struct net_devic
dummy = entry;
entry = tp->cur_tx++ % TX_RING_SIZE;
}
+ }

tp->tx_buffers[entry].skb = NULL;
tp->tx_buffers[entry].mapping =
@@ -1304,13 +1312,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

@@ -1658,6 +1666,7 @@ static int __devinit tulip_init_one (str
switch (chip_idx) {
case DC21140:
case DM910X:
+ case ULI526X:
default:
if (tp->mtable)
iowrite32(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
diff -uprN linux-2.6.10-vanilla/drivers/net/tulip/tulip.h
linux-2.6.10/drivers/net/tulip/tulip.h
--- linux-2.6.10-vanilla/drivers/net/tulip/tulip.h 2004-12-25
05:35:28.000000000 +0800
+++ linux-2.6.10/drivers/net/tulip/tulip.h 2005-01-28
10:57:20.000000000 +0800
@@ -88,6 +88,7 @@ enum chips {
I21145,
DM910X,
CONEXANT,
+ ULI526X
};


@@ -481,8 +482,11 @@ static inline void tulip_stop_rxtx(struc

static inline void tulip_restart_rxtx(struct tulip_private *tp)
{
- tulip_stop_rxtx(tp);
- udelay(5);
+ if(!(tp->chip_id == ULI526X &&
+ (tp->revision == 0x40 || tp->revision == 0x50))) {
+ tulip_stop_rxtx(tp);
+ udelay(5);
+ }
tulip_start_rxtx(tp);
}



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/