linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] testing for probe errors in base/bus.c
@ 2003-08-08 18:47 Janice M Girouard
  0 siblings, 0 replies; only message in thread
From: Janice M Girouard @ 2003-08-08 18:47 UTC (permalink / raw)
  To: linux-kernel

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


Currently if an error is detected when probing a device,
this error is not reported.  Generally, an error value from
errno.h will be returned when the driver->probe function
fails.  However these errors are not logged, and the device
fails silently.

I've looked at e1000, tg3, 3c59x, acenic, hp, and many
others... all of whom exibit this behaviour.

The attached patch logs all errors, with the exception
of -ENODEV, since it is normal to receive this error when
matching drivers to devices.



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

diff -Naur linux-2.6.0-test2.orig.bus/drivers/base/bus.c linux-2.6.0-test2.my.bus/drivers/base/bus.c
--- linux-2.6.0-test2.orig.bus/drivers/base/bus.c	2003-08-07 16:14:31.000000000 -0500
+++ linux-2.6.0-test2.my.bus/drivers/base/bus.c	2003-08-07 21:14:32.000000000 -0500
@@ -287,6 +287,7 @@
 {
  	struct bus_type * bus = dev->bus;
 	struct list_head * entry;
+	int error;
 
 	if (dev->driver) {
 		device_bind_driver(dev);
@@ -296,8 +297,15 @@
 	if (bus->match) {
 		list_for_each(entry,&bus->drivers.list) {
 			struct device_driver * drv = to_drv(entry);
-			if (!bus_match(dev,drv))
-				return 1;
+			error = bus_match(dev,drv);
+			if (!error )  
+				/* success, driver matched */
+				return 1; 
+			if (error != -ENODEV) 
+				/* driver matched but the probe failed */
+				printk(KERN_WARNING 
+				    "%s: probe of %s failed with error %d\n",
+				    drv->name, dev->bus_id, error);
 		}
 	}
 
@@ -314,13 +322,14 @@
  *	If bus_match() returns 0 and the @dev->driver is set, we've found
  *	a compatible pair.
  *
- *	Note that we ignore the error from bus_match(), since it's perfectly
- *	valid for a driver not to bind to any devices.
+ *	Note that we ignore the -ENODEV error from bus_match(), since it's 
+ *	perfectly valid for a driver not to bind to any devices.
  */
 void driver_attach(struct device_driver * drv)
 {
 	struct bus_type * bus = drv->bus;
 	struct list_head * entry;
+	int error;
 
 	if (!bus->match)
 		return;
@@ -328,7 +337,12 @@
 	list_for_each(entry,&bus->devices.list) {
 		struct device * dev = container_of(entry,struct device,bus_list);
 		if (!dev->driver) {
-			bus_match(dev,drv);
+			error = bus_match(dev,drv);
+			if (error && (error != -ENODEV))
+				/* driver matched but the probe failed */
+				printk(KERN_WARNING 
+				    "%s: probe of %s failed with error %d\n",
+				    drv->name, dev->bus_id, error);
 		}
 	}
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-08-08 18:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-08-08 18:47 [PATCH] testing for probe errors in base/bus.c Janice M Girouard

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).