[PATCH] testing for probe errors in base/bus.c

From: Janice M Girouard
Date: Fri Aug 08 2003 - 13:56:51 EST



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.


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);
}
}
}