All of lore.kernel.org
 help / color / mirror / Atom feed
From: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
To: Nick Warne <nick@linicks.net>
Cc: mihamina.rakotomandimby@etu.univ-orleans.fr,
	linux-kernel@vger.kernel.org
Subject: Re: RTL8139, the final patch ?
Date: Sun, 21 Aug 2005 09:24:04 +0900	[thread overview]
Message-ID: <87pss8cf2z.fsf@devron.myhome.or.jp> (raw)
In-Reply-To: <200508202317.46937.nick@linicks.net> (Nick Warne's message of "Sat, 20 Aug 2005 23:17:46 +0100")

[-- Attachment #1: Type: text/plain, Size: 1398 bytes --]

Nick Warne <nick@linicks.net> writes:

> On Saturday 20 August 2005 21:53, you wrote:
>> I have a problem with it:
>> It's about patching, reverting, patching, reverting,...
>> I got lost. That's why I asked for a... "straighter" one :-)
>
>>> But I looked at what he said and found the real problem on my system (after 
>>> all that):
>>> http://www.ussg.iu.edu/hypermail/linux/kernel/0403.1/1537.html
>
>> It's about a configuration option in the kernel?
>> The patch is about adding the option, if i'm right.
>
> No, what happened was on 2.6.2 all was well.  When 2.6.3 came out I got these 
> timeout errors on the NIC's - but using the 2.6.2 8139too.c file in 2.6.3 
> worked.  Mr Hirofumi then took up the challenge and sent me patches.  Slowly 
> he resolved the issue, but the conclusion was it wasn't the code causing it.
>
> It was an option in my BIOS PCI level/edge settings as I posted.  People on 
> laptops get this error, like you, but there is no BIOS option as such... :-/

Yes. Thanks Nick.

Rakotomandimby, can you try attached patch?

It would solve the problem, if the cause is level/edge trigger.
(Actually, patch is just hideing the problem.)

And please send dmesg, lspci -vvvxxx, cat /proc/interrupts, 8259A.pl, mptable.
In some cases, we may be able to add workaround. But we need to find
the cause of problem before it.
-- 
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 8139too-napi-revert.patch --]
[-- Type: text/x-patch, Size: 4325 bytes --]


Disable 8139too NAPI for testing the Leval-Edge trigger problem

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---

 drivers/net/8139too.c |   37 ++++++++++++++++++++++++++++++-------
 1 files changed, 30 insertions(+), 7 deletions(-)

diff -puN drivers/net/8139too.c~8139too-napi-revert drivers/net/8139too.c
--- linux-2.6.13-rc6/drivers/net/8139too.c~8139too-napi-revert	2005-08-16 03:42:13.000000000 +0900
+++ linux-2.6.13-rc6-hirofumi/drivers/net/8139too.c	2005-08-16 03:52:15.000000000 +0900
@@ -112,7 +112,7 @@
 #include <asm/uaccess.h>
 #include <asm/irq.h>
 
-#define RTL8139_DRIVER_NAME   DRV_NAME " Fast Ethernet driver " DRV_VERSION
+#define RTL8139_DRIVER_NAME   DRV_NAME " Fast Ethernet driver (Disable NAPI) " DRV_VERSION
 #define PFX DRV_NAME ": "
 
 /* Default Message level */
@@ -120,6 +120,7 @@
                                  NETIF_MSG_PROBE  | \
                                  NETIF_MSG_LINK)
 
+//#define ENABLE_NAPI
 
 /* enable PIO instead of MMIO, if CONFIG_8139TOO_PIO is selected */
 #ifdef CONFIG_8139TOO_PIO
@@ -624,7 +625,9 @@ static void rtl8139_tx_timeout (struct n
 static void rtl8139_init_ring (struct net_device *dev);
 static int rtl8139_start_xmit (struct sk_buff *skb,
 			       struct net_device *dev);
+#ifdef ENABLE_NAPI
 static int rtl8139_poll(struct net_device *dev, int *budget);
+#endif
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void rtl8139_poll_controller(struct net_device *dev);
 #endif
@@ -974,8 +977,10 @@ static int __devinit rtl8139_init_one (s
 	/* The Rtl8139-specific entries in the device structure. */
 	dev->open = rtl8139_open;
 	dev->hard_start_xmit = rtl8139_start_xmit;
+#ifdef ENABLE_NAPI
 	dev->poll = rtl8139_poll;
 	dev->weight = 64;
+#endif
 	dev->stop = rtl8139_close;
 	dev->get_stats = rtl8139_get_stats;
 	dev->set_multicast_list = rtl8139_set_rx_mode;
@@ -2024,8 +2029,11 @@ no_early_rx:
 			dev->last_rx = jiffies;
 			tp->stats.rx_bytes += pkt_size;
 			tp->stats.rx_packets++;
-
+#ifdef ENABLE_NAPI
 			netif_receive_skb (skb);
+#else
+			netif_rx (skb);
+#endif
 		} else {
 			if (net_ratelimit()) 
 				printk (KERN_WARNING
@@ -2103,7 +2111,7 @@ static void rtl8139_weird_interrupt (str
 			dev->name, pci_cmd_status);
 	}
 }
-
+#ifdef ENABLE_NAPI
 static int rtl8139_poll(struct net_device *dev, int *budget)
 {
 	struct rtl8139_private *tp = netdev_priv(dev);
@@ -2137,7 +2145,7 @@ static int rtl8139_poll(struct net_devic
 
 	return !done;
 }
-
+#endif /* !ENABLE_NAPI */
 /* The interrupt handler does all of the Rx thread work and cleans up
    after the Tx thread. */
 static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance,
@@ -2149,8 +2157,14 @@ static irqreturn_t rtl8139_interrupt (in
 	u16 status, ackstat;
 	int link_changed = 0; /* avoid bogus "uninit" warning */
 	int handled = 0;
+#ifndef ENABLE_NAPI
+	int boguscnt = 20;
+#endif
 
 	spin_lock (&tp->lock);
+#ifndef ENABLE_NAPI
+retry:
+#endif
 	status = RTL_R16 (IntrStatus);
 
 	/* shared irq? */
@@ -2162,13 +2176,13 @@ static irqreturn_t rtl8139_interrupt (in
 	/* h/w no longer present (hotplug?) or major error, bail */
 	if (unlikely(status == 0xFFFF)) 
 		goto out;
-
+#ifdef ENABLE_NAPI
 	/* close possible race's with dev_close */
 	if (unlikely(!netif_running(dev))) {
 		RTL_W16 (IntrMask, 0);
 		goto out;
 	}
-
+#endif
 	/* Acknowledge all of the current interrupt sources ASAP, but
 	   an first get an additional status bit from CSCR. */
 	if (unlikely(status & RxUnderrun))
@@ -2178,6 +2192,7 @@ static irqreturn_t rtl8139_interrupt (in
 	if (ackstat)
 		RTL_W16 (IntrStatus, ackstat);
 
+#ifdef ENABLE_NAPI
 	/* Receive packets are processed by poll routine.
 	   If not running start it now. */
 	if (status & RxAckBits){
@@ -2186,7 +2201,10 @@ static irqreturn_t rtl8139_interrupt (in
 			__netif_rx_schedule (dev);
 		}
 	}
-
+#else
+	if (netif_running(dev) && (status & RxAckBits))
+		rtl8139_rx (dev, tp, INT_MAX);
+#endif
 	/* Check uncommon events with one test. */
 	if (unlikely(status & (PCIErr | PCSTimeout | RxUnderrun | RxErr)))
 		rtl8139_weird_interrupt (dev, tp, ioaddr,
@@ -2197,6 +2215,11 @@ static irqreturn_t rtl8139_interrupt (in
 		if (status & TxErr)
 			RTL_W16 (IntrStatus, TxErr);
 	}
+#ifndef ENABLE_NAPI
+	boguscnt--;
+	if (boguscnt > 0)
+		goto retry;
+#endif
  out:
 	spin_unlock (&tp->lock);
 
_

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 8259A.pl --]
[-- Type: text/x-perl, Size: 1191 bytes --]

#!/usr/bin/perl
#
# 8259A
#

use strict;
use warnings;

use Getopt::Std;

sub outb
{
    my $data = shift;
    my $port = shift;

    open(IO, "> /dev/port") || die "open /dev/port: $!\n";
    sysseek(IO, $port, 0) || die;
    my $x = pack("C", $data);
    syswrite(IO, $x, 1);
    close(IO);
}

sub inb
{
    my $port = shift;
    my $data;

    open(IO, "/dev/port") || die "open /dev/port: $!\n";
    sysseek(IO, $port, 0) || die;
    sysread(IO, $data, 1);
    close(IO);

    return unpack("C", $data);
}

sub set_edge_level
{
    my $irq = shift;
    my $to = shift;
    my $mask = 1 << ($irq & 7);
    my $port = 0x4d0 + ($irq >> 3);
    my $val = inb($port);

    if ($to eq "edge") {
	outb($val & ~$mask, $port);
    } else {
	outb($val | $mask, $port);
    }
    print "irq $irq: -> $to\n";
}

our($opt_e, $opt_l);
getopts('e:l:');

if ($opt_e and ($opt_e < 15)) {
    set_edge_level($opt_e, "edge");
} elsif ($opt_l and ($opt_l < 15)) {
    set_edge_level($opt_l, "level");
}

foreach my $irq (0..15) {
    my $mask = 1 << ($irq & 7);
    my $port = 0x4d0 + ($irq >> 3);
    my $val = inb($port);

    printf "irq %d: %02x, %s\n", $irq, $val, ($val & $mask) ? "level" : "edge";
}

  reply	other threads:[~2005-08-21  0:24 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-20 20:53 RTL8139, the final patch ? Nick Warne
2005-08-20 22:04 ` Rakotomandimby Mihamina
2005-08-20 22:17 ` Nick Warne
2005-08-21  0:24   ` OGAWA Hirofumi [this message]
2005-09-14 17:16     ` Rakotomandimby Mihamina
2005-09-15 15:21       ` OGAWA Hirofumi
  -- strict thread matches above, loose matches on Subject: below --
2005-08-20 18:38 Rakotomandimby Mihamina

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87pss8cf2z.fsf@devron.myhome.or.jp \
    --to=hirofumi@mail.parknet.co.jp \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mihamina.rakotomandimby@etu.univ-orleans.fr \
    --cc=nick@linicks.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.