Messages in this thread Patch in this message | | | Date | Fri, 08 Aug 2003 13:47:25 -0500 | From | Janice M Girouard <> | Subject | [PATCH] testing for probe errors in base/bus.c |
| |
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); } } }
| |