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 <[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.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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to