Hi Nathael, Am Mittwoch, den 24.01.2007, 13:01 +0100 schrieb Nathael Pajani: > Hi! > > I found a bug in the USB core (present in linux-2.6.20-rc5-git2 with your > patch > >from http://kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/: > gregkh-03-usb-2.6.20-rc5-git2.patch ) > > in the core/driver.c file, function store_new_id() > the problem comes from the call to list_add_tail() which is done as > list_add_tail(head, new) instead of list_add_tail(new, head) > > This is OK for the first inclusion, but not for the second, and any following > ones, because previously added entries are no more referenced. > This also creates a memory leak (we loose the reference to the alocated > memory).
> See attached patch. Ouch, didn't see this one. (Note: i re-posted the original patches from gregkh, so this is probably my mistake. I didn't test it with more than one id per driver :-( ) > I'm actually working on dynamic ids for a serial driver (using the generic > part > for all but the new features, which are dynamic ids and static allocation of > ttyUSB numbers depending on geographic position on USB bus.) > > I saw the modifications you made for dynamic ids in usb-serial, but why not > exporting usb_match_dynamic_id() from core/driver.c instead of rewriting it > in > serial/usb-serial.c > > I know usb_match_dynamic_id() needs a usb_driver and not a usb_serial_driver, > but the usb_serial_driver struct now contain a pointer to a usb_driver. > Using this would enable the new serial driver to create it's usb_driver > struct > with ".no_dynamic_id = 0," and update this pointer (I did not check what it > is > used for yet, but I think this is the goal). > This creates the sysfs new_id file automatically, and ids added with this > file > are then seen by the usb-serial. > > Another way should be to call the probe function registered in the > usb_serial_driver struct, and let the device do the matching. The problem by adding the new_id to the usb_driver is, that more than one usb_serial_driver can point to the same usb_driver. For example, when you look at the edgeport device tables, in io_tables.h, there are different devices for different port counts, but the usb_driver is the same. To let the usb serial driver select the correct usb_serial_driver when a new device is added it isn't enough to now the usb_driver but also to now the usb_serial_driver. To solve this the new_id is added under the serial driver directory at: /sys/bus/usb-serial/drivers/<driver>/new_id When a new id is added to this file, it is automatically added to the corresponding usb_driver, thats why the pointer form usb_serial_driver is added to the usb_driver. Another possible solution is to dump the usb_serial _bus_ entirely and use normal tty Devices and for each usb_serial_driver exactly one usb_driver. But this is a very big change. Yours sincerely, Johannes Hölzl ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel