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