On Thu, 1 Jan 2009, Alon Bar-Lev wrote: > > > Can you please verify that it works at your system without CONFIG_USB_DEVICEFS? > > > > I just tried it. You're right; it doesn't work. > > Oh... great! > So I did not waste about 8 hours of thinking something wrong with me :) > Will you support this mode? Yes. The problem was caused by confusion between chardevs and classdevs. If you had enabled CONFIG_USB_DEVICE_CLASS then your program would have worked. But since that option is deprecated, obviously it shouldn't be enabled. The patch below should straighten out the problem. Alan Stern Index: 2.6.28/drivers/usb/core/devio.c =================================================================== --- 2.6.28.orig/drivers/usb/core/devio.c +++ 2.6.28/drivers/usb/core/devio.c @@ -1703,7 +1703,7 @@ const struct file_operations usbdev_file .release = usbdev_release, }; -void usb_fs_classdev_common_remove(struct usb_device *udev) +static void usbdev_remove(struct usb_device *udev) { struct dev_state *ps; struct siginfo sinfo; @@ -1745,10 +1745,15 @@ static void usb_classdev_remove(struct u { if (dev->usb_classdev) device_unregister(dev->usb_classdev); - usb_fs_classdev_common_remove(dev); } -static int usb_classdev_notify(struct notifier_block *self, +#else +#define usb_classdev_add(dev) 0 +#define usb_classdev_remove(dev) do {} while (0) + +#endif + +static int usbdev_notify(struct notifier_block *self, unsigned long action, void *dev) { switch (action) { @@ -1758,15 +1763,15 @@ static int usb_classdev_notify(struct no break; case USB_DEVICE_REMOVE: usb_classdev_remove(dev); + usbdev_remove(dev); break; } return NOTIFY_OK; } static struct notifier_block usbdev_nb = { - .notifier_call = usb_classdev_notify, + .notifier_call = usbdev_notify, }; -#endif static struct cdev usb_device_cdev; @@ -1801,9 +1806,8 @@ int __init usb_devio_init(void) * to /sys/dev */ usb_classdev_class->dev_kobj = NULL; - - usb_register_notify(&usbdev_nb); #endif + usb_register_notify(&usbdev_nb); out: return retval; @@ -1814,8 +1818,8 @@ error_cdev: void usb_devio_cleanup(void) { -#ifdef CONFIG_USB_DEVICE_CLASS usb_unregister_notify(&usbdev_nb); +#ifdef CONFIG_USB_DEVICE_CLASS class_destroy(usb_classdev_class); #endif cdev_del(&usb_device_cdev); Index: 2.6.28/drivers/usb/core/inode.c =================================================================== --- 2.6.28.orig/drivers/usb/core/inode.c +++ 2.6.28/drivers/usb/core/inode.c @@ -718,7 +718,6 @@ static void usbfs_remove_device(struct u fs_remove_file (dev->usbfs_dentry); dev->usbfs_dentry = NULL; } - usb_fs_classdev_common_remove(dev); } static int usbfs_notify(struct notifier_block *self, unsigned long action, void *dev) Index: 2.6.28/drivers/usb/core/usb.h =================================================================== --- 2.6.28.orig/drivers/usb/core/usb.h +++ 2.6.28/drivers/usb/core/usb.h @@ -145,7 +145,6 @@ extern struct usb_driver usbfs_driver; extern const struct file_operations usbfs_devices_fops; extern const struct file_operations usbdev_file_operations; extern void usbfs_conn_disc_event(void); -extern void usb_fs_classdev_common_remove(struct usb_device *udev); extern int usb_devio_init(void); extern void usb_devio_cleanup(void); -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html