ChangeSet 1.1123.18.11, 2003/08/13 13:36:06-07:00, [EMAIL PROTECTED]
[PATCH] USB: fix usb class device sysfs representation.
Again, I messed up the usage, now we are safe from devices being removed.
This fixes a number of error reports from users.
drivers/usb/core/file.c | 49 +++++++++++++++++++++++++++++++-----------------
include/linux/usb.h | 3 --
2 files changed, 33 insertions(+), 19 deletions(-)
diff -Nru a/drivers/usb/core/file.c b/drivers/usb/core/file.c
--- a/drivers/usb/core/file.c Fri Aug 15 10:46:31 2003
+++ b/drivers/usb/core/file.c Fri Aug 15 10:46:31 2003
@@ -66,8 +66,15 @@
.open = usb_open,
};
+static void release_usb_class_dev(struct class_device *class_dev)
+{
+ dbg("%s - %s", __FUNCTION__, class_dev->class_id);
+ kfree(class_dev);
+}
+
static struct class usb_class = {
- .name = "usb",
+ .name = "usb",
+ .release = &release_usb_class_dev,
};
int usb_major_init(void)
@@ -91,9 +98,8 @@
static ssize_t show_dev(struct class_device *class_dev, char *buf)
{
- struct usb_interface *intf = class_dev_to_usb_interface(class_dev);
- dev_t dev = MKDEV(USB_MAJOR, intf->minor);
- return print_dev_t(buf, dev);
+ int minor = (int)class_get_devdata(class_dev);
+ return print_dev_t(buf, MKDEV(USB_MAJOR, minor));
}
static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
@@ -124,6 +130,7 @@
int minor_base = class_driver->minor_base;
int minor = 0;
char name[DEVICE_ID_SIZE];
+ struct class_device *class_dev;
char *temp;
#ifdef CONFIG_USB_DYNAMIC_MINORS
@@ -163,18 +170,23 @@
devfs_mk_cdev(MKDEV(USB_MAJOR, minor), class_driver->mode, name);
/* create a usb class device for this usb interface */
- memset(&intf->class_dev, 0x00, sizeof(struct class_device));
- intf->class_dev.class = &usb_class;
- intf->class_dev.dev = &intf->dev;
-
- temp = strrchr(name, '/');
- if (temp && (temp[1] != 0x00))
- ++temp;
- else
- temp = name;
- snprintf(intf->class_dev.class_id, BUS_ID_SIZE, "%s", temp);
- class_device_register(&intf->class_dev);
- class_device_create_file (&intf->class_dev, &class_device_attr_dev);
+ class_dev = kmalloc(sizeof(*class_dev), GFP_KERNEL);
+ if (class_dev) {
+ memset(class_dev, 0x00, sizeof(struct class_device));
+ class_dev->class = &usb_class;
+ class_dev->dev = &intf->dev;
+
+ temp = strrchr(name, '/');
+ if (temp && (temp[1] != 0x00))
+ ++temp;
+ else
+ temp = name;
+ snprintf(class_dev->class_id, BUS_ID_SIZE, "%s", temp);
+ class_set_devdata(class_dev, (void *)intf->minor);
+ class_device_register(class_dev);
+ class_device_create_file(class_dev, &class_device_attr_dev);
+ intf->class_dev = class_dev;
+ }
exit:
return retval;
}
@@ -217,7 +229,10 @@
snprintf(name, DEVICE_ID_SIZE, class_driver->name, intf->minor - minor_base);
devfs_remove (name);
- class_device_unregister(&intf->class_dev);
+ if (intf->class_dev) {
+ class_device_unregister(intf->class_dev);
+ intf->class_dev = NULL;
+ }
intf->minor = -1;
}
EXPORT_SYMBOL(usb_deregister_dev);
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h Fri Aug 15 10:46:31 2003
+++ b/include/linux/usb.h Fri Aug 15 10:46:31 2003
@@ -123,10 +123,9 @@
struct usb_driver *driver; /* driver */
int minor; /* minor number this interface is bound to */
struct device dev; /* interface specific device info */
- struct class_device class_dev;
+ struct class_device *class_dev;
};
#define to_usb_interface(d) container_of(d, struct usb_interface, dev)
-#define class_dev_to_usb_interface(d) container_of(d, struct usb_interface, class_dev)
#define interface_to_usbdev(intf) \
container_of(intf->dev.parent, struct usb_device, dev)
-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel