On Fri, Jul 28, 2006 at 12:11:09PM +0200, Lennert Buytenhek wrote:

> We're currently working on getting the Thecus n2100 supported in 2.6.
> 
>       http://www.thecus.com/products_over.php?cid=1&pid=1
> 
> Amongst other nice goodies, it has two on-board RTL8110SB gigabit
> controllers.  The realtek-supplied 'r1000' driver kind of sort of works,
> if you don't mind the machine hanging or crashing if you unplug the cable
> at the wrong moment.
> 
> The in-kernel 'r8169' drivers in 2.6.17 and 2.6.18-rc2 appear to work
> initially, but they don't actually seem to transmit any packets on the
> wire, nor do they receive any.

The hack patch below makes it work.  There's two issues here:

1. Writing zero to the upper part of the TxDescStartAddr register (via
   the MMIO region) somehow also clears the lower part, and writing the
   upper and lower halves the other way round fixes it.  The RxDescAddr
   register doesn't seem to suffer from this problem.

   The Realtek r1000 driver writes the two halves in the same order as
   r8169, but it doesn't happen there, which is a bit of a mystery to
   me.

2. SYSErr asserts pretty soon after upping eth0, and the PCI status
   register reports a parity error when this happens.  In this case,
   the restart logic seems to make things worse, and in fact, when
   commenting it out, things work a lot better.

Have you ever seen these issues before?  Any suggestions on how to
cleanly fix these issues?


cheers,
Lennert


Signed-off-by: Lennert Buytenhek <[EMAIL PROTECTED]>

Index: linux-2.6.18-rc2/drivers/net/r8169.c
===================================================================
--- linux-2.6.18-rc2.orig/drivers/net/r8169.c
+++ linux-2.6.18-rc2/drivers/net/r8169.c
@@ -484,7 +488,7 @@ static int rtl8169_poll(struct net_devic
 #endif
 
 static const u16 rtl8169_intr_mask =
-       SYSErr | LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | 
RxOK;
+       LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK;
 static const u16 rtl8169_napi_event =
        RxOK | RxOverflow | RxFIFOOver | TxOK | TxErr;
 static const unsigned int rtl8169_rx_config =
@@ -1825,8 +1829,8 @@ rtl8169_hw_start(struct net_device *dev)
         */
        RTL_W16(IntrMitigate, 0x0000);
 
-       RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_32BIT_MASK));
        RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr >> 32));
+       RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_32BIT_MASK));
        RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr & DMA_32BIT_MASK));
        RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr >> 32));
        RTL_W8(Cfg9346, Cfg9346_Lock);
@@ -2527,10 +2531,12 @@ rtl8169_interrupt(int irq, void *dev_ins
                if (!(status & rtl8169_intr_mask))
                        break;
 
+#if 0
                if (unlikely(status & SYSErr)) {
                        rtl8169_pcierr_interrupt(dev);
                        break;
                }
+#endif
 
                if (status & LinkChg)
                        rtl8169_check_link_status(dev, tp, ioaddr);
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to