linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Fix kernel lockup in RTL-8169 gigabit ethernet driver
@ 2004-04-03  5:02 Adam Nielsen
  2004-04-03  9:27 ` Francois Romieu
  0 siblings, 1 reply; 13+ messages in thread
From: Adam Nielsen @ 2004-04-03  5:02 UTC (permalink / raw)
  To: linux-kernel; +Cc: Linus Torvalds

Hi everyone,

This is a tiny patch that fixes a particularly annoying bug
in the Realtek 8169 gigabit ethernet driver.  Due to a logic error,
there is a loop in an interrupt handler that often goes infinite, thus
locking up the entire computer.  The attached patch fixes the problem.

I have patched against linux-2.6.5-rc2-bk6, however the source file in
question hasn't been modified for a long time, so the patch should apply
cleanly to any recent kernel version.

Cheers,
Adam.

--- linux-2.6.5-rc2-bk6/drivers/net/r8169.c	2004-03-27 17:38:03.000000000 +1000
+++ linux-2.6.5-rc2-bk6a/drivers/net/r8169.c	2004-03-31 18:45:10.000000000 +1000
@@ -33,6 +33,12 @@
 	- Copy mc_filter setup code from 8139cp
 	  (includes an optimization, and avoids set_bit use)
 
+VERSION 1.2a <2004/03/31> Adam Nielsen (a.nielsen@optushome.com.au)
+
+	"else break;" added to the if-statement in rtl8169_tx_interrupt() to prevent
+	an infinite loop and the resulting kernel lockup when the interrupt is called
+	with a dirty buffer (perhaps when there's nothing to transmit?)
+
 */
 
 #include <linux/module.h>
@@ -892,7 +898,7 @@
 			tp->Tx_skbuff[entry] = NULL;
 			dirty_tx++;
 			tx_left--;
-		}
+		} else break;
 	}
 
 	if (tp->dirty_tx != dirty_tx) {

^ permalink raw reply	[flat|nested] 13+ messages in thread
* Re: [PATCH] Fix kernel lockup in RTL-8169 gigabit ethernet driver
@ 2004-04-03 11:30 Manfred Spraul
  2004-04-03 12:45 ` Francois Romieu
  2004-04-04  0:55 ` Malvineous
  0 siblings, 2 replies; 13+ messages in thread
From: Manfred Spraul @ 2004-04-03 11:30 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel, Adam Nielsen

Andrew wrote:

>The logic is faulty, or at least very odd.
>
>	tx_left = tp->cur_tx - dirty_tx;
>
>	while (tx_left > 0) {
>		int entry = dirty_tx % NUM_TX_DESC;
>
>		if (!(le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit)) {
>			...
>		}
>	}
>
>Why is that `if' test there at all?  If it ever returns false, the box
>locks up.  A BUG_ON(le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit)
>might make more sense.
>  
>
tx_left counts packets submitted by hard_xmit_start to the hardware. 
Initially OWNbit is set, the packet is owned by the nic. The OWNbit is 
cleared by the hardware after the packet was sent. A packet with OWNbit 
set means that the nic didn't send it yet to the wire. I think the "else 
break;" patch is correct, but someone with docs should confirm that.

Adam: did you see deadlocks that disappeared after applying your patch? 
It shouldn't deadlock - it should loop until the nic sends the packet to 
the wire. It might take a few msecs, but then it should continue. 
Perhaps gcc optimized away the reload from memory and loops on a 
register. Or there is another bug that is hidden by your patch.

--
    Manfred


^ permalink raw reply	[flat|nested] 13+ messages in thread
* Re: [PATCH] Fix kernel lockup in RTL-8169 gigabit ethernet driver
@ 2004-04-05 23:08 Dieter Nützel
  2004-04-06  7:47 ` Francois Romieu
  0 siblings, 1 reply; 13+ messages in thread
From: Dieter Nützel @ 2004-04-05 23:08 UTC (permalink / raw)
  To: Linux-Kernel List
  Cc: Francois Romieu, Andrew Morton, Manfred Spraul, netdev, jgarzik

Francois Romieu <romieu@fr.zoreil.com> wrote:
> Manfred Spraul <manfred@colorfullife.com> :
> [...]
> > tx_left counts packets submitted by hard_xmit_start to the hardware. 
> > Initially OWNbit is set, the packet is owned by the nic. The OWNbit is 
> > cleared by the hardware after the packet was sent. A packet with OWNbit 
> > set means that the nic didn't send it yet to the wire. I think the "else 
> > break;" patch is correct, but someone with docs should confirm that.
> 
> Realtek Gigabit Ethernet Media Access Controller with power management R8169
> Rev.1.21, p.54
> [...]
> Ownership: This bit, when set, indicates that the descriptor is owned by
> the NIC. When cleared, it indicates that the descriptor is owned by the host
> system. NIC clears this bit when the relative buffer data is already
> transmitted. In this case, OWN=0.
> 
> [...]
> > Perhaps gcc optimized away the reload from memory and loops on a 
> 
> Point taken.

Isn't the "current" RTL8169s (32/64) driver much outdated?

I got a version # 1.6 with all my cards.
Anyone what a copy?

/*
=========================================================================
 r8169.c: A RealTek RTL8169s/8110s Gigabit Ethernet driver for Linux kernel 
2.4.x.
 --------------------------------------------------------------------

 History:
 Feb  4 2002	- created initially by ShuChen <shuchen@realtek.com.tw>.
 May 20 2002	- Add link status force-mode and TBI mode support.
=========================================================================
  1. The media can be forced in 5 modes.
	 Command: 'insmod r8169 media = SET_MEDIA'
	 Ex:	  'insmod r8169 media = 0x04' will force PHY to operate in 100Mpbs 
Half-duplex.

	 SET_MEDIA can be:
 		_10_Half	= 0x01
 		_10_Full	= 0x02
 		_100_Half	= 0x04
 		_100_Full	= 0x08
 		_1000_Full	= 0x10

  2. Support TBI mode.
//=========================================================================
RTL8169_VERSION "1.1"	<2002/10/4>

	The bit4:0 of MII register 4 is called "selector field", and have to be
	00001b to indicate support of IEEE std 802.3 during NWay process of
	exchanging Link Code Word (FLP).

RTL8169_VERSION "1.2"	<2003/6/17>
	Update driver module name.
	Modify ISR.
        Add chip mac_version.

RTL8169_VERSION "1.3"	<2003/6/20>
        Add chip phy_version.
	Add priv->phy_timer_t, rtl8169_phy_timer_t_handler()
	Add rtl8169_hw_PHY_config()
	Add rtl8169_hw_PHY_reset()

RTL8169_VERSION "1.4"	<2003/7/14>
	Add tx_bytes, rx_bytes.

RTL8169_VERSION "1.5"	<2003/7/18>
	Set 0x0000 to PHY at offset 0x0b.
	Modify chip mac_version, phy_version
	Force media for multiple card.
RTL8169_VERSION "1.6"	<2003/8/25>
	Modify receive data buffer.
*/

Greetings,
	Dieter


-- 
Dieter Nützel
@home: <Dieter.Nuetzel () hamburg ! de>

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2004-04-06 20:53 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-04-03  5:02 [PATCH] Fix kernel lockup in RTL-8169 gigabit ethernet driver Adam Nielsen
2004-04-03  9:27 ` Francois Romieu
2004-04-03 10:07   ` Andrew Morton
2004-04-03 12:13     ` Francois Romieu
2004-04-03 11:30 Manfred Spraul
2004-04-03 12:45 ` Francois Romieu
2004-04-04  0:55 ` Malvineous
2004-04-04  9:15   ` Francois Romieu
2004-04-05 21:51     ` Adam Nielsen
2004-04-06 17:11       ` Manfred Spraul
2004-04-06 20:50         ` Francois Romieu
2004-04-05 23:08 Dieter Nützel
2004-04-06  7:47 ` Francois Romieu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).