Netdev List
 help / color / mirror / Atom feed
* Re: [patch 1/7] typhoon section fix
From: David Miller @ 2008-02-10  7:40 UTC (permalink / raw)
  To: akpm; +Cc: jeff, netdev, sam
In-Reply-To: <200802081120.m18BK6cL021623@imap1.linux-foundation.org>

From: akpm@linux-foundation.org
Date: Fri, 08 Feb 2008 03:11:13 -0800

> From: Andrew Morton <akpm@linux-foundation.org>
> 
> gcc-3.4.4 on powerpc:
> 
> drivers/net/typhoon.c:137: error: version causes a section type conflict
> 
> Cc: Jeff Garzik <jeff@garzik.org>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Applied.

^ permalink raw reply

* Re: [patch 2/7] natsemi section fix
From: David Miller @ 2008-02-10  7:41 UTC (permalink / raw)
  To: akpm; +Cc: jeff, netdev, sam
In-Reply-To: <200802081120.m18BK7Fh021626@imap1.linux-foundation.org>

From: akpm@linux-foundation.org
Date: Fri, 08 Feb 2008 03:11:15 -0800

> From: Andrew Morton <akpm@linux-foundation.org>
> 
> gcc-3.4.4 on powerpc:
> 
> drivers/net/natsemi.c:245: error: natsemi_pci_info causes a section type conflict
> 
> Cc: Jeff Garzik <jeff@garzik.org>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Applied.

^ permalink raw reply

* Re: [patch 5/7] via-velocity section fix
From: David Miller @ 2008-02-10  7:41 UTC (permalink / raw)
  To: akpm; +Cc: jeff, netdev, sam
In-Reply-To: <200802081120.m18BK8ac021635@imap1.linux-foundation.org>

From: akpm@linux-foundation.org
Date: Fri, 08 Feb 2008 03:11:16 -0800

> From: Andrew Morton <akpm@linux-foundation.org>
> 
> gcc-3.4.4 on powerpc:
> 
> drivers/net/via-velocity.c:443: error: chip_info_table causes a section type conflict
> 
> on this one I had to remove the __devinitdata too.  Don't know why.
> 
> Cc: Jeff Garzik <jeff@garzik.org>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Applied.

^ permalink raw reply

* Re: [patch 6/7] starfire secton fix
From: David Miller @ 2008-02-10  7:41 UTC (permalink / raw)
  To: akpm; +Cc: jeff, netdev, sam
In-Reply-To: <200802081120.m18BK8cw021639@imap1.linux-foundation.org>

From: akpm@linux-foundation.org
Date: Fri, 08 Feb 2008 03:11:16 -0800

> From: Andrew Morton <akpm@linux-foundation.org>
> 
> gcc-3.4.4 on powerpc:
> 
> drivers/net/starfire.c:219: error: version causes a section type conflict
> 
> Cc: Jeff Garzik <jeff@garzik.org>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Applied.

^ permalink raw reply

* Re: [PATCH] [IPV6] Replace using the magic constant "1024" with IP6_RT_PRIO_USER for fc_metric.
From: David Miller @ 2008-02-10  7:43 UTC (permalink / raw)
  To: ramirose; +Cc: netdev
In-Reply-To: <eb3ff54b0802080214u5c20f061of4144964c8776359@mail.gmail.com>

From: "Rami Rosen" <ramirose@gmail.com>
Date: Fri, 8 Feb 2008 12:14:18 +0200

>   This patch replaces the explicit usage of the magic constant "1024"
> with IP6_RT_PRIO_USER in the IPV6 tree.
> 
> Signed-off-by: Rami Rosen <ramirose@gmail.com>

Applied, thanks.

^ permalink raw reply

* Re: [PATCH][NET_SCHED] sch_htb: htb_requeue fix
From: David Miller @ 2008-02-10  7:44 UTC (permalink / raw)
  To: jarkao2; +Cc: netdev
In-Reply-To: <20080208085749.GA5656@ff.dom.local>

From: Jarek Poplawski <jarkao2@gmail.com>
Date: Fri, 8 Feb 2008 08:57:49 +0000

> htb_requeue() enqueues skbs for which htb_classify() returns NULL.
> This is wrong because such skbs could be handled by NET_CLS_ACT code,
> and the decision could be different than earlier in htb_enqueue().
> So htb_requeue() is changed to work and look more like htb_enqueue().
> 
> 
> Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>

Applied, thanks.

^ permalink raw reply

* [PATCH] Fix comment for skb_pull_rcsum
From: Urs Thuermann @ 2008-02-10  9:48 UTC (permalink / raw)
  To: netdev

Fix comment for skb_pull_rcsum

Signed-off-by: Urs Thuermann <urs@isnogud.escape.de>

---

Index: net-2.6/net/core/skbuff.c
===================================================================
--- net-2.6.orig/net/core/skbuff.c	2008-02-06 22:17:58.000000000 +0100
+++ net-2.6/net/core/skbuff.c	2008-02-08 11:05:00.000000000 +0100
@@ -2106,11 +2106,10 @@
 /**
  *	skb_pull_rcsum - pull skb and update receive checksum
  *	@skb: buffer to update
- *	@start: start of data before pull
  *	@len: length of data pulled
  *
  *	This function performs an skb_pull on the packet and updates
- *	update the CHECKSUM_COMPLETE checksum.  It should be used on
+ *	the CHECKSUM_COMPLETE checksum.  It should be used on
  *	receive path processing instead of skb_pull unless you know
  *	that the checksum difference is zero (e.g., a valid IP header)
  *	or you are setting ip_summed to CHECKSUM_NONE.

^ permalink raw reply

* [RFC, PATCH]: Pass link level header from/to PPP interface
From: Urs Thuermann @ 2008-02-10  9:48 UTC (permalink / raw)
  To: netdev

The PPP interface strips off the PPP header from the packet before
passing it up with netif_rx().  On the xmit path, it has to add the
PPP header itself because dev->header_ops is NULL.

This means that a PF_PACKET, SOCK_RAW socket can't get the link level
header and has to use the sll_protocol field of the sockaddr_ll to
know what type of packet is received with recvfrom(2).  I consider
this a design flaw since with most (all?) other interfaces you only
need to know the sll_hatype to know what type of packet you get.

I have patched the PPP code to include the PPP header.  I tried with
IP and IPv6 over PPP and it works as expected.  This patch, however,
changes the interface to the user space in an incompatible way.  But
IMHO we could include it, since

* PF_PACKET is Linux specific and not portable anyway.  Most apps use
  libpcap instead of opening PF_PACKET sockets themselves.

* Using strace on tcpdump, it seems that libpcap on Linux uses
  PF_PACKET/SOCK_DGRAM for PPP interfaces and thus is not affected by
  my patch.

* Other apps using PF_PACKET/SOCK_RAW can easily be changed to
  PF_PACKET/SOCK_DGRAM if they don't want to see the link level
  header.  After all, this is what SOCK_DGRAM is for.

Currently SOCK_RAW and SOCK_DGRAM are the same although the packet(7)
man page states that with SOCK_RAW packets are passed without any
changes.  This makes having SOCK_RAW besides SOCK_DGRAM useless for
PPP.

So what is your opinion about this change?


Signed-off-by: Urs Thuermann <urs@isnogud.escape.de>

---
 drivers/net/ppp_generic.c |   41 ++++++++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 13 deletions(-)

Index: net-2.6/drivers/net/ppp_generic.c
===================================================================
--- net-2.6.orig/drivers/net/ppp_generic.c	2008-02-08 11:09:03.000000000 +0100
+++ net-2.6/drivers/net/ppp_generic.c	2008-02-08 13:27:29.000000000 +0100
@@ -873,12 +873,32 @@
 /*
  * Network interface unit routines.
  */
+
+/* Put the 2-byte PPP protocol number on the front of skb */
+static int ppp_header(struct sk_buff *skb, struct net_device *dev,
+		      unsigned short type,
+		      const void *daddr, const void *saddr, unsigned len)
+{
+	unsigned char *pp;
+	int npi, proto;
+
+	npi = ethertype_to_npindex(ntohs(skb->protocol));
+	if (npi < 0)
+		return -dev->hard_header_len;
+
+	pp = skb_push(skb, 2);
+	proto = npindex_to_proto[npi];
+	pp[0] = proto >> 8;
+	pp[1] = proto;
+
+	return dev->hard_header_len;
+}
+
 static int
 ppp_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct ppp *ppp = (struct ppp *) dev->priv;
-	int npi, proto;
-	unsigned char *pp;
+	int npi;
 
 	npi = ethertype_to_npindex(ntohs(skb->protocol));
 	if (npi < 0)
@@ -897,16 +917,6 @@
 		goto outf;
 	}
 
-	/* Put the 2-byte PPP protocol number on the front,
-	   making sure there is room for the address and control fields. */
-	if (skb_cow_head(skb, PPP_HDRLEN))
-		goto outf;
-
-	pp = skb_push(skb, 2);
-	proto = npindex_to_proto[npi];
-	pp[0] = proto >> 8;
-	pp[1] = proto;
-
 	netif_stop_queue(dev);
 	skb_queue_tail(&ppp->file.xq, skb);
 	ppp_xmit_process(ppp);
@@ -969,9 +979,14 @@
 	return err;
 }
 
+static const struct header_ops ppp_header_ops ____cacheline_aligned = {
+	.create		= ppp_header,
+};
+
 static void ppp_setup(struct net_device *dev)
 {
 	dev->hard_header_len = PPP_HDRLEN;
+	dev->header_ops = &ppp_header_ops;
 	dev->mtu = PPP_MTU;
 	dev->addr_len = 0;
 	dev->tx_queue_len = 3;
@@ -1677,10 +1692,10 @@
 			kfree_skb(skb);
 		} else {
 			/* chop off protocol */
+			skb_reset_mac_header(skb);
 			skb_pull_rcsum(skb, 2);
 			skb->dev = ppp->dev;
 			skb->protocol = htons(npindex_to_ethertype[npi]);
-			skb_reset_mac_header(skb);
 			netif_rx(skb);
 			ppp->dev->last_rx = jiffies;
 		}

^ permalink raw reply

* [PATCH resend] qla3xxx: convert byte order of constant instead of variable
From: Marcin Slusarz @ 2008-02-10 10:06 UTC (permalink / raw)
  To: netdev, linux-driver; +Cc: LKML

convert byte order of constant instead of variable
which can be done at compile time (vs run time)

Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
---
 drivers/net/qla3xxx.c |    6 ++----
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c
index a6aeb9d..b7f7b22 100644
--- a/drivers/net/qla3xxx.c
+++ b/drivers/net/qla3xxx.c
@@ -2472,8 +2472,7 @@ static int ql_send_map(struct ql3_adapter *qdev,
 
 	if (seg_cnt == 1) {
 		/* Terminate the last segment. */
-		oal_entry->len =
-		    cpu_to_le32(le32_to_cpu(oal_entry->len) | OAL_LAST_ENTRY);
+		oal_entry->len |= cpu_to_le32(OAL_LAST_ENTRY);
 	} else {
 		oal = tx_cb->oal;
 		for (completed_segs=0; completed_segs<frag_cnt; completed_segs++,seg++) {
@@ -2530,8 +2529,7 @@ static int ql_send_map(struct ql3_adapter *qdev,
 					  frag->size);
 		}
 		/* Terminate the last segment. */
-		oal_entry->len =
-		    cpu_to_le32(le32_to_cpu(oal_entry->len) | OAL_LAST_ENTRY);
+		oal_entry->len |= cpu_to_le32(OAL_LAST_ENTRY);
 	}
 
 	return NETDEV_TX_OK;
-- 
1.5.3.7


^ permalink raw reply related

* Re: [RFC] ipvs: Cleanup sync daemon code
From: Sven Wegener @ 2008-02-10 11:51 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: netdev, linux-kernel
In-Reply-To: <20080210045952.GA8255@infradead.org>

On Sat, 9 Feb 2008, Christoph Hellwig wrote:

> On Sun, Feb 10, 2008 at 12:38:11AM +0100, Sven Wegener wrote:
>>  struct ip_vs_sync_thread_data {
>> -	struct completion *startup;
>> +	struct completion *startup; /* set to NULL once completed */
>
> This is not needed anmore.  kthread_run guarantees that the newly
> creates thread is run before returning to the caller.

The completion is currently used to return an error code for errors that 
happen during initialization in the threads (open socket, allocate 
memory). We could move the setup code out of the threads and have them 
only run an error-safe loop.

>> +/* wait queue for master sync daemon */
>> +static DECLARE_WAIT_QUEUE_HEAD(sync_master_wait);
>
> I don't think you need this one either.  You can use wake_up_process
> on the task_struct pointer instead.

Thanks, now using schedule_timeout with wake_up_process.

>>  	spin_lock(&ip_vs_sync_lock);
>>  	list_add_tail(&sb->list, &ip_vs_sync_queue);
>> +	if (++ip_vs_sync_count == 10)
>> +		wake_up_interruptible(&sync_master_wait);
>>  	spin_unlock(&ip_vs_sync_lock);
>>  }
>
>> -static int sync_thread(void *startup)
>> +static int sync_thread(void *data)
>
> Btw, it might make sense to remove sync_thread and just call the
> master and backup threads directly.

When the setup code has been moved out of the threads, the code gets much 
simpler.

>> +void __init ip_vs_sync_init(void)
>> +{
>> +	/* set up multicast address */
>> +	mcast_addr.sin_family = AF_INET;
>> +	mcast_addr.sin_port = htons(IP_VS_SYNC_PORT);
>> +	mcast_addr.sin_addr.s_addr = htonl(IP_VS_SYNC_GROUP);
>>  }
>
> Why can't this be initialized at compile time by:
>
> static struct sockaddr_in mcast_addr = {
> 	.sin_family		= AF_INET,
> 	.sin_port		= htons(IP_VS_SYNC_PORT),
> 	.sin_addr.s_addr	= htonl(IP_VS_SYNC_GROUP),
> }
>
> (the hton* might need __constant_hton* also I'm not sure without trying)

Thanks.

^ permalink raw reply

* [PATCH v2][AX25] af_ax25: remove sock lock in ax25_info_show()
From: Jarek Poplawski @ 2008-02-10 13:10 UTC (permalink / raw)
  To: David Miller
  Cc: Bernard Pidoux F6BVP, Ralf Baechle DL5RB, Jann Traschewski,
	netdev
In-Reply-To: <47ADF4A2.6070705@free.fr>

Hi,

Here is a little bit better version, I hope.

Regards,
Jarek P.

--------------> (take 2)

Subject: [AX25] af_ax25: remove sock lock in ax25_info_show()
 
This lockdep warning:

> =======================================================
> [ INFO: possible circular locking dependency detected ]
> 2.6.24 #3
> -------------------------------------------------------
> swapper/0 is trying to acquire lock:
>  (ax25_list_lock){-+..}, at: [<f91dd3b1>] ax25_destroy_socket+0x171/0x1f0 [ax25]
> 
> but task is already holding lock:
>  (slock-AF_AX25){-+..}, at: [<f91dbabc>] ax25_std_heartbeat_expiry+0x1c/0xe0 [ax25]
> 
> which lock already depends on the new lock.
...

shows that ax25_list_lock and slock-AF_AX25 are taken in different
order: ax25_info_show() takes slock (bh_lock_sock(ax25->sk)) while
ax25_list_lock is held, so reversely to other functions. To fix this
the sock lock should be moved to ax25_info_start(), and there would
be still problem with breaking ax25_list_lock (it seems this "proper"
order isn't optimal yet). But, since it's only for reading proc info
it seems this is not necessary (e.g.  ax25_send_to_raw() does similar
reading without this lock too).

So, this patch removes sock lock to avoid deadlock possibility; there
is also used sock_i_ino() function, which reads sk_socket under proper
read lock. Additionally printf format of this i_ino is changed to %lu.


Reported-by: Bernard Pidoux F6BVP <f6bvp@free.fr>
Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>

---

 net/ax25/af_ax25.c |    6 ++----
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
index 94b2b1b..48bfcc7 100644
--- a/net/ax25/af_ax25.c
+++ b/net/ax25/af_ax25.c
@@ -1924,12 +1924,10 @@ static int ax25_info_show(struct seq_file *seq, void *v)
 		   ax25->paclen);
 
 	if (ax25->sk != NULL) {
-		bh_lock_sock(ax25->sk);
-		seq_printf(seq," %d %d %ld\n",
+		seq_printf(seq, " %d %d %lu\n",
 			   atomic_read(&ax25->sk->sk_wmem_alloc),
 			   atomic_read(&ax25->sk->sk_rmem_alloc),
-			   ax25->sk->sk_socket != NULL ? SOCK_INODE(ax25->sk->sk_socket)->i_ino : 0L);
-		bh_unlock_sock(ax25->sk);
+			   sock_i_ino(ax25->sk));
 	} else {
 		seq_puts(seq, " * * *\n");
 	}

^ permalink raw reply related

* [PATCH] [IPV6] Minor cleanup: remove unused method declaration (net/ndisc.h).
From: Rami Rosen @ 2008-02-10 16:40 UTC (permalink / raw)
  To: David Miller, netdev

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

Hi,

This patch removes unused declaration of dflt_rt_lookup() method in
include/net/ndisc.h


Regards,
Rami Rosen


Signed-off-by: Rami Rosen <ramirose@gmail.com>

[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 368 bytes --]

diff --git a/include/net/ndisc.h b/include/net/ndisc.h
index 6684f7e..59b7062 100644
--- a/include/net/ndisc.h
+++ b/include/net/ndisc.h
@@ -103,7 +103,6 @@ extern void			ndisc_send_redirect(struct sk_buff *skb,
 extern int			ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir);
 
 
-struct rt6_info *		dflt_rt_lookup(void);
 
 /*
  *	IGMP

^ permalink raw reply related

* Re: [patch 2.6.24-git] net/enc28j60: low power mode
From: David Brownell @ 2008-02-10 17:45 UTC (permalink / raw)
  To: Claudio Lanconelli; +Cc: netdev
In-Reply-To: <47AAE99D.1000908@eptar.com>

On Thursday 07 February 2008, Claudio Lanconelli wrote:
> Sorry,
> let me repeat what I said in previous mail.
> I propose you to add set_lowpower(true) in the enc28j60_probe() 

As the current patch does...


> and in  the enc28j60_net_close() after enc28j60_hw_disable().
> Probably we don't need to set_lowpower(false) in enc28j60_net_open() since
> it performs a soft reset with enc28j60_hw_init() (not sure).

The current patch sets the device in low power mode in hw_disable(),
and takes it out of that mode in hw_enable().  I can move them; and
the only "soft" thing about this chip's reset is when it starts from
a protocol command not the reset command.


> Furthermore, as you suggested, we also need to remove hw_init() from the 
> setlink()
> because hw_init() is called when we bring link up.
> 
> --- enc28j60.c 20 Dec 2007 10:47:01 -0000 1.22
> +++ enc28j60.c 7 Feb 2008 11:07:20 -0000
> @@ -740,12 +740,6 @@
> if (!priv->hw_enable) {
> if (autoneg == AUTONEG_DISABLE && speed == SPEED_10) {
> priv->full_duplex = (duplex == DUPLEX_FULL);
> - if (!enc28j60_hw_init(priv)) {
> - if (netif_msg_drv(priv))
> - dev_err(&ndev->dev,
> - "hw_reset() failed\n");
> - ret = -EINVAL;
> - }

Right.  Without the patch mangling presumably done by your mailer.  ;)


> } else {
> if (netif_msg_link(priv))
> dev_warn(&ndev->dev,
> 
> Can you update your low power patch with these modifications?
> 

Done -- see my next patch.


^ permalink raw reply

* Re: [patch 2.6.24-git] net/enc28j60: oops fix, low power mode
From: David Brownell @ 2008-02-10 17:54 UTC (permalink / raw)
  To: Claudio Lanconelli; +Cc: netdev
In-Reply-To: <47AAE32A.7070105@eptar.com>

On Thursday 07 February 2008, Claudio Lanconelli wrote:
> David Brownell wrote:
> > How long did that take?  I did about four dozen
> >
> > 	ifconfig eth1 up
> > 	sleep 3
> > 	ifconfig eth1 down
> >
> > cycles ... it worked fine.  The "sleep" was to let the link
> > negotiation complete.
> >
> >   
> After a couple of :
> 
> ifconfig eth0 down
> (wait just 1 second)
> ifconfig eth0 up
> 
> the network is frozen.
> 
> If I do another
> ifconfig eth0 down
> (wait just 1 second)
> ifconfig eth0 up
> 
> restarts.
> It's random, no rule.

I write a shell loop to do that, and added a "ping -c2" too.
If that was done before the "sleep 1" no packets flowed.
Afterwards, no problem -- ever. 

(And outside the loop, "ethool -s eth1 duplex full".)

^ permalink raw reply

* Re: [patch 2.6.24-git] net/enc28j60: low power mode
From: David Brownell @ 2008-02-10 17:46 UTC (permalink / raw)
  To: Claudio Lanconelli; +Cc: netdev
In-Reply-To: <47AAE99D.1000908@eptar.com>

Keep enc28j60 chips in low-power mode when they're not in use.
At typically 120 mA, these chips run hot even when idle; this
low power mode cuts that power usage by a factor of around 100.

This version provides a generic routine to poll a register until
its masked value equals some value ... e.g. bit set or cleared.
It's basically what the previous wait_phy_ready() did, but this
version is generalized to support the handshaking needed to
enter and exit low power mode.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
---
 drivers/net/enc28j60.c |   81 ++++++++++++++++++++++++++++++++++---------------
 1 files changed, 57 insertions(+), 24 deletions(-)

--- a/drivers/net/enc28j60.c
+++ b/drivers/net/enc28j60.c
@@ -400,26 +400,31 @@ enc28j60_packet_write(struct enc28j60_ne
 	mutex_unlock(&priv->lock);
 }
 
-/*
- * Wait until the PHY operation is complete.
- */
-static int wait_phy_ready(struct enc28j60_net *priv)
+static unsigned long msec20_to_jiffies;
+
+static int poll_ready(struct enc28j60_net *priv, u8 reg, u8 mask, u8 val)
 {
-	unsigned long timeout = jiffies + 20 * HZ / 1000;
-	int ret = 1;
+	unsigned long timeout = jiffies + msec20_to_jiffies;
 
 	/* 20 msec timeout read */
-	while (nolock_regb_read(priv, MISTAT) & MISTAT_BUSY) {
+	while ((nolock_regb_read(priv, reg) & mask) != val) {
 		if (time_after(jiffies, timeout)) {
 			if (netif_msg_drv(priv))
-				printk(KERN_DEBUG DRV_NAME
-					": PHY ready timeout!\n");
-			ret = 0;
-			break;
+				dev_dbg(&priv->spi->dev,
+					"reg %02x ready timeout!\n", reg);
+			return -ETIMEDOUT;
 		}
 		cpu_relax();
 	}
-	return ret;
+	return 0;
+}
+
+/*
+ * Wait until the PHY operation is complete.
+ */
+static int wait_phy_ready(struct enc28j60_net *priv)
+{
+	return poll_ready(priv, MISTAT, MISTAT_BUSY, 0) ? 0 : 1;
 }
 
 /*
@@ -594,6 +599,32 @@ static void nolock_txfifo_init(struct en
 	nolock_regw_write(priv, ETXNDL, end);
 }
 
+/*
+ * Low power mode shrinks power consumption about 100x, so we'd like
+ * the chip to be in that mode whenever it's inactive.  (However, we
+ * can't stay in lowpower mode during suspend with WOL active.)
+ */
+static void enc28j60_lowpower(struct enc28j60_net *priv, bool is_low)
+{
+	if (netif_msg_drv(priv))
+		dev_dbg(&priv->spi->dev, "%s power...\n",
+				is_low ? "low" : "high");
+
+	mutex_lock(&priv->lock);
+	if (is_low) {
+		nolock_reg_bfclr(priv, ECON1, ECON1_RXEN);
+		poll_ready(priv, ESTAT, ESTAT_RXBUSY, 0);
+		poll_ready(priv, ECON1, ECON1_TXRTS, 0);
+		/* ECON2_VRPS was set during initialization */
+		nolock_reg_bfset(priv, ECON2, ECON2_PWRSV);
+	} else {
+		nolock_reg_bfclr(priv, ECON2, ECON2_PWRSV);
+		poll_ready(priv, ESTAT, ESTAT_CLKRDY, ESTAT_CLKRDY);
+		/* caller sets ECON1_RXEN */
+	}
+	mutex_unlock(&priv->lock);
+}
+
 static int enc28j60_hw_init(struct enc28j60_net *priv)
 {
 	u8 reg;
@@ -612,8 +643,8 @@ static int enc28j60_hw_init(struct enc28
 	priv->tx_retry_count = 0;
 	priv->max_pk_counter = 0;
 	priv->rxfilter = RXFILTER_NORMAL;
-	/* enable address auto increment */
-	nolock_regb_write(priv, ECON2, ECON2_AUTOINC);
+	/* enable address auto increment and voltage regulator powersave */
+	nolock_regb_write(priv, ECON2, ECON2_AUTOINC | ECON2_VRPS);
 
 	nolock_rxfifo_init(priv, RXSTART_INIT, RXEND_INIT);
 	nolock_txfifo_init(priv, TXSTART_INIT, TXEND_INIT);
@@ -690,7 +721,7 @@ static int enc28j60_hw_init(struct enc28
 
 static void enc28j60_hw_enable(struct enc28j60_net *priv)
 {
-	/* enable interrutps */
+	/* enable interrupts */
 	if (netif_msg_hw(priv))
 		printk(KERN_DEBUG DRV_NAME ": %s() enabling interrupts.\n",
 			__FUNCTION__);
@@ -726,15 +757,12 @@ enc28j60_setlink(struct net_device *ndev
 	int ret = 0;
 
 	if (!priv->hw_enable) {
-		if (autoneg == AUTONEG_DISABLE && speed == SPEED_10) {
+		/* link is in low power mode now; duplex setting
+		 * will take effect on next enc28j60_hw_init().
+		 */
+		if (autoneg == AUTONEG_DISABLE && speed == SPEED_10)
 			priv->full_duplex = (duplex == DUPLEX_FULL);
-			if (!enc28j60_hw_init(priv)) {
-				if (netif_msg_drv(priv))
-					dev_err(&ndev->dev,
-						"hw_reset() failed\n");
-				ret = -EINVAL;
-			}
-		} else {
+		else {
 			if (netif_msg_link(priv))
 				dev_warn(&ndev->dev,
 					"unsupported link setting\n");
@@ -1307,7 +1335,7 @@ static int enc28j60_net_open(struct net_
 		}
 		return -EADDRNOTAVAIL;
 	}
-	/* Reset the hardware here */
+	/* Reset the hardware here (and take it out of low power mode) */
 	enc28j60_hw_disable(priv);
 	if (!enc28j60_hw_init(priv)) {
 		if (netif_msg_ifup(priv))
@@ -1337,6 +1365,7 @@ static int enc28j60_net_close(struct net
 		printk(KERN_DEBUG DRV_NAME ": %s() enter\n", __FUNCTION__);
 
 	enc28j60_hw_disable(priv);
+	enc28j60_lowpower(priv, true);
 	netif_stop_queue(dev);
 
 	return 0;
@@ -1537,6 +1566,8 @@ static int __devinit enc28j60_probe(stru
 	dev->watchdog_timeo = TX_TIMEOUT;
 	SET_ETHTOOL_OPS(dev, &enc28j60_ethtool_ops);
 
+	enc28j60_lowpower(priv, true);
+
 	ret = register_netdev(dev);
 	if (ret) {
 		if (netif_msg_probe(priv))
@@ -1582,6 +1613,8 @@ static struct spi_driver enc28j60_driver
 
 static int __init enc28j60_init(void)
 {
+	msec20_to_jiffies = msecs_to_jiffies(20);
+
 	return spi_register_driver(&enc28j60_driver);
 }
 

^ permalink raw reply

* Re: [PATCH][AX25] ax25_ds_timer: use mod_timer instead of add_timer
From: Bernard Pidoux F6BVP @ 2008-02-10 18:07 UTC (permalink / raw)
  To: Jarek Poplawski; +Cc: Ralf Baechle DL5RB, Jann Traschewski, Linux Netdev List
In-Reply-To: <20080209193905.GA2754@ami.dom.local>

Hi Jarek,

Sorry, I should have been more explicit about the patches I applied.

My CPU is an Intel Core 2 duo and I compiled 2.6.24 with SMP option.

I applied 3 patches you have submitted for ax25 before I observed the 
possible locking.

That is :

mkiss patch
diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c
index cfcd15a..30c9b3b 100644

[AX25] ax25_timer: use mod_timer instead of add_timer

[AX25] ax25_ds_timer: use mod_timer instead of add_timer

I also applied 4 patches for rose.ko I sent to the list a while ago.
But for this report I did not installed any ROSE driver nor application.

I will try your new patch version 2 and report any possible change.


Regards,


Bernard Pidoux,
F6BVP


Jarek Poplawski wrote:
> On Sat, Feb 09, 2008 at 07:44:50PM +0100, Bernard Pidoux F6BVP wrote:
>> Hi,
>>
>> With AX25 patches applied I still get this possible circular locking  
>> message.
> 
> Hi Bernard,
> 
> Could you confirm which exactly patches did you try? Is this vanilla
> 2.6.24 plus these two: ax25_timer and ax25_ds_timer or something more?
> And I'm not sure what do you mean by "still": the warning came back
> just after these last patches? At least these timer patches don't seem
> to change anything around locking?
> 
> Thanks for testing this,
> Jarek P.
> 
> 

^ permalink raw reply

* Re: [PATCH][AX25] ax25_ds_timer: use mod_timer instead of add_timer
From: Jann Traschewski @ 2008-02-10 18:23 UTC (permalink / raw)
  To: 'Jarek Poplawski', netdev
  Cc: 'Ralf Baechle', 'David Miller'
In-Reply-To: <20080206091413.GE4496@ff.dom.local>

Patches from Jarek applied (incl. both "testing" patches). Machine is stable
since 2 days now.
Regards,
Jann

> -----Ursprüngliche Nachricht-----
> Von: Jarek Poplawski [mailto:jarkao2@gmail.com] 
> Gesendet: Mittwoch, 6. Februar 2008 10:14
> An: netdev@vger.kernel.org
> Cc: Ralf Baechle; Jann Traschewski; David Miller
> Betreff: [PATCH][AX25] ax25_ds_timer: use mod_timer instead 
> of add_timer
> 
> On Wed, Feb 06, 2008 at 08:15:09AM +0000, Jarek Poplawski wrote:
> > On Wed, Feb 06, 2008 at 07:45:29AM +0000, Jarek Poplawski wrote:
> > ...
> > > From: Jann Traschewski <jann@gmx.de>
> > > Subject: SMP with AX.25
> ...
> 
> 
> [AX25] ax25_ds_timer: use mod_timer instead of add_timer
> 
> This patch changes current use of: init_timer(), add_timer() 
> and del_timer() to setup_timer() with mod_timer(), which 
> should be safer anyway.
> 
> 
> Reported-by: Jann Traschewski <jann@gmx.de>
> Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
> 
> ---
> 
>  include/net/ax25.h       |    1 +
>  net/ax25/ax25_dev.c      |    2 +-
>  net/ax25/ax25_ds_timer.c |   12 ++++--------
>  3 files changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/include/net/ax25.h b/include/net/ax25.h index 
> 3f0236f..717e219 100644
> --- a/include/net/ax25.h
> +++ b/include/net/ax25.h
> @@ -324,6 +324,7 @@ extern void ax25_dama_on(ax25_cb *);  
> extern void ax25_dama_off(ax25_cb *);
>  
>  /* ax25_ds_timer.c */
> +extern void ax25_ds_setup_timer(ax25_dev *);
>  extern void ax25_ds_set_timer(ax25_dev *);  extern void 
> ax25_ds_del_timer(ax25_dev *);  extern void 
> ax25_ds_timer(ax25_cb *); diff --git a/net/ax25/ax25_dev.c 
> b/net/ax25/ax25_dev.c index 528c874..a7a0e0c 100644
> --- a/net/ax25/ax25_dev.c
> +++ b/net/ax25/ax25_dev.c
> @@ -82,7 +82,7 @@ void ax25_dev_device_up(struct net_device *dev)
>  	ax25_dev->values[AX25_VALUES_DS_TIMEOUT]= AX25_DEF_DS_TIMEOUT;
>  
>  #if defined(CONFIG_AX25_DAMA_SLAVE) || 
> defined(CONFIG_AX25_DAMA_MASTER)
> -	init_timer(&ax25_dev->dama.slave_timer);
> +	ax25_ds_setup_timer(ax25_dev);
>  #endif
>  
>  	spin_lock_bh(&ax25_dev_lock);
> diff --git a/net/ax25/ax25_ds_timer.c 
> b/net/ax25/ax25_ds_timer.c index c4e3b02..2ce79df 100644
> --- a/net/ax25/ax25_ds_timer.c
> +++ b/net/ax25/ax25_ds_timer.c
> @@ -40,13 +40,10 @@ static void ax25_ds_timeout(unsigned long);
>   *	1/10th of a second.
>   */
>  
> -static void ax25_ds_add_timer(ax25_dev *ax25_dev)
> +void ax25_ds_setup_timer(ax25_dev *ax25_dev)
>  {
> -	struct timer_list *t = &ax25_dev->dama.slave_timer;
> -	t->data		= (unsigned long) ax25_dev;
> -	t->function	= &ax25_ds_timeout;
> -	t->expires	= jiffies + HZ;
> -	add_timer(t);
> +	setup_timer(&ax25_dev->dama.slave_timer, ax25_ds_timeout,
> +		    (unsigned long)ax25_dev);
>  }
>  
>  void ax25_ds_del_timer(ax25_dev *ax25_dev) @@ -60,10 +57,9 
> @@ void ax25_ds_set_timer(ax25_dev *ax25_dev)
>  	if (ax25_dev == NULL)		/* paranoia */
>  		return;
>  
> -	del_timer(&ax25_dev->dama.slave_timer);
>  	ax25_dev->dama.slave_timeout =
>  		
> msecs_to_jiffies(ax25_dev->values[AX25_VALUES_DS_TIMEOUT]) / 10;
> -	ax25_ds_add_timer(ax25_dev);
> +	mod_timer(&ax25_dev->dama.slave_timer, jiffies + HZ);
>  }
>  
>  /*


^ permalink raw reply

* Re: [PATCH] New device for DM9601 usb net driver
From: Peter Korsgaard @ 2008-02-10 19:36 UTC (permalink / raw)
  To: Robert Brockway, jeff; +Cc: netdev
In-Reply-To: <Pine.LNX.4.64.0802071046540.24824@castor.opentrend.net>

>>>>> "Robert" == Robert Brockway <robert@timetraveller.org> writes:

 Robert> Hi Peter.  I've verified that the Hirose USB-100 (0x0a47,
 Robert> 0x9601) is a clone of the DAVICOM DM9601.  I patched dm9601.c
 Robert> to identify this device and now have these in production.
 Robert> Unified diff against 2.6.24 attached.

Thanks!

Acked-by: Peter Korsgaard <jacmet@sunsite.dk>

 Robert> Cheers,

 Robert> Rob

 Robert> -- 
 Robert> "With sufficient thrust, pigs fly just fine..."
 Robert> 	-- RFC 1925 "The Twelve Networking Truths"

 Robert> --- drivers/net/usb/dm9601.c.old	2008-01-27 00:51:50.000000000 -0500
 Robert> +++ drivers/net/usb/dm9601.c	2008-02-07 10:27:40.000000000 -0500
 Robert> @@ -590,6 +590,10 @@ static const struct usb_device_id produc
 Robert>  	 USB_DEVICE(0x0a46, 0x8515),	/* ADMtek ADM8515 USB NIC */
 Robert>  	 .driver_info = (unsigned long)&dm9601_info,
 Robert>  	 },
 Robert> +	{
 Robert> +	USB_DEVICE(0x0a47, 0x9601),    /* Hirose USB-100 */
 Robert> +	.driver_info = (unsigned long)&dm9601_info,
 Robert> +	},
 Robert>  	{},			// END
 Robert>  };
 

-- 
Bye, Peter Korsgaard

^ permalink raw reply

* [PATCH 5/8] drivers/net/mv643xx_eth.c: Use FIELD_SIZEOF
From: Julia Lawall @ 2008-02-10 20:13 UTC (permalink / raw)
  To: dale, mlachwani, netdev; +Cc: linux-kernel, kernel-janitors

From: Julia Lawall <julia@diku.dk>

Robert P.J. Day proposed to use the macro FIELD_SIZEOF in replace of code
that matches its definition.

The modification was made using the following semantic patch
(http://www.emn.fr/x-info/coccinelle/)

// <smpl>
@haskernel@
@@

#include <linux/kernel.h>

@depends on haskernel@
type t;
identifier f;
@@

- (sizeof(((t*)0)->f))
+ FIELD_SIZEOF(t, f)

@depends on haskernel@
type t;
identifier f;
@@

- sizeof(((t*)0)->f)
+ FIELD_SIZEOF(t, f)
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>

---

diff -u -p a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
--- a/drivers/net/mv643xx_eth.c 2008-02-08 08:58:12.000000000 +0100
+++ b/drivers/net/mv643xx_eth.c 2008-02-10 18:00:09.000000000 +0100
@@ -3155,7 +3155,7 @@ struct mv643xx_stats {
 	int stat_offset;
 };
 
-#define MV643XX_STAT(m) sizeof(((struct mv643xx_private *)0)->m), \
+#define MV643XX_STAT(m) FIELD_SIZEOF(struct mv643xx_private, m), \
 					offsetof(struct mv643xx_private, m)
 
 static const struct mv643xx_stats mv643xx_gstrings_stats[] = {

^ permalink raw reply

* [PATCH] drivers/net/sis190: fix section mismatch warning in sis190_get_mac_addr
From: Sergio Luis @ 2008-02-10 20:56 UTC (permalink / raw)
  To: LKML; +Cc: Francois Romieu, netdev

Fix following warnings:
WARNING: drivers/net/sis190.o(.text+0x103): Section mismatch in reference from the function sis190_get_mac_addr() to the function .devinit.text:sis190_get_mac_addr_from_apc()
WARNING: drivers/net/sis190.o(.text+0x10e): Section mismatch in reference from the function sis190_get_mac_addr() to the function .devinit.text:sis190_get_mac_addr_from_eeprom()

Annotate sis190_get_mac_addr() with __devinit.

Signed-off-by: Sergio Luis <sergio@uece.br>

 sis190.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff -urN linux-2.6.24-git22.orig/drivers/net/sis190.c linux-2.6.24-git22/drivers/net/sis190.c
--- linux-2.6.24-git22.orig/drivers/net/sis190.c	2008-02-10 16:56:37.000000000 -0300
+++ linux-2.6.24-git22/drivers/net/sis190.c	2008-02-10 17:38:36.000000000 -0300
@@ -1630,7 +1630,8 @@
 	SIS_PCI_COMMIT();
 }
 
-static int sis190_get_mac_addr(struct pci_dev *pdev, struct net_device *dev)
+static int __devinit sis190_get_mac_addr(struct pci_dev *pdev, 
+					 struct net_device *dev)
 {
 	u8 from;
 

^ permalink raw reply

* Netfilter fixes to 2.6.24-git
From: Jan Engelhardt @ 2008-02-10 21:02 UTC (permalink / raw)
  To: netdev
  Cc: Linux Kernel Mailing List, Netfilter Developer Mailing List,
	davem, kaber, torvalds

Hi to everyone,


I have been unable to reach the netfilter and net maintainers the past 
week regarding inclusion of patches, but most importantly a group of 
fixes at [0]-[3]. I am kind of at a loss here but to turn up the volume 
and write to more people on how to proceed.

thanks,
Jan

[0] http://marc.info/?l=netfilter-devel&m=120230633916142&w=2 (Overview)
[1] http://marc.info/?l=netfilter-devel&m=120230634016145&w=2
[2] http://marc.info/?l=netfilter-devel&m=120230634216156&w=2
[3] http://marc.info/?l=netfilter-devel&m=120230634616162&w=2

^ permalink raw reply

* [PATCH] 3c509: convert to isa_driver and pnp_driver v5
From: Ondrej Zary @ 2008-02-10 21:03 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Stephen Hemminger, linux-kernel, netdev
In-Reply-To: <20080210051855.GA22064@infradead.org>

Hello,
this patch converts 3c509 driver to isa_driver and pnp_driver. The result is 
that autoloading using udev and hibernation works with ISA PnP cards. It also 
adds hibernation support for non-PnP ISA cards.

xcvr module parameter was removed as its value was not used.

Tested using 3 ISA cards in various combinations of PnP and non-PnP modes. 
EISA and MCA only compile-tested.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>

--- linux-2.6.24-orig/drivers/net/3c509.c	2008-01-27 19:48:19.000000000 +0100
+++ linux-2.6.24-pentium/drivers/net/3c509.c	2008-02-10 21:52:04.000000000 +0100
@@ -54,25 +54,24 @@
 		v1.19a 28Oct2002 Davud Ruggiero <jdr@farfalle.com>
 			- Increase *read_eeprom udelay to workaround oops with 2 cards.
 		v1.19b 08Nov2002 Marc Zyngier <maz@wild-wind.fr.eu.org>
-		    - Introduce driver model for EISA cards.
+			- Introduce driver model for EISA cards.
+		v1.20  04Feb2008 Ondrej Zary <linux@rainbow-software.org>
+			- convert to isa_driver and pnp_driver and some cleanups
 */
 
 #define DRV_NAME	"3c509"
-#define DRV_VERSION	"1.19b"
-#define DRV_RELDATE	"08Nov2002"
+#define DRV_VERSION	"1.20"
+#define DRV_RELDATE	"04Feb2008"
 
 /* A few values that may be tweaked. */
 
 /* Time in jiffies before concluding the transmitter is hung. */
 #define TX_TIMEOUT  (400*HZ/1000)
-/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
-static int max_interrupt_work = 10;
 
 #include <linux/module.h>
-#ifdef CONFIG_MCA
 #include <linux/mca.h>
-#endif
-#include <linux/isapnp.h>
+#include <linux/isa.h>
+#include <linux/pnp.h>
 #include <linux/string.h>
 #include <linux/interrupt.h>
 #include <linux/errno.h>
@@ -97,10 +96,6 @@
 
 static char version[] __initdata = DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE " becker@scyld.com\n";
 
-#if defined(CONFIG_PM) && (defined(CONFIG_MCA) || defined(CONFIG_EISA))
-#define EL3_SUSPEND
-#endif
-
 #ifdef EL3_DEBUG
 static int el3_debug = EL3_DEBUG;
 #else
@@ -111,6 +106,7 @@
  * a global variable so that the mca/eisa probe routines can increment
  * it */
 static int el3_cards = 0;
+#define EL3_MAX_CARDS 8
 
 /* To minimize the size of the driver source I only define operating
    constants if they are used several times.  You'll need the manual
@@ -119,7 +115,7 @@
 #define EL3_DATA 0x00
 #define EL3_CMD 0x0e
 #define EL3_STATUS 0x0e
-#define	 EEPROM_READ 0x80
+#define	EEPROM_READ 0x80
 
 #define EL3_IO_EXTENT	16
 
@@ -168,23 +164,31 @@
  */
 #define SKB_QUEUE_SIZE	64
 
+enum el3_cardtype { EL3_ISA, EL3_PNP, EL3_MCA, EL3_EISA };
+
 struct el3_private {
 	struct net_device_stats stats;
-	struct net_device *next_dev;
 	spinlock_t lock;
 	/* skb send-queue */
 	int head, size;
 	struct sk_buff *queue[SKB_QUEUE_SIZE];
-	enum {
-		EL3_MCA,
-		EL3_PNP,
-		EL3_EISA,
-	} type;						/* type of device */
-	struct device *dev;
+	enum el3_cardtype type;
 };
-static int id_port __initdata = 0x110;	/* Start with 0x110 to avoid new sound cards.*/
-static struct net_device *el3_root_dev;
+static int id_port;
+static int current_tag;
+static struct net_device *el3_devs[EL3_MAX_CARDS];
+
+/* Parameters that may be passed into the module. */
+static int debug = -1;
+static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1};
+/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
+static int max_interrupt_work = 10;
+#ifdef CONFIG_PNP
+static int nopnp;
+#endif
 
+static int __init el3_common_init(struct net_device *dev);
+static void el3_common_remove(struct net_device *dev);
 static ushort id_read_eeprom(int index);
 static ushort read_eeprom(int ioaddr, int index);
 static int el3_open(struct net_device *dev);
@@ -199,23 +203,279 @@
 static void el3_down(struct net_device *dev);
 static void el3_up(struct net_device *dev);
 static const struct ethtool_ops ethtool_ops;
-#ifdef EL3_SUSPEND
+#ifdef CONFIG_PM
 static int el3_suspend(struct device *, pm_message_t);
 static int el3_resume(struct device *);
-#else
-#define el3_suspend NULL
-#define el3_resume NULL
 #endif
 
 
 /* generic device remove for all device types */
-#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
 static int el3_device_remove (struct device *device);
-#endif
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void el3_poll_controller(struct net_device *dev);
 #endif
 
+/* Return 0 on success, 1 on error, 2 when found already detected PnP card */
+static int el3_isa_id_sequence(__be16 *phys_addr)
+{
+	short lrs_state = 0xff;
+	int i;
+
+	/* ISA boards are detected by sending the ID sequence to the
+	   ID_PORT.  We find cards past the first by setting the 'current_tag'
+	   on cards as they are found.  Cards with their tag set will not
+	   respond to subsequent ID sequences. */
+
+	outb(0x00, id_port);
+	outb(0x00, id_port);
+	for (i = 0; i < 255; i++) {
+		outb(lrs_state, id_port);
+		lrs_state <<= 1;
+		lrs_state = lrs_state & 0x100 ? lrs_state ^ 0xcf : lrs_state;
+	}
+	/* For the first probe, clear all board's tag registers. */
+	if (current_tag == 0)
+		outb(0xd0, id_port);
+	else			/* Otherwise kill off already-found boards. */
+		outb(0xd8, id_port);
+	if (id_read_eeprom(7) != 0x6d50)
+		return 1;
+	/* Read in EEPROM data, which does contention-select.
+	   Only the lowest address board will stay "on-line".
+	   3Com got the byte order backwards. */
+	for (i = 0; i < 3; i++)
+		phys_addr[i] = htons(id_read_eeprom(i));
+#ifdef CONFIG_PNP
+	if (!nopnp) {
+		/* The ISA PnP 3c509 cards respond to the ID sequence too.
+		   This check is needed in order not to register them twice. */
+		for (i = 0; i < el3_cards; i++) {
+			struct el3_private *lp = netdev_priv(el3_devs[i]);
+			if (lp->type == EL3_PNP
+			    && !memcmp(phys_addr, el3_devs[i]->dev_addr,
+				       ETH_ALEN)) {
+				if (el3_debug > 3)
+					printk(KERN_DEBUG "3c509 with address %02x %02x %02x %02x %02x %02x was found by ISAPnP\n",
+						phys_addr[0] & 0xff, phys_addr[0] >> 8,
+						phys_addr[1] & 0xff, phys_addr[1] >> 8,
+						phys_addr[2] & 0xff, phys_addr[2] >> 8);
+				/* Set the adaptor tag so that the next card can be found. */
+				outb(0xd0 + ++current_tag, id_port);
+				return 2;
+			}
+		}
+	}
+#endif /* CONFIG_PNP */
+	return 0;
+
+}
+
+static void __devinit el3_dev_fill(struct net_device *dev, __be16 *phys_addr,
+				   int ioaddr, int irq, int if_port,
+				   enum el3_cardtype type)
+{
+	struct el3_private *lp = netdev_priv(dev);
+
+	memcpy(dev->dev_addr, phys_addr, ETH_ALEN);
+	dev->base_addr = ioaddr;
+	dev->irq = irq;
+	dev->if_port = if_port;
+	lp->type = type;
+}
+
+static int __devinit el3_isa_match(struct device *pdev,
+				   unsigned int ndev)
+{
+	struct net_device *dev;
+	int ioaddr, isa_irq, if_port, err;
+	unsigned int iobase;
+	__be16 phys_addr[3];
+
+	while ((err = el3_isa_id_sequence(phys_addr)) == 2)
+		;	/* Skip to next card when PnP card found */
+	if (err == 1)
+		return 0;
+
+	iobase = id_read_eeprom(8);
+	if_port = iobase >> 14;
+	ioaddr = 0x200 + ((iobase & 0x1f) << 4);
+	if (irq[el3_cards] > 1 && irq[el3_cards] < 16)
+		isa_irq = irq[el3_cards];
+	else
+		isa_irq = id_read_eeprom(9) >> 12;
+
+	dev = alloc_etherdev(sizeof(struct el3_private));
+	if (!dev)
+		return -ENOMEM;
+
+	netdev_boot_setup_check(dev);
+
+	if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-isa")) {
+		free_netdev(dev);
+		return 0;
+	}
+
+	/* Set the adaptor tag so that the next card can be found. */
+	outb(0xd0 + ++current_tag, id_port);
+
+	/* Activate the adaptor at the EEPROM location. */
+	outb((ioaddr >> 4) | 0xe0, id_port);
+
+	EL3WINDOW(0);
+	if (inw(ioaddr) != 0x6d50) {
+		free_netdev(dev);
+		return 0;
+	}
+
+	/* Free the interrupt so that some other card can use it. */
+	outw(0x0f00, ioaddr + WN0_IRQ);
+
+	el3_dev_fill(dev, phys_addr, ioaddr, isa_irq, if_port, EL3_ISA);
+	dev_set_drvdata(pdev, dev);
+	if (el3_common_init(dev)) {
+		free_netdev(dev);
+		return 0;
+	}
+
+	el3_devs[el3_cards++] = dev;
+	return 1;
+}
+
+static int __devexit el3_isa_remove(struct device *pdev,
+				    unsigned int ndev)
+{
+	el3_device_remove(pdev);
+	dev_set_drvdata(pdev, NULL);
+	return 0;
+}
+
+#ifdef CONFIG_PM
+static int el3_isa_suspend(struct device *dev, unsigned int n,
+			   pm_message_t state)
+{
+	current_tag = 0;
+	return el3_suspend(dev, state);
+}
+
+static int el3_isa_resume(struct device *dev, unsigned int n)
+{
+	struct net_device *ndev = dev_get_drvdata(dev);
+	int ioaddr = ndev->base_addr, err;
+	__be16 phys_addr[3];
+
+	while ((err = el3_isa_id_sequence(phys_addr)) == 2)
+		;	/* Skip to next card when PnP card found */
+	if (err == 1)
+		return 0;
+	/* Set the adaptor tag so that the next card can be found. */
+	outb(0xd0 + ++current_tag, id_port);
+	/* Enable the card */
+	outb((ioaddr >> 4) | 0xe0, id_port);
+	EL3WINDOW(0);
+	if (inw(ioaddr) != 0x6d50)
+		return 1;
+	/* Free the interrupt so that some other card can use it. */
+	outw(0x0f00, ioaddr + WN0_IRQ);
+	return el3_resume(dev);
+}
+#endif
+
+static struct isa_driver el3_isa_driver = {
+	.match		= el3_isa_match,
+	.remove		= __devexit_p(el3_isa_remove),
+#ifdef CONFIG_PM
+	.suspend	= el3_isa_suspend,
+	.resume		= el3_isa_resume,
+#endif
+	.driver		= {
+		.name	= "3c509"
+	},
+};
+static int isa_registered;
+
+#ifdef CONFIG_PNP
+static struct pnp_device_id el3_pnp_ids[] = {
+	{ .id = "TCM5090" }, /* 3Com Etherlink III (TP) */
+	{ .id = "TCM5091" }, /* 3Com Etherlink III */
+	{ .id = "TCM5094" }, /* 3Com Etherlink III (combo) */
+	{ .id = "TCM5095" }, /* 3Com Etherlink III (TPO) */
+	{ .id = "TCM5098" }, /* 3Com Etherlink III (TPC) */
+	{ .id = "PNP80f7" }, /* 3Com Etherlink III compatible */
+	{ .id = "PNP80f8" }, /* 3Com Etherlink III compatible */
+	{ .id = "" }
+};
+MODULE_DEVICE_TABLE(pnp, el3_pnp_ids);
+
+static int __devinit el3_pnp_probe(struct pnp_dev *pdev,
+				    const struct pnp_device_id *id)
+{
+	short i;
+	int ioaddr, irq, if_port;
+	u16 phys_addr[3];
+	struct net_device *dev = NULL;
+	int err;
+
+	ioaddr = pnp_port_start(pdev, 0);
+	if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-pnp"))
+		return -EBUSY;
+	irq = pnp_irq(pdev, 0);
+	EL3WINDOW(0);
+	for (i = 0; i < 3; i++)
+		phys_addr[i] = htons(read_eeprom(ioaddr, i));
+	if_port = read_eeprom(ioaddr, 8) >> 14;
+	dev = alloc_etherdev(sizeof(struct el3_private));
+	if (!dev) {
+		release_region(ioaddr, EL3_IO_EXTENT);
+		return -ENOMEM;
+	}
+	SET_NETDEV_DEV(dev, &pdev->dev);
+	netdev_boot_setup_check(dev);
+
+	el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_PNP);
+	pnp_set_drvdata(pdev, dev);
+	err = el3_common_init(dev);
+
+	if (err) {
+		pnp_set_drvdata(pdev, NULL);
+		free_netdev(dev);
+		return err;
+	}
+
+	el3_devs[el3_cards++] = dev;
+	return 0;
+}
+
+static void __devexit el3_pnp_remove(struct pnp_dev *pdev)
+{
+	el3_common_remove(pnp_get_drvdata(pdev));
+	pnp_set_drvdata(pdev, NULL);
+}
+
+#ifdef CONFIG_PM
+static int el3_pnp_suspend(struct pnp_dev *pdev, pm_message_t state)
+{
+	return el3_suspend(&pdev->dev, state);
+}
+
+static int el3_pnp_resume(struct pnp_dev *pdev)
+{
+	return el3_resume(&pdev->dev);
+}
+#endif
+
+static struct pnp_driver el3_pnp_driver = {
+	.name		= "3c509",
+	.id_table	= el3_pnp_ids,
+	.probe		= el3_pnp_probe,
+	.remove		= __devexit_p(el3_pnp_remove),
+#ifdef CONFIG_PM
+	.suspend	= el3_pnp_suspend,
+	.resume		= el3_pnp_resume,
+#endif
+};
+static int pnp_registered;
+#endif /* CONFIG_PNP */
+
 #ifdef CONFIG_EISA
 static struct eisa_device_id el3_eisa_ids[] = {
 		{ "TCM5092" },
@@ -230,13 +490,14 @@
 static struct eisa_driver el3_eisa_driver = {
 		.id_table = el3_eisa_ids,
 		.driver   = {
-				.name    = "3c509",
+				.name    = "3c579",
 				.probe   = el3_eisa_probe,
 				.remove  = __devexit_p (el3_device_remove),
 				.suspend = el3_suspend,
 				.resume  = el3_resume,
 		}
 };
+static int eisa_registered;
 #endif
 
 #ifdef CONFIG_MCA
@@ -271,45 +532,9 @@
 				.resume  = el3_resume,
 		},
 };
+static int mca_registered;
 #endif /* CONFIG_MCA */
 
-#if defined(__ISAPNP__)
-static struct isapnp_device_id el3_isapnp_adapters[] __initdata = {
-	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-		ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5090),
-		(long) "3Com Etherlink III (TP)" },
-	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-		ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5091),
-		(long) "3Com Etherlink III" },
-	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-		ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5094),
-		(long) "3Com Etherlink III (combo)" },
-	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-		ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5095),
-		(long) "3Com Etherlink III (TPO)" },
-	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-		ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5098),
-		(long) "3Com Etherlink III (TPC)" },
-	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-		ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_FUNCTION(0x80f7),
-		(long) "3Com Etherlink III compatible" },
-	{	ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-		ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_FUNCTION(0x80f8),
-		(long) "3Com Etherlink III compatible" },
-	{ }	/* terminate list */
-};
-
-static __be16 el3_isapnp_phys_addr[8][3];
-static int nopnp;
-#endif /* __ISAPNP__ */
-
-/* With the driver model introduction for EISA devices, both init
- * and cleanup have been split :
- * - EISA devices probe/remove starts in el3_eisa_probe/el3_device_remove
- * - MCA/ISA still use el3_probe
- *
- * Both call el3_common_init/el3_common_remove. */
-
 static int __init el3_common_init(struct net_device *dev)
 {
 	struct el3_private *lp = netdev_priv(dev);
@@ -360,231 +585,11 @@
 
 static void el3_common_remove (struct net_device *dev)
 {
-	struct el3_private *lp = netdev_priv(dev);
-
-	(void) lp;				/* Keep gcc quiet... */
-#if defined(__ISAPNP__)
-	if (lp->type == EL3_PNP)
-		pnp_device_detach(to_pnp_dev(lp->dev));
-#endif
-
 	unregister_netdev (dev);
 	release_region(dev->base_addr, EL3_IO_EXTENT);
 	free_netdev (dev);
 }
 
-static int __init el3_probe(int card_idx)
-{
-	struct net_device *dev;
-	struct el3_private *lp;
-	short lrs_state = 0xff, i;
-	int ioaddr, irq, if_port;
-	__be16 phys_addr[3];
-	static int current_tag;
-	int err = -ENODEV;
-#if defined(__ISAPNP__)
-	static int pnp_cards;
-	struct pnp_dev *idev = NULL;
-	int pnp_found = 0;
-
-	if (nopnp == 1)
-		goto no_pnp;
-
-	for (i=0; el3_isapnp_adapters[i].vendor != 0; i++) {
-		int j;
-		while ((idev = pnp_find_dev(NULL,
-					    el3_isapnp_adapters[i].vendor,
-					    el3_isapnp_adapters[i].function,
-					    idev))) {
-			if (pnp_device_attach(idev) < 0)
-				continue;
-			if (pnp_activate_dev(idev) < 0) {
-__again:
-				pnp_device_detach(idev);
-				continue;
-			}
-			if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0))
-				goto __again;
-			ioaddr = pnp_port_start(idev, 0);
-			if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509 PnP")) {
-				pnp_device_detach(idev);
-				return -EBUSY;
-			}
-			irq = pnp_irq(idev, 0);
-			if (el3_debug > 3)
-				printk ("ISAPnP reports %s at i/o 0x%x, irq %d\n",
-					(char*) el3_isapnp_adapters[i].driver_data, ioaddr, irq);
-			EL3WINDOW(0);
-			for (j = 0; j < 3; j++)
-				el3_isapnp_phys_addr[pnp_cards][j] =
-					phys_addr[j] =
-						htons(read_eeprom(ioaddr, j));
-			if_port = read_eeprom(ioaddr, 8) >> 14;
-			dev = alloc_etherdev(sizeof (struct el3_private));
-			if (!dev) {
-					release_region(ioaddr, EL3_IO_EXTENT);
-					pnp_device_detach(idev);
-					return -ENOMEM;
-			}
-
-			SET_NETDEV_DEV(dev, &idev->dev);
-			pnp_cards++;
-
-			netdev_boot_setup_check(dev);
-			pnp_found = 1;
-			goto found;
-		}
-	}
-no_pnp:
-#endif /* __ISAPNP__ */
-
-	/* Select an open I/O location at 0x1*0 to do contention select. */
-	for ( ; id_port < 0x200; id_port += 0x10) {
-		if (!request_region(id_port, 1, "3c509"))
-			continue;
-		outb(0x00, id_port);
-		outb(0xff, id_port);
-		if (inb(id_port) & 0x01){
-			release_region(id_port, 1);
-			break;
-		} else
-			release_region(id_port, 1);
-	}
-	if (id_port >= 0x200) {
-		/* Rare -- do we really need a warning? */
-		printk(" WARNING: No I/O port available for 3c509 activation.\n");
-		return -ENODEV;
-	}
-
-	/* Next check for all ISA bus boards by sending the ID sequence to the
-	   ID_PORT.  We find cards past the first by setting the 'current_tag'
-	   on cards as they are found.  Cards with their tag set will not
-	   respond to subsequent ID sequences. */
-
-	outb(0x00, id_port);
-	outb(0x00, id_port);
-	for(i = 0; i < 255; i++) {
-		outb(lrs_state, id_port);
-		lrs_state <<= 1;
-		lrs_state = lrs_state & 0x100 ? lrs_state ^ 0xcf : lrs_state;
-	}
-
-	/* For the first probe, clear all board's tag registers. */
-	if (current_tag == 0)
-		outb(0xd0, id_port);
-	else				/* Otherwise kill off already-found boards. */
-		outb(0xd8, id_port);
-
-	if (id_read_eeprom(7) != 0x6d50) {
-		return -ENODEV;
-	}
-
-	/* Read in EEPROM data, which does contention-select.
-	   Only the lowest address board will stay "on-line".
-	   3Com got the byte order backwards. */
-	for (i = 0; i < 3; i++) {
-		phys_addr[i] = htons(id_read_eeprom(i));
-	}
-
-#if defined(__ISAPNP__)
-	if (nopnp == 0) {
-		/* The ISA PnP 3c509 cards respond to the ID sequence.
-		   This check is needed in order not to register them twice. */
-		for (i = 0; i < pnp_cards; i++) {
-			if (phys_addr[0] == el3_isapnp_phys_addr[i][0] &&
-			    phys_addr[1] == el3_isapnp_phys_addr[i][1] &&
-			    phys_addr[2] == el3_isapnp_phys_addr[i][2])
-			{
-				if (el3_debug > 3)
-					printk("3c509 with address %02x %02x %02x %02x %02x %02x was found by ISAPnP\n",
-						phys_addr[0] & 0xff, phys_addr[0] >> 8,
-						phys_addr[1] & 0xff, phys_addr[1] >> 8,
-						phys_addr[2] & 0xff, phys_addr[2] >> 8);
-				/* Set the adaptor tag so that the next card can be found. */
-				outb(0xd0 + ++current_tag, id_port);
-				goto no_pnp;
-			}
-		}
-	}
-#endif /* __ISAPNP__ */
-
-	{
-		unsigned int iobase = id_read_eeprom(8);
-		if_port = iobase >> 14;
-		ioaddr = 0x200 + ((iobase & 0x1f) << 4);
-	}
-	irq = id_read_eeprom(9) >> 12;
-
-	dev = alloc_etherdev(sizeof (struct el3_private));
-	if (!dev)
-		return -ENOMEM;
-
-	netdev_boot_setup_check(dev);
-
-	/* Set passed-in IRQ or I/O Addr. */
-	if (dev->irq > 1  &&  dev->irq < 16)
-			irq = dev->irq;
-
-	if (dev->base_addr) {
-		if (dev->mem_end == 0x3c509 	/* Magic key */
-		    && dev->base_addr >= 0x200  &&  dev->base_addr <= 0x3e0)
-			ioaddr = dev->base_addr & 0x3f0;
-		else if (dev->base_addr != ioaddr)
-			goto out;
-	}
-
-	if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509")) {
-		err = -EBUSY;
-		goto out;
-	}
-
-	/* Set the adaptor tag so that the next card can be found. */
-	outb(0xd0 + ++current_tag, id_port);
-
-	/* Activate the adaptor at the EEPROM location. */
-	outb((ioaddr >> 4) | 0xe0, id_port);
-
-	EL3WINDOW(0);
-	if (inw(ioaddr) != 0x6d50)
-		goto out1;
-
-	/* Free the interrupt so that some other card can use it. */
-	outw(0x0f00, ioaddr + WN0_IRQ);
-
-#if defined(__ISAPNP__)
- found:							/* PNP jumps here... */
-#endif /* __ISAPNP__ */
-
-	memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
-	dev->base_addr = ioaddr;
-	dev->irq = irq;
-	dev->if_port = if_port;
-	lp = netdev_priv(dev);
-#if defined(__ISAPNP__)
-	lp->dev = &idev->dev;
-	if (pnp_found)
-		lp->type = EL3_PNP;
-#endif
-	err = el3_common_init(dev);
-
-	if (err)
-		goto out1;
-
-	el3_cards++;
-	lp->next_dev = el3_root_dev;
-	el3_root_dev = dev;
-	return 0;
-
-out1:
-#if defined(__ISAPNP__)
-	if (idev)
-		pnp_device_detach(idev);
-#endif
-out:
-	free_netdev(dev);
-	return err;
-}
-
 #ifdef CONFIG_MCA
 static int __init el3_mca_probe(struct device *device)
 {
@@ -596,7 +601,6 @@
 	 * redone for multi-card detection by ZP Gu (zpg@castle.net)
 	 * now works as a module */
 
-	struct el3_private *lp;
 	short i;
 	int ioaddr, irq, if_port;
 	u16 phys_addr[3];
@@ -613,7 +617,7 @@
 	irq = pos5 & 0x0f;
 
 
-	printk("3c529: found %s at slot %d\n",
+	printk(KERN_INFO "3c529: found %s at slot %d\n",
 		   el3_mca_adapter_names[mdev->index], slot + 1);
 
 	/* claim the slot */
@@ -626,7 +630,7 @@
 	irq = mca_device_transform_irq(mdev, irq);
 	ioaddr = mca_device_transform_ioport(mdev, ioaddr);
 	if (el3_debug > 2) {
-			printk("3c529: irq %d  ioaddr 0x%x  ifport %d\n", irq, ioaddr, if_port);
+			printk(KERN_DEBUG "3c529: irq %d  ioaddr 0x%x  ifport %d\n", irq, ioaddr, if_port);
 	}
 	EL3WINDOW(0);
 	for (i = 0; i < 3; i++) {
@@ -641,13 +645,7 @@
 
 	netdev_boot_setup_check(dev);
 
-	memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
-	dev->base_addr = ioaddr;
-	dev->irq = irq;
-	dev->if_port = if_port;
-	lp = netdev_priv(dev);
-	lp->dev = device;
-	lp->type = EL3_MCA;
+	el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_MCA);
 	device->driver_data = dev;
 	err = el3_common_init(dev);
 
@@ -657,7 +655,7 @@
 		return -ENOMEM;
 	}
 
-	el3_cards++;
+	el3_devs[el3_cards++] = dev;
 	return 0;
 }
 
@@ -666,7 +664,6 @@
 #ifdef CONFIG_EISA
 static int __init el3_eisa_probe (struct device *device)
 {
-	struct el3_private *lp;
 	short i;
 	int ioaddr, irq, if_port;
 	u16 phys_addr[3];
@@ -678,7 +675,7 @@
 	edev = to_eisa_device (device);
 	ioaddr = edev->base_addr;
 
-	if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509"))
+	if (!request_region(ioaddr, EL3_IO_EXTENT, "3c579-eisa"))
 		return -EBUSY;
 
 	/* Change the register set to the configuration window 0. */
@@ -700,13 +697,7 @@
 
 	netdev_boot_setup_check(dev);
 
-	memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
-	dev->base_addr = ioaddr;
-	dev->irq = irq;
-	dev->if_port = if_port;
-	lp = netdev_priv(dev);
-	lp->dev = device;
-	lp->type = EL3_EISA;
+	el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_EISA);
 	eisa_set_drvdata (edev, dev);
 	err = el3_common_init(dev);
 
@@ -716,12 +707,11 @@
 		return err;
 	}
 
-	el3_cards++;
+	el3_devs[el3_cards++] = dev;
 	return 0;
 }
 #endif
 
-#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
 /* This remove works for all device types.
  *
  * The net dev must be stored in the driver_data field */
@@ -734,7 +724,6 @@
 	el3_common_remove (dev);
 	return 0;
 }
-#endif
 
 /* Read a word from the EEPROM using the regular EEPROM access register.
    Assume that we are in register window zero.
@@ -749,7 +738,7 @@
 }
 
 /* Read a word from the EEPROM when in the ISA ID probe state. */
-static ushort __init id_read_eeprom(int index)
+static ushort id_read_eeprom(int index)
 {
 	int bit, word = 0;
 
@@ -765,7 +754,7 @@
 		word = (word << 1) + (inb(id_port) & 0x01);
 
 	if (el3_debug > 3)
-		printk("  3c509 EEPROM word %d %#4.4x.\n", index, word);
+		printk(KERN_DEBUG "  3c509 EEPROM word %d %#4.4x.\n", index, word);
 
 	return word;
 }
@@ -787,13 +776,13 @@
 
 	EL3WINDOW(0);
 	if (el3_debug > 3)
-		printk("%s: Opening, IRQ %d	 status@%x %4.4x.\n", dev->name,
+		printk(KERN_DEBUG "%s: Opening, IRQ %d	 status@%x %4.4x.\n", dev->name,
 			   dev->irq, ioaddr + EL3_STATUS, inw(ioaddr + EL3_STATUS));
 
 	el3_up(dev);
 
 	if (el3_debug > 3)
-		printk("%s: Opened 3c509  IRQ %d  status %4.4x.\n",
+		printk(KERN_DEBUG "%s: Opened 3c509  IRQ %d  status %4.4x.\n",
 			   dev->name, dev->irq, inw(ioaddr + EL3_STATUS));
 
 	return 0;
@@ -806,7 +795,7 @@
 	int ioaddr = dev->base_addr;
 
 	/* Transmitter timeout, serious problems. */
-	printk("%s: transmit timed out, Tx_status %2.2x status %4.4x "
+	printk(KERN_WARNING "%s: transmit timed out, Tx_status %2.2x status %4.4x "
 		   "Tx FIFO room %d.\n",
 		   dev->name, inb(ioaddr + TX_STATUS), inw(ioaddr + EL3_STATUS),
 		   inw(ioaddr + TX_FREE));
@@ -831,7 +820,7 @@
 	lp->stats.tx_bytes += skb->len;
 
 	if (el3_debug > 4) {
-		printk("%s: el3_start_xmit(length = %u) called, status %4.4x.\n",
+		printk(KERN_DEBUG "%s: el3_start_xmit(length = %u) called, status %4.4x.\n",
 			   dev->name, skb->len, inw(ioaddr + EL3_STATUS));
 	}
 #if 0
@@ -840,7 +829,7 @@
 		ushort status = inw(ioaddr + EL3_STATUS);
 		if (status & 0x0001 		/* IRQ line active, missed one. */
 			&& inw(ioaddr + EL3_STATUS) & 1) { 			/* Make sure. */
-			printk("%s: Missed interrupt, status then %04x now %04x"
+			printk(KERN_DEBUG "%s: Missed interrupt, status then %04x now %04x"
 				   "  Tx %2.2x Rx %4.4x.\n", dev->name, status,
 				   inw(ioaddr + EL3_STATUS), inb(ioaddr + TX_STATUS),
 				   inw(ioaddr + RX_STATUS));
@@ -914,7 +903,7 @@
 
 	if (el3_debug > 4) {
 		status = inw(ioaddr + EL3_STATUS);
-		printk("%s: interrupt, status %4.4x.\n", dev->name, status);
+		printk(KERN_DEBUG "%s: interrupt, status %4.4x.\n", dev->name, status);
 	}
 
 	while ((status = inw(ioaddr + EL3_STATUS)) &
@@ -925,7 +914,7 @@
 
 		if (status & TxAvailable) {
 			if (el3_debug > 5)
-				printk("	TX room bit was handled.\n");
+				printk(KERN_DEBUG "	TX room bit was handled.\n");
 			/* There's room in the FIFO for a full-sized packet. */
 			outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
 			netif_wake_queue (dev);
@@ -964,7 +953,7 @@
 		}
 
 		if (--i < 0) {
-			printk("%s: Infinite loop in interrupt, status %4.4x.\n",
+			printk(KERN_ERR "%s: Infinite loop in interrupt, status %4.4x.\n",
 				   dev->name, status);
 			/* Clear all interrupts. */
 			outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
@@ -975,7 +964,7 @@
 	}
 
 	if (el3_debug > 4) {
-		printk("%s: exiting interrupt, status %4.4x.\n", dev->name,
+		printk(KERN_DEBUG "%s: exiting interrupt, status %4.4x.\n", dev->name,
 			   inw(ioaddr + EL3_STATUS));
 	}
 	spin_unlock(&lp->lock);
@@ -1450,7 +1439,7 @@
 }
 
 /* Power Management support functions */
-#ifdef EL3_SUSPEND
+#ifdef CONFIG_PM
 
 static int
 el3_suspend(struct device *pdev, pm_message_t state)
@@ -1500,79 +1489,102 @@
 	return 0;
 }
 
-#endif /* EL3_SUSPEND */
-
-/* Parameters that may be passed into the module. */
-static int debug = -1;
-static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1};
-static int xcvr[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+#endif /* CONFIG_PM */
 
 module_param(debug,int, 0);
 module_param_array(irq, int, NULL, 0);
-module_param_array(xcvr, int, NULL, 0);
 module_param(max_interrupt_work, int, 0);
 MODULE_PARM_DESC(debug, "debug level (0-6)");
 MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
-MODULE_PARM_DESC(xcvr,"transceiver(s) (0=internal, 1=external)");
 MODULE_PARM_DESC(max_interrupt_work, "maximum events handled per interrupt");
-#if defined(__ISAPNP__)
+#ifdef CONFIG_PNP
 module_param(nopnp, int, 0);
 MODULE_PARM_DESC(nopnp, "disable ISA PnP support (0-1)");
-MODULE_DEVICE_TABLE(isapnp, el3_isapnp_adapters);
-#endif	/* __ISAPNP__ */
-MODULE_DESCRIPTION("3Com Etherlink III (3c509, 3c509B) ISA/PnP ethernet driver");
+#endif	/* CONFIG_PNP */
+MODULE_DESCRIPTION("3Com Etherlink III (3c509, 3c509B, 3c529, 3c579) ethernet driver");
 MODULE_LICENSE("GPL");
 
 static int __init el3_init_module(void)
 {
 	int ret = 0;
-	el3_cards = 0;
 
 	if (debug >= 0)
 		el3_debug = debug;
 
-	el3_root_dev = NULL;
-	while (el3_probe(el3_cards) == 0) {
-		if (irq[el3_cards] > 1)
-			el3_root_dev->irq = irq[el3_cards];
-		if (xcvr[el3_cards] >= 0)
-			el3_root_dev->if_port = xcvr[el3_cards];
-		el3_cards++;
+#ifdef CONFIG_PNP
+	if (!nopnp) {
+		ret = pnp_register_driver(&el3_pnp_driver);
+		if (!ret)
+			pnp_registered = 1;
+	}
+#endif
+	/* Select an open I/O location at 0x1*0 to do ISA contention select. */
+	/* Start with 0x110 to avoid some sound cards.*/
+	for (id_port = 0x110 ; id_port < 0x200; id_port += 0x10) {
+		if (!request_region(id_port, 1, "3c509-control"))
+			continue;
+		outb(0x00, id_port);
+		outb(0xff, id_port);
+		if (inb(id_port) & 0x01)
+			break;
+		else
+			release_region(id_port, 1);
+	}
+	if (id_port >= 0x200) {
+		id_port = 0;
+		printk(KERN_ERR "No I/O port available for 3c509 activation.\n");
+	} else {
+		ret = isa_register_driver(&el3_isa_driver, EL3_MAX_CARDS);
+		if (!ret)
+			isa_registered = 1;
 	}
-
 #ifdef CONFIG_EISA
 	ret = eisa_driver_register(&el3_eisa_driver);
+	if (!ret)
+		eisa_registered = 1;
 #endif
 #ifdef CONFIG_MCA
-	{
-		int err = mca_register_driver(&el3_mca_driver);
-		if (ret == 0)
-			ret = err;
-	}
+	ret = mca_register_driver(&el3_mca_driver);
+	if (!ret)
+		mca_registered = 1;
+#endif
+
+#ifdef CONFIG_PNP
+	if (pnp_registered)
+		ret = 0;
+#endif
+	if (isa_registered)
+		ret = 0;
+#ifdef CONFIG_EISA
+	if (eisa_registered)
+		ret = 0;
+#endif
+#ifdef CONFIG_MCA
+	if (mca_registered)
+		ret = 0;
 #endif
 	return ret;
 }
 
 static void __exit el3_cleanup_module(void)
 {
-	struct net_device *next_dev;
-
-	while (el3_root_dev) {
-		struct el3_private *lp = netdev_priv(el3_root_dev);
-
-		next_dev = lp->next_dev;
-		el3_common_remove (el3_root_dev);
-		el3_root_dev = next_dev;
-	}
-
+#ifdef CONFIG_PNP
+	if (pnp_registered)
+		pnp_unregister_driver(&el3_pnp_driver);
+#endif
+	if (isa_registered)
+		isa_unregister_driver(&el3_isa_driver);
+	if (id_port)
+		release_region(id_port, 1);
 #ifdef CONFIG_EISA
-	eisa_driver_unregister (&el3_eisa_driver);
+	if (eisa_registered)
+		eisa_driver_unregister(&el3_eisa_driver);
 #endif
 #ifdef CONFIG_MCA
-	mca_unregister_driver(&el3_mca_driver);
+	if (mca_registered)
+		mca_unregister_driver(&el3_mca_driver);
 #endif
 }
 
 module_init (el3_init_module);
 module_exit (el3_cleanup_module);
-


-- 
Ondrej Zary

^ permalink raw reply

* HTB(?) softlockup, vanilla 2.6.24
From: Denys Fedoryshchenko @ 2008-02-10 21:29 UTC (permalink / raw)
  To: netdev

It is very difficult to reproduce, happened after running about 1month. No 
changes done in classes at that time

Feb 10 15:53:22 SHAPER [ 8271.778915] BUG: NMI Watchdog detected LOCKUP
Feb 10 15:53:22 SHAPER on CPU1, eip c01f0e5d, registers:
Feb 10 15:53:22 SHAPER [ 8271.778952] Modules linked in:
Feb 10 15:53:22 SHAPER netconsole
Feb 10 15:53:22 SHAPER configfs
Feb 10 15:53:22 SHAPER softdog
Feb 10 15:53:22 SHAPER nf_nat_pptp
Feb 10 15:53:22 SHAPER nf_conntrack_pptp
Feb 10 15:53:22 SHAPER nf_conntrack_proto_gre
Feb 10 15:53:22 SHAPER nf_nat_proto_gre
Feb 10 15:53:22 SHAPER xt_tcpudp
Feb 10 15:53:22 SHAPER ipt_TTL
Feb 10 15:53:22 SHAPER ipt_ttl
Feb 10 15:53:22 SHAPER xt_NOTRACK
Feb 10 15:53:22 SHAPER iptable_raw
Feb 10 15:53:22 SHAPER iptable_mangle
Feb 10 15:53:22 SHAPER ifb
Feb 10 15:53:22 SHAPER e1000e
Feb 10 15:53:22 SHAPER em_nbyte
Feb 10 15:53:22 SHAPER cls_tcindex
Feb 10 15:53:22 SHAPER act_gact
Feb 10 15:53:22 SHAPER cls_rsvp
Feb 10 15:53:22 SHAPER sch_htb
Feb 10 15:53:22 SHAPER cls_fw
Feb 10 15:53:22 SHAPER act_mirred
Feb 10 15:53:22 SHAPER em_u32
Feb 10 15:53:22 SHAPER sch_red
Feb 10 15:53:22 SHAPER sch_sfq
Feb 10 15:53:22 SHAPER sch_tbf
Feb 10 15:53:22 SHAPER sch_teql
Feb 10 15:53:22 SHAPER cls_basic
Feb 10 15:53:22 SHAPER act_police
Feb 10 15:53:22 SHAPER sch_gred
Feb 10 15:53:22 SHAPER act_pedit
Feb 10 15:53:22 SHAPER sch_hfsc
Feb 10 15:53:22 SHAPER cls_rsvp6
Feb 10 15:53:22 SHAPER sch_ingress
Feb 10 15:53:22 SHAPER em_meta
Feb 10 15:53:22 SHAPER em_text
Feb 10 15:53:22 SHAPER act_ipt
Feb 10 15:53:22 SHAPER sch_dsmark
Feb 10 15:53:22 SHAPER sch_prio
Feb 10 15:53:22 SHAPER sch_netem
Feb 10 15:53:22 SHAPER act_simple
Feb 10 15:53:22 SHAPER cls_u32
Feb 10 15:53:22 SHAPER em_cmp
Feb 10 15:53:22 SHAPER sch_cbq
Feb 10 15:53:22 SHAPER cls_route
Feb 10 15:53:22 SHAPER xt_TCPMSS
Feb 10 15:53:22 SHAPER iptable_nat
Feb 10 15:53:22 SHAPER nf_conntrack_ipv4
Feb 10 15:53:22 SHAPER ipt_LOG
Feb 10 15:53:22 SHAPER ipt_MASQUERADE
Feb 10 15:53:22 SHAPER ipt_REDIRECT
Feb 10 15:53:22 SHAPER nf_nat
Feb 10 15:53:22 SHAPER nf_conntrack
Feb 10 15:53:22 SHAPER nfnetlink
Feb 10 15:53:22 SHAPER iptable_filter
Feb 10 15:53:22 SHAPER ip_tables
Feb 10 15:53:22 SHAPER x_tables
Feb 10 15:53:22 SHAPER 8021q
Feb 10 15:53:22 SHAPER tun
Feb 10 15:53:22 SHAPER tulip
Feb 10 15:53:22 SHAPER r8169
Feb 10 15:53:22 SHAPER sky2
Feb 10 15:53:22 SHAPER via_velocity
Feb 10 15:53:22 SHAPER via_rhine
Feb 10 15:53:22 SHAPER sis900
Feb 10 15:53:22 SHAPER ne2k_pci
Feb 10 15:53:22 SHAPER 8390
Feb 10 15:53:22 SHAPER skge
Feb 10 15:53:22 SHAPER tg3
Feb 10 15:53:22 SHAPER 8139too
Feb 10 15:53:22 SHAPER e1000
Feb 10 15:53:22 SHAPER e100
Feb 10 15:53:22 SHAPER usb_storage
Feb 10 15:53:22 SHAPER mtdblock
Feb 10 15:53:22 SHAPER mtd_blkdevs
Feb 10 15:53:22 SHAPER usbhid
Feb 10 15:53:22 SHAPER uhci_hcd
Feb 10 15:53:22 SHAPER ehci_hcd
Feb 10 15:53:22 SHAPER ohci_hcd
Feb 10 15:53:22 SHAPER usbcore
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER [ 8271.779291]
Feb 10 15:53:22 SHAPER [ 8271.779307] Pid: 0, comm: swapper Not tainted 
(2.6.24-build-0021 #26)
Feb 10 15:53:22 SHAPER [ 8271.779327] EIP: 0060:[<c01f0e5d>] EFLAGS: 00000082 
CPU: 1
Feb 10 15:53:22 SHAPER [ 8271.779349] EIP is at __rb_rotate_right+0x5/0x50
Feb 10 15:53:22 SHAPER [ 8271.779366] EAX: f76494a4 EBX: f76494a4 ECX: 
f76494a4 EDX: c1ff5f80
Feb 10 15:53:22 SHAPER [ 8271.779386] ESI: f76494a4 EDI: c1ff5f80 EBP: 
00000000 ESP: f7c29c70
Feb 10 15:53:22 SHAPER [ 8271.779406]  DS: 007b ES: 007b FS: 00d8 GS: 0000 
SS: 0068
Feb 10 15:53:22 SHAPER [ 8271.779425] Process swapper (pid: 0, ti=f7c28000 
task=f7c20a60 task.ti=f7c28000)
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER [ 8271.779446] Stack:
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER c01f0ef4
Feb 10 15:53:22 SHAPER c1ff5f80
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER f76494a8
Feb 10 15:53:22 SHAPER c1ff5f78
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER [ 8271.779493]
Feb 10 15:53:22 SHAPER [ 8271.779307] Pid: 0, comm: swapper Not tainted 
(2.6.24-build-0021 #26)
Feb 10 15:53:22 SHAPER [ 8271.779327] EIP: 0060:[<c01f0e5d>] EFLAGS: 00000082 
CPU: 1
Feb 10 15:53:22 SHAPER [ 8271.779349] EIP is at __rb_rotate_right+0x5/0x50
Feb 10 15:53:22 SHAPER [ 8271.779366] EAX: f76494a4 EBX: f76494a4 ECX: 
f76494a4 EDX: c1ff5f80
Feb 10 15:53:22 SHAPER [ 8271.779386] ESI: f76494a4 EDI: c1ff5f80 EBP: 
00000000 ESP: f7c29c70
Feb 10 15:53:22 SHAPER [ 8271.779406]  DS: 007b ES: 007b FS: 00d8 GS: 0000 
SS: 0068
Feb 10 15:53:22 SHAPER [ 8271.779425] Process swapper (pid: 0, ti=f7c28000 
task=f7c20a60 task.ti=f7c28000)
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER [ 8271.779446] Stack:
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER c01f0ef4
Feb 10 15:53:22 SHAPER c1ff5f80
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER f76494a8
Feb 10 15:53:22 SHAPER c1ff5f78
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER [ 8271.779493]
Feb 10 15:53:22 SHAPER 00000000
Feb 10 15:53:22 SHAPER c0134741
Feb 10 15:53:22 SHAPER 00000001
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER f76494a4
Feb 10 15:53:22 SHAPER d2607800
Feb 10 15:53:22 SHAPER 00000778
Feb 10 15:53:22 SHAPER c1ff5f78
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER [ 8271.779541]
Feb 10 15:53:22 SHAPER c0134d64
Feb 10 15:53:22 SHAPER 00fac3e0
Feb 10 15:53:22 SHAPER c1ff5f78
Feb 10 15:53:22 SHAPER 00000000
Feb 10 15:53:22 SHAPER 00000286
Feb 10 15:53:22 SHAPER f7649000
Feb 10 15:53:22 SHAPER f75f6800
Feb 10 15:53:22 SHAPER 00000000
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER [ 8271.779589] Call Trace:
Feb 10 15:53:22 SHAPER [ 8271.779620]  [<c01f0ef4>]
Feb 10 15:53:22 SHAPER rb_insert_color+0x4c/0xad
Feb 10 15:53:22 SHAPER [ 8271.779641]  [<c0134741>]
Feb 10 15:53:22 SHAPER enqueue_hrtimer+0xd7/0xe2
Feb 10 15:53:22 SHAPER [ 8271.779661]  [<c0134d64>]
Feb 10 15:53:22 SHAPER hrtimer_start+0xda/0xf4
Feb 10 15:53:22 SHAPER [ 8271.779682]  [<c027ec43>]
Feb 10 15:53:22 SHAPER qdisc_watchdog_schedule+0x1e/0x21
Feb 10 15:53:22 SHAPER [ 8271.779704]  [<f89f8fe6>]
Feb 10 15:53:22 SHAPER htb_dequeue+0x6ef/0x6fb [sch_htb]
Feb 10 15:53:22 SHAPER [ 8271.779726]  [<f89e33e0>]
Feb 10 15:53:22 SHAPER sfq_drop+0x5e/0x221 [sch_sfq]
Feb 10 15:53:22 SHAPER [ 8271.779749]  [<c027dfdf>]
Feb 10 15:53:22 SHAPER [ 8271.779749]  [<c027dfdf>]
Feb 10 15:53:22 SHAPER tc_classify+0x17/0x7c
Feb 10 15:53:22 SHAPER [ 8271.779771]  [<f89f76e1>]
Feb 10 15:53:22 SHAPER htb_classify+0xf0/0x157 [sch_htb]
Feb 10 15:53:22 SHAPER [ 8271.779794]  [<c027da0e>]
Feb 10 15:53:22 SHAPER __qdisc_run+0x2a/0x163
Feb 10 15:53:22 SHAPER [ 8271.779814]  [<c02728cc>]
Feb 10 15:53:22 SHAPER dev_queue_xmit+0x18b/0x2ab
Feb 10 15:53:22 SHAPER [ 8271.779835]  [<f89eb189>]
Feb 10 15:53:22 SHAPER tcf_mirred+0x14b/0x168 [act_mirred]
Feb 10 15:53:22 SHAPER [ 8271.779857]  [<f89eb03e>]
Feb 10 15:53:22 SHAPER tcf_mirred+0x0/0x168 [act_mirred]
Feb 10 15:53:22 SHAPER [ 8271.779878]  [<c0280019>]
Feb 10 15:53:22 SHAPER tcf_action_exec+0x3d/0x6f
Feb 10 15:53:22 SHAPER [ 8271.779898]  [<f89b55a2>]
Feb 10 15:53:22 SHAPER u32_classify+0x114/0x23e [cls_u32]
Feb 10 15:53:22 SHAPER [ 8271.779922]  [<f897915e>]
Feb 10 15:53:22 SHAPER ipv4_confirm+0x34/0x39 [nf_conntrack_ipv4]
Feb 10 15:53:22 SHAPER [ 8271.779945]  [<f897912a>]
Feb 10 15:53:22 SHAPER ipv4_confirm+0x0/0x39 [nf_conntrack_ipv4]
Feb 10 15:53:22 SHAPER [ 8271.779967]  [<c027da81>]
Feb 10 15:53:22 SHAPER __qdisc_run+0x9d/0x163
Feb 10 15:53:22 SHAPER [ 8271.779989]  [<c027ddf8>]
Feb 10 15:53:22 SHAPER tc_classify_compat+0x28/0x56
Feb 10 15:53:22 SHAPER [ 8271.780009]  [<c027dfdf>]
Feb 10 15:53:22 SHAPER tc_classify+0x17/0x7c
Feb 10 15:53:22 SHAPER [ 8271.780028]  [<c027010d>]
Feb 10 15:53:22 SHAPER netif_receive_skb+0x250/0x3e2
Feb 10 15:53:22 SHAPER [ 8271.780049]  [<f89c70e3>]
Feb 10 15:53:22 SHAPER ingress_enqueue+0x16/0x4f [sch_ingress]
Feb 10 15:53:22 SHAPER [ 8271.780071]  [<c02700f3>]
Feb 10 15:53:22 SHAPER netif_receive_skb+0x236/0x3e2
Feb 10 15:53:22 SHAPER [ 8271.780090]  [<c028ac4d>]
Feb 10 15:53:22 SHAPER ip_rcv+0x1fc/0x237
Feb 10 15:53:22 SHAPER [ 8271.780109]  [<c02835e6>]
Feb 10 15:53:22 SHAPER netlink_seq_next+0x1f/0xa8
Feb 10 15:53:22 SHAPER [ 8271.780131]  [<f88d39a1>]
Feb 10 15:53:22 SHAPER e100_poll+0x157/0x26a [e100]
Feb 10 15:53:22 SHAPER [ 8271.780157]  [<c0272110>]
Feb 10 15:53:22 SHAPER net_rx_action+0x8d/0x1ad
Feb 10 15:53:22 SHAPER [ 8271.780176]  [<c02722d8>]
Feb 10 15:53:22 SHAPER net_tx_action+0xa8/0xcc
Feb 10 15:53:22 SHAPER [ 8271.780197]  [<c0126a82>]
Feb 10 15:53:22 SHAPER __do_softirq+0x5d/0xc1
Feb 10 15:53:22 SHAPER [ 8271.780217]  [<c0126b18>]
Feb 10 15:53:22 SHAPER do_softirq+0x32/0x36
Feb 10 15:53:22 SHAPER [ 8271.780236]  [<c0126d6a>]
Feb 10 15:53:22 SHAPER irq_exit+0x38/0x6b
Feb 10 15:53:22 SHAPER [ 8271.780254]  [<c01074f5>]
Feb 10 15:53:22 SHAPER do_IRQ+0x5c/0x73
Feb 10 15:53:22 SHAPER [ 8271.780275]  [<c0106cc2>]
Feb 10 15:53:22 SHAPER do_nmi+0x97/0x24d
Feb 10 15:53:22 SHAPER [ 8271.780295]  [<c010577b>]
Feb 10 15:53:22 SHAPER common_interrupt+0x23/0x28
Feb 10 15:53:22 SHAPER [ 8271.780317]  [<c0103243>]
Feb 10 15:53:22 SHAPER mwait_idle_with_hints+0x3c/0x40
Feb 10 15:53:22 SHAPER [ 8271.780338]  [<c0103247>]
Feb 10 15:53:22 SHAPER mwait_idle+0x0/0xa
Feb 10 15:53:22 SHAPER [ 8271.780356]  [<c010357e>]
Feb 10 15:53:22 SHAPER cpu_idle+0x98/0xb9
Feb 10 15:53:22 SHAPER [ 8271.780380]  =======================
Feb 10 15:53:22 SHAPER [ 8271.780396] Code:
Feb 10 15:53:22 SHAPER 09
Feb 10 15:53:22 SHAPER f0
Feb 10 15:53:22 SHAPER 85
Feb 10 15:53:22 SHAPER f6
Feb 10 15:53:22 SHAPER 89
Feb 10 15:53:22 SHAPER 02
Feb 10 15:53:22 SHAPER 74
Feb 10 15:53:22 SHAPER 0f
Feb 10 15:53:22 SHAPER 3b
Feb 10 15:53:22 SHAPER 5e
Feb 10 15:53:22 SHAPER 08
Feb 10 15:53:22 SHAPER 75
Feb 10 15:53:22 SHAPER 05
Feb 10 15:53:22 SHAPER 89
Feb 10 15:53:22 SHAPER 56
Feb 10 15:53:22 SHAPER 08
Feb 10 15:53:22 SHAPER eb
Feb 10 15:53:22 SHAPER 07
Feb 10 15:53:22 SHAPER 89
Feb 10 15:53:22 SHAPER 56
Feb 10 15:53:22 SHAPER 04
Feb 10 15:53:22 SHAPER eb
Feb 10 15:53:22 SHAPER 02
Feb 10 15:53:22 SHAPER 89
Feb 10 15:53:22 SHAPER 17
Feb 10 15:53:22 SHAPER 8b
Feb 10 15:53:22 SHAPER 03
Feb 10 15:53:22 SHAPER 83
Feb 10 15:53:22 SHAPER e0
Feb 10 15:53:22 SHAPER 03
Feb 10 15:53:22 SHAPER 09
Feb 10 15:53:22 SHAPER d0
Feb 10 15:53:22 SHAPER 89
Feb 10 15:53:22 SHAPER 03
Feb 10 15:53:22 SHAPER 5b
Feb 10 15:53:22 SHAPER 5e
Feb 10 15:53:22 SHAPER 5f
Feb 10 15:53:22 SHAPER c3
Feb 10 15:53:22 SHAPER 57
Feb 10 15:53:22 SHAPER 89
Feb 10 15:53:22 SHAPER d7
Feb 10 15:53:22 SHAPER 56
Feb 10 15:53:22 SHAPER 53
Feb 10 15:53:22 SHAPER
Feb 10 15:53:22 SHAPER c3
Feb 10 15:53:22 SHAPER 8b
Feb 10 15:53:22 SHAPER 50
Feb 10 15:53:22 SHAPER 08
Feb 10 15:53:22 SHAPER 8b
Feb 10 15:53:22 SHAPER 30
Feb 10 15:53:22 SHAPER 8b
Feb 10 15:53:22 SHAPER 4a
Feb 10 15:53:22 SHAPER 04
Feb 10 15:53:22 SHAPER 83
Feb 10 15:53:22 SHAPER e6
Feb 10 15:53:22 SHAPER fc
Feb 10 15:53:22 SHAPER 85
Feb 10 15:53:22 SHAPER c9
Feb 10 15:53:22 SHAPER 89
Feb 10 15:53:22 SHAPER 48
Feb 10 15:53:22 SHAPER 08
Feb 10 15:53:22 SHAPER 74
Feb 10 15:53:22 SHAPER 09
Feb 10 15:53:22 SHAPER 8b
Feb 10 15:53:22 SHAPER


--
Denys Fedoryshchenko
Technical Manager
Virtual ISP S.A.L.


^ permalink raw reply

* Re: Pull request for 'r6040' branch
From: Florian Fainelli @ 2008-02-10 21:32 UTC (permalink / raw)
  To: Francois Romieu; +Cc: jeff, netdev, Sten Wang, Andrew Morton
In-Reply-To: <20080205223452.GA8361@electric-eye.fr.zoreil.com>

Hi Francois, Jeff,

Le mardi 5 février 2008, Francois Romieu a écrit :
> Please pull from branch 'r6040' in repository
>
> git://git.kernel.org/pub/scm/linux/kernel/git/romieu/netdev-2.6.git r6040
>
> to get the changes below.
>
> I have simply rebased the r6040 branch from december on top of
> Linus's latest head and given each patch a compile test.
> The content is identical to Florian's initial work (minus the
> removal of the unused TIMER_WUT and a duplicate update of an
> error counter).

Thank you very much Francois. Jeff, any news on this ?
-- 
Cordialement, Florian Fainelli
------------------------------

^ permalink raw reply

* [2.6.25-rc1] Locks in udp_recvmsg()?
From: Tetsuo Handa @ 2008-02-11  2:20 UTC (permalink / raw)
  To: netdev

Hello.

I found that udp_recvmsg() in net/ipv4/udp.c for 2.6.25-rc1 calls
lock_sock() only when it releases the datagram (i.e. out_free: and csum_copy_err:).
Is it correct to call __skb_recv_datagram() without calling lock_sock()
when it acquires the datagram (i.e. try_again:)?

Regards.

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox