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

2005-01-27 Thread Clear . Zhang
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)

2005-01-27 Thread Clear . Zhang
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