From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pete Zaitcev Date: Thu, 12 Jul 2001 18:04:22 +0000 Subject: Re: [linux-usb-devel] duplication of devices, hotplug, pegasus (a lot ;-) Message-Id: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org > From: Norbert Preining > To: linux-usb-devel@lists.sourceforge.net, > linux-hotplug-devel@lists.sourceforge.net > Date: Thu, 12 Jul 2001 11:42:00 +0200 > I get a duplication of devices with linux-2.4.6, ohci: Try this: diff -ur linux-2.4.5/drivers/usb/usb.c linux-2.4.5-tr5/drivers/usb/usb.c --- linux-2.4.5/drivers/usb/usb.c Sat Apr 28 11:28:09 2001 +++ linux-2.4.5-tr5/drivers/usb/usb.c Tue May 29 18:22:19 2001 @@ -688,10 +688,12 @@ return -1; } + down(&dev->serialize); + interface = dev->actconfig->interface + ifnum; if (usb_interface_claimed(interface)) - return -1; + goto out_err; private = NULL; for (tmp = usb_driver_list.next; tmp != &usb_driver_list;) { @@ -699,7 +701,6 @@ driver = list_entry(tmp, struct usb_driver, driver_list); tmp = tmp->next; - down(&driver->serialize); id = driver->id_table; /* new style driver? */ if (id) { @@ -707,7 +708,9 @@ interface->act_altsetting = i; id = usb_match_id(dev, interface, id); if (id) { + down(&driver->serialize); private = driver->probe(dev,ifnum,id); + up(&driver->serialize); if (private != NULL) break; } @@ -717,15 +720,21 @@ interface->act_altsetting = 0; } else /* "old style" driver */ + { + down(&driver->serialize); private = driver->probe(dev, ifnum, NULL); + up(&driver->serialize); + } - up(&driver->serialize); if (private) { usb_driver_claim_interface(driver, interface, private); + up(&dev->serialize); return 0; } } +out_err: + up(&dev->serialize); return -1; } @@ -924,6 +933,8 @@ atomic_set(&dev->refcnt, 1); INIT_LIST_HEAD(&dev->inodes); INIT_LIST_HEAD(&dev->filelist); + + init_MUTEX(&dev->serialize); dev->bus->op->allocate(dev); diff -ur linux-2.4.5/include/linux/usb.h linux-2.4.5-tr5/include/linux/usb.h --- linux-2.4.5/include/linux/usb.h Fri May 25 18:02:43 2001 +++ linux-2.4.5-tr5/include/linux/usb.h Tue May 29 18:12:33 2001 @@ -595,6 +595,7 @@ int slow; /* Slow device? */ atomic_t refcnt; /* Reference count */ + struct semaphore serialize; unsigned int toggle[2]; /* one bit for each endpoint ([0] = IN, [1] = OUT) */ unsigned int halted[2]; /* endpoint halts; one bit per endpoint # & direction; */ > Another problem: The pegasus stops working while downloading big files > and the kernel oopses [...] Sorry, not my piece of code. Try to identify the pegasus maintainer... -- Pete _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net http://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel