On Tue, Jan 14, 2003 at 05:51:31PM -0800, David Brownell wrote: > Kari Hameenaho wrote: > > >This seems to have started in 2.5.57, finding the devices at boot used to > >work in 2.5.56. > > I was wonder if the probing logic (driver core) got something > wrong ... I just saw a situation where modprobing the driver > wouldn't make it bind to devices that were already present. > It had to be the other way around: driver first, then device.
Yes, something changed there. Here's a patch from Pat Mochel to possibly fix this problem. I haven't tested it yet, so use it at your own risk (and let me know if it works for you...) thanks, greg k-h ===== drivers/base/bus.c 1.38 vs edited ===== --- 1.38/drivers/base/bus.c Mon Jan 13 10:34:12 2003 +++ edited/drivers/base/bus.c Tue Jan 14 16:41:22 2003 @@ -256,22 +256,27 @@ * * If we find a match, we call @drv->probe(@dev) if it exists, and * call attach() above. + * + * If the deivce is bound to the driver, we return 1. If the bus + * reports that they do not match (bus->match() returns FALSE), we + * return 0. Otherwise, we return the error that drv->probe() + * returns. */ static int bus_match(struct device * dev, struct device_driver * drv) { - int error = -ENODEV; + int ret = 0; if (dev->bus->match(dev,drv)) { dev->driver = drv; if (drv->probe) { - if ((error = drv->probe(dev))) { + if ((ret = drv->probe(dev))) { dev->driver = NULL; - return error; + return ret; } } device_bind_driver(dev); - error = 0; + ret = 1; } - return error; + return ret; } @@ -298,8 +303,11 @@ list_for_each(entry,&bus->drivers.list) { struct device_driver * drv = to_drv(entry); - if (!(error = bus_match(dev,drv))) + if ((error = bus_match(dev,drv))) { + if (error > 1) + error = 0; break; + } } return error; } @@ -322,6 +330,7 @@ { struct bus_type * bus = drv->bus; struct list_head * entry; + int error = 0; if (!bus->match) return 0; @@ -329,8 +338,12 @@ list_for_each(entry,&bus->devices.list) { struct device * dev = container_of(entry,struct device,bus_list); if (!dev->driver) { - if (!bus_match(dev,drv) && dev->driver) - devclass_add_device(dev); + if ((error = bus_match(dev,drv))) { + if (error > 0) + error = devclass_add_device(dev); + else + break; + } } } return 0; @@ -396,7 +409,8 @@ if ((error = device_attach(dev))) list_del_init(&dev->bus_list); up_write(&dev->bus->subsys.rwsem); - sysfs_create_link(&bus->devices.kobj,&dev->kobj,dev->bus_id); + if (!error) + sysfs_create_link(&bus->devices.kobj,&dev->kobj,dev->bus_id); } return error; } ------------------------------------------------------- This SF.NET email is sponsored by: Take your first step towards giving your online business a competitive advantage. Test-drive a Thawte SSL certificate - our easy online guide will show you how. Click here to get started: http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0027en _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel