[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20070813075453.GA4257@1wt.eu>
Date: Mon, 13 Aug 2007 09:54:53 +0200
From: Willy Tarreau <w@....eu>
To: uke Kok <auke-jan.h.kok@...el.com>,
"Brandeburg, Jesse" <jesse.brandeburg@...el.com>
Cc: netdev@...r.kernel.org
Subject: [PATCH] e100 module loads 1/2 times
Hi Auke, Jesse,
for a long time, I've been annoyed by version 3.5.17 of the e100 driver
which refuses to load on first time and only loads on second time. Since
I always had the original 2.3.43 driver in kernel 2.4, I did not care
that much. Recently, I encountered real troubles with 2.3.43 in a 802.1q
setup (basically it did not untag incoming frames). So I decided to give
3.5.17 a second try. Same problem, I had to load it twice.
I finally found the problem in e100_init_module(). Up to 3.5.14, the
return of pci_module_init() was returned. This one equals zero if
everything went fine, <0 otherwise, which is compatible with init_module().
With 3.5.17, the result comes from pci_register_driver(), which returns
the number of devices registered. So the problem now makes sense :
- first call: the driver registers itself and returns non-zero, which
is an error for insmod
- second call: the driver cannot register again and returns zero new
drivers, which is good for insmod.
Note that e1000 has a related bug : it uses the return from pci_module_init()
to decide whether or not to register a reboot notifier. Fortunately, the
test is performed with ret>=0, which matches ==0 and not <0 (errors), so
this works as a side effect.
The obvious fix for e100 reusing pci_module_init is below. Also, since
e100-2.3.43 does not work at all with vlans in 2.4, I was thinking about
upgrading it to 3.5.17. It would also be the same version as in 2.6,
simplifying its long-term maintenance. What do you think about this ?
Best regards,
Willy
--- e100-3.5.17/src/e100.c.orig 2007-08-13 08:53:18 +0200
+++ e100-3.5.17/src/e100.c 2007-08-13 09:24:56 +0200
@@ -2934,13 +2934,13 @@
printk(KERN_INFO PFX "%s\n", DRV_COPYRIGHT);
}
#ifdef E100_USE_REBOOT_NOTIFIER
- retval = pci_register_driver(&e100_driver);
- if (retval >= 0)
+ retval = pci_module_init(&e100_driver);
+ if (retval == 0)
register_reboot_notifier(&e100_notifier_reboot);
return retval;
#else
- return pci_register_driver(&e100_driver);
+ return pci_module_init(&e100_driver);
#endif
}
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists