vserver 2.0 rc7
[linux-2.6.git] / drivers / usb / core / sysfs.c
index ce71f7a..4d0c9e6 100644 (file)
@@ -46,27 +46,24 @@ usb_actconfig_attr (bNumInterfaces, 1, "%2d\n")
 usb_actconfig_attr (bmAttributes, 1, "%2x\n")
 usb_actconfig_attr (bMaxPower, 2, "%3dmA\n")
 
-#define usb_actconfig_str(name, field)                                 \
-static ssize_t  show_##name(struct device *dev, char *buf)             \
-{                                                                      \
-       struct usb_device *udev;                                        \
-       struct usb_host_config *actconfig;                              \
-       int len;                                                        \
-                                                                       \
-       udev = to_usb_device (dev);                                     \
-       actconfig = udev->actconfig;                                    \
-       if (!actconfig)                                                 \
-               return 0;                                               \
-       len = usb_string(udev, actconfig->desc.field, buf, PAGE_SIZE);  \
-       if (len < 0)                                                    \
-               return 0;                                               \
-       buf[len] = '\n';                                                \
-       buf[len+1] = 0;                                                 \
-       return len+1;                                                   \
-}                                                                      \
-static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
+static ssize_t show_configuration_string(struct device *dev, char *buf)
+{
+       struct usb_device *udev;
+       struct usb_host_config *actconfig;
+       int len;
 
-usb_actconfig_str (configuration, iConfiguration)
+       udev = to_usb_device (dev);
+       actconfig = udev->actconfig;
+       if ((!actconfig) || (!actconfig->string))
+               return 0;
+       len = sprintf(buf, actconfig->string, PAGE_SIZE);
+       if (len < 0)
+               return 0;
+       buf[len] = '\n';
+       buf[len+1] = 0;
+       return len+1;
+}
+static DEVICE_ATTR(configuration, S_IRUGO, show_configuration_string, NULL);
 
 /* configuration value is always present, and r/w */
 usb_actconfig_show(bConfigurationValue, 1, "%u\n");
@@ -89,14 +86,14 @@ static DEVICE_ATTR(bConfigurationValue, S_IRUGO | S_IWUSR,
                show_bConfigurationValue, set_bConfigurationValue);
 
 /* String fields */
-#define usb_string_attr(name, field)           \
+#define usb_string_attr(name)                                          \
 static ssize_t  show_##name(struct device *dev, char *buf)             \
 {                                                                      \
        struct usb_device *udev;                                        \
        int len;                                                        \
                                                                        \
        udev = to_usb_device (dev);                                     \
-       len = usb_string(udev, udev->descriptor.field, buf, PAGE_SIZE); \
+       len = snprintf(buf, 256, "%s", udev->name);                     \
        if (len < 0)                                                    \
                return 0;                                               \
        buf[len] = '\n';                                                \
@@ -105,9 +102,9 @@ static ssize_t  show_##name(struct device *dev, char *buf)          \
 }                                                                      \
 static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
 
-usb_string_attr(product, iProduct);
-usb_string_attr(manufacturer, iManufacturer);
-usb_string_attr(serial, iSerialNumber);
+usb_string_attr(product);
+usb_string_attr(manufacturer);
+usb_string_attr(serial);
 
 static ssize_t
 show_speed (struct device *dev, char *buf)
@@ -230,11 +227,11 @@ void usb_create_sysfs_dev_files (struct usb_device *udev)
 
        sysfs_create_group(&dev->kobj, &dev_attr_grp);
 
-       if (udev->descriptor.iManufacturer)
+       if (udev->manufacturer)
                device_create_file (dev, &dev_attr_manufacturer);
-       if (udev->descriptor.iProduct)
+       if (udev->product)
                device_create_file (dev, &dev_attr_product);
-       if (udev->descriptor.iSerialNumber)
+       if (udev->serial)
                device_create_file (dev, &dev_attr_serial);
        device_create_file (dev, &dev_attr_configuration);
 }
@@ -272,25 +269,53 @@ usb_intf_attr (bInterfaceClass, "%02x\n")
 usb_intf_attr (bInterfaceSubClass, "%02x\n")
 usb_intf_attr (bInterfaceProtocol, "%02x\n")
 
-#define usb_intf_str(name, field)                                      \
-static ssize_t  show_##name(struct device *dev, char *buf)             \
-{                                                                      \
-       struct usb_interface *intf;                                     \
-       struct usb_device *udev;                                        \
-       int len;                                                        \
-                                                                       \
-       intf = to_usb_interface (dev);                                  \
-       udev = interface_to_usbdev (intf);                              \
-       len = usb_string(udev, intf->cur_altsetting->desc.field, buf, PAGE_SIZE);\
-       if (len < 0)                                                    \
-               return 0;                                               \
-       buf[len] = '\n';                                                \
-       buf[len+1] = 0;                                                 \
-       return len+1;                                                   \
-}                                                                      \
-static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
+static ssize_t show_interface_string(struct device *dev, char *buf)
+{
+       struct usb_interface *intf;
+       struct usb_device *udev;
+       int len;
+
+       intf = to_usb_interface (dev);
+       udev = interface_to_usbdev (intf);
+       len = snprintf(buf, 256, "%s", intf->cur_altsetting->string);
+       if (len < 0)
+               return 0;
+       buf[len] = '\n';
+       buf[len+1] = 0;
+       return len+1;
+}
+static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL);
 
-usb_intf_str (interface, iInterface);
+static ssize_t show_modalias(struct device *dev, char *buf)
+{
+       struct usb_interface *intf;
+       struct usb_device *udev;
+       int len;
+
+       intf = to_usb_interface(dev);
+       udev = interface_to_usbdev(intf);
+
+       len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic",
+                              le16_to_cpu(udev->descriptor.idVendor),
+                              le16_to_cpu(udev->descriptor.idProduct),
+                              le16_to_cpu(udev->descriptor.bcdDevice),
+                              udev->descriptor.bDeviceClass,
+                              udev->descriptor.bDeviceSubClass,
+                              udev->descriptor.bDeviceProtocol);
+       buf += len;
+
+       if (udev->descriptor.bDeviceClass == 0) {
+               struct usb_host_interface *alt = intf->cur_altsetting;
+
+               return len + sprintf(buf, "%02Xisc%02Xip%02X\n",
+                              alt->desc.bInterfaceClass,
+                              alt->desc.bInterfaceSubClass,
+                              alt->desc.bInterfaceProtocol);
+       } else {
+               return len + sprintf(buf, "*isc*ip*\n");
+       }
+}
+static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);
 
 static struct attribute *intf_attrs[] = {
        &dev_attr_bInterfaceNumber.attr,
@@ -299,6 +324,7 @@ static struct attribute *intf_attrs[] = {
        &dev_attr_bInterfaceClass.attr,
        &dev_attr_bInterfaceSubClass.attr,
        &dev_attr_bInterfaceProtocol.attr,
+       &dev_attr_modalias.attr,
        NULL,
 };
 static struct attribute_group intf_attr_grp = {
@@ -309,7 +335,7 @@ void usb_create_sysfs_intf_files (struct usb_interface *intf)
 {
        sysfs_create_group(&intf->dev.kobj, &intf_attr_grp);
 
-       if (intf->cur_altsetting->desc.iInterface)
+       if (intf->cur_altsetting->string)
                device_create_file(&intf->dev, &dev_attr_interface);
                
 }
@@ -318,7 +344,7 @@ void usb_remove_sysfs_intf_files (struct usb_interface *intf)
 {
        sysfs_remove_group(&intf->dev.kobj, &intf_attr_grp);
 
-       if (intf->cur_altsetting->desc.iInterface)
+       if (intf->cur_altsetting->string)
                device_remove_file(&intf->dev, &dev_attr_interface);
 
 }