2 * drivers/usb/core/sysfs.c
4 * (C) Copyright 2002 David Brownell
5 * (C) Copyright 2002,2004 Greg Kroah-Hartman
6 * (C) Copyright 2002,2004 IBM Corp.
8 * All of the sysfs file attributes for usb devices and interfaces.
13 #include <linux/config.h>
14 #include <linux/kernel.h>
16 #ifdef CONFIG_USB_DEBUG
21 #include <linux/usb.h>
27 struct usb_endpoint_descriptor
*desc
;
28 struct usb_device
*udev
;
31 #define to_ep_object(_kobj) \
32 container_of(_kobj, struct ep_object, kobj)
35 struct attribute attr
;
36 ssize_t (*show
)(struct usb_device
*,
37 struct usb_endpoint_descriptor
*, char *);
39 #define to_ep_attribute(_attr) \
40 container_of(_attr, struct ep_attribute, attr)
42 #define EP_ATTR(_name) \
43 struct ep_attribute ep_##_name = { \
44 .attr = {.name = #_name, .owner = THIS_MODULE, \
46 .show = show_ep_##_name}
48 #define usb_ep_attr(field, format_string) \
49 static ssize_t show_ep_##field(struct usb_device *udev, \
50 struct usb_endpoint_descriptor *desc, \
53 return sprintf(buf, format_string, desc->field); \
55 static EP_ATTR(field);
57 usb_ep_attr(bLength
, "%02x\n")
58 usb_ep_attr(bEndpointAddress
, "%02x\n")
59 usb_ep_attr(bmAttributes
, "%02x\n")
60 usb_ep_attr(bInterval
, "%02x\n")
62 static ssize_t
show_ep_wMaxPacketSize(struct usb_device
*udev
,
63 struct usb_endpoint_descriptor
*desc
, char *buf
)
65 return sprintf(buf
, "%04x\n",
66 le16_to_cpu(desc
->wMaxPacketSize
) & 0x07ff);
68 static EP_ATTR(wMaxPacketSize
);
70 static ssize_t
show_ep_type(struct usb_device
*udev
,
71 struct usb_endpoint_descriptor
*desc
, char *buf
)
73 char *type
= "unknown";
75 switch (desc
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) {
76 case USB_ENDPOINT_XFER_CONTROL
:
79 case USB_ENDPOINT_XFER_ISOC
:
82 case USB_ENDPOINT_XFER_BULK
:
85 case USB_ENDPOINT_XFER_INT
:
89 return sprintf(buf
, "%s\n", type
);
93 static ssize_t
show_ep_interval(struct usb_device
*udev
,
94 struct usb_endpoint_descriptor
*desc
, char *buf
)
97 unsigned interval
= 0;
100 in
= (desc
->bEndpointAddress
& USB_DIR_IN
);
102 switch (desc
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) {
103 case USB_ENDPOINT_XFER_CONTROL
:
104 if (udev
->speed
== USB_SPEED_HIGH
) /* uframes per NAK */
105 interval
= desc
->bInterval
;
107 case USB_ENDPOINT_XFER_ISOC
:
108 interval
= 1 << (desc
->bInterval
- 1);
110 case USB_ENDPOINT_XFER_BULK
:
111 if (udev
->speed
== USB_SPEED_HIGH
&& !in
) /* uframes per NAK */
112 interval
= desc
->bInterval
;
114 case USB_ENDPOINT_XFER_INT
:
115 if (udev
->speed
== USB_SPEED_HIGH
)
116 interval
= 1 << (desc
->bInterval
- 1);
118 interval
= desc
->bInterval
;
121 interval
*= (udev
->speed
== USB_SPEED_HIGH
) ? 125 : 1000;
129 return sprintf(buf
, "%d%cs\n", interval
, unit
);
131 static EP_ATTR(interval
);
133 static ssize_t
show_ep_direction(struct usb_device
*udev
,
134 struct usb_endpoint_descriptor
*desc
, char *buf
)
138 if ((desc
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) ==
139 USB_ENDPOINT_XFER_CONTROL
)
141 else if (desc
->bEndpointAddress
& USB_DIR_IN
)
145 return sprintf(buf
, "%s\n", direction
);
147 static EP_ATTR(direction
);
149 static struct attribute
*ep_attrs
[] = {
151 &ep_bEndpointAddress
.attr
,
152 &ep_bmAttributes
.attr
,
154 &ep_wMaxPacketSize
.attr
,
161 static void ep_object_release(struct kobject
*kobj
)
163 kfree(to_ep_object(kobj
));
166 static ssize_t
ep_object_show(struct kobject
*kobj
, struct attribute
*attr
,
169 struct ep_object
*ep_obj
= to_ep_object(kobj
);
170 struct ep_attribute
*ep_attr
= to_ep_attribute(attr
);
172 return (ep_attr
->show
)(ep_obj
->udev
, ep_obj
->desc
, buf
);
175 static struct sysfs_ops ep_object_sysfs_ops
= {
176 .show
= ep_object_show
,
179 static struct kobj_type ep_object_ktype
= {
180 .release
= ep_object_release
,
181 .sysfs_ops
= &ep_object_sysfs_ops
,
182 .default_attrs
= ep_attrs
,
185 static void usb_create_ep_files(struct kobject
*parent
,
186 struct usb_host_endpoint
*endpoint
,
187 struct usb_device
*udev
)
189 struct ep_object
*ep_obj
;
190 struct kobject
*kobj
;
192 ep_obj
= kzalloc(sizeof(struct ep_object
), GFP_KERNEL
);
196 ep_obj
->desc
= &endpoint
->desc
;
199 kobj
= &ep_obj
->kobj
;
200 kobject_set_name(kobj
, "ep_%02x", endpoint
->desc
.bEndpointAddress
);
201 kobj
->parent
= parent
;
202 kobj
->ktype
= &ep_object_ktype
;
204 /* Don't use kobject_register, because it generates a hotplug event */
206 if (kobject_add(kobj
) == 0)
207 endpoint
->kobj
= kobj
;
212 static void usb_remove_ep_files(struct usb_host_endpoint
*endpoint
)
215 if (endpoint
->kobj
) {
216 kobject_del(endpoint
->kobj
);
217 kobject_put(endpoint
->kobj
);
218 endpoint
->kobj
= NULL
;
222 /* Active configuration fields */
223 #define usb_actconfig_show(field, multiplier, format_string) \
224 static ssize_t show_##field (struct device *dev, \
225 struct device_attribute *attr, char *buf) \
227 struct usb_device *udev; \
228 struct usb_host_config *actconfig; \
230 udev = to_usb_device (dev); \
231 actconfig = udev->actconfig; \
233 return sprintf (buf, format_string, \
234 actconfig->desc.field * multiplier); \
239 #define usb_actconfig_attr(field, multiplier, format_string) \
240 usb_actconfig_show(field, multiplier, format_string) \
241 static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
243 usb_actconfig_attr (bNumInterfaces
, 1, "%2d\n")
244 usb_actconfig_attr (bmAttributes
, 1, "%2x\n")
245 usb_actconfig_attr (bMaxPower
, 2, "%3dmA\n")
247 static ssize_t
show_configuration_string(struct device
*dev
,
248 struct device_attribute
*attr
, char *buf
)
250 struct usb_device
*udev
;
251 struct usb_host_config
*actconfig
;
254 udev
= to_usb_device (dev
);
255 actconfig
= udev
->actconfig
;
256 if ((!actconfig
) || (!actconfig
->string
))
258 len
= sprintf(buf
, actconfig
->string
, PAGE_SIZE
);
265 static DEVICE_ATTR(configuration
, S_IRUGO
, show_configuration_string
, NULL
);
267 /* configuration value is always present, and r/w */
268 usb_actconfig_show(bConfigurationValue
, 1, "%u\n");
271 set_bConfigurationValue (struct device
*dev
, struct device_attribute
*attr
,
272 const char *buf
, size_t count
)
274 struct usb_device
*udev
= udev
= to_usb_device (dev
);
277 if (sscanf (buf
, "%u", &config
) != 1 || config
> 255)
279 usb_lock_device(udev
);
280 value
= usb_set_configuration (udev
, config
);
281 usb_unlock_device(udev
);
282 return (value
< 0) ? value
: count
;
285 static DEVICE_ATTR(bConfigurationValue
, S_IRUGO
| S_IWUSR
,
286 show_bConfigurationValue
, set_bConfigurationValue
);
289 #define usb_string_attr(name) \
290 static ssize_t show_##name(struct device *dev, \
291 struct device_attribute *attr, char *buf) \
293 struct usb_device *udev; \
296 udev = to_usb_device (dev); \
297 len = snprintf(buf, 256, "%s", udev->name); \
304 static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
306 usb_string_attr(product
);
307 usb_string_attr(manufacturer
);
308 usb_string_attr(serial
);
311 show_speed (struct device
*dev
, struct device_attribute
*attr
, char *buf
)
313 struct usb_device
*udev
;
316 udev
= to_usb_device (dev
);
318 switch (udev
->speed
) {
322 case USB_SPEED_UNKNOWN
:
332 return sprintf (buf
, "%s\n", speed
);
334 static DEVICE_ATTR(speed
, S_IRUGO
, show_speed
, NULL
);
337 show_devnum (struct device
*dev
, struct device_attribute
*attr
, char *buf
)
339 struct usb_device
*udev
;
341 udev
= to_usb_device (dev
);
342 return sprintf (buf
, "%d\n", udev
->devnum
);
344 static DEVICE_ATTR(devnum
, S_IRUGO
, show_devnum
, NULL
);
347 show_version (struct device
*dev
, struct device_attribute
*attr
, char *buf
)
349 struct usb_device
*udev
;
352 udev
= to_usb_device(dev
);
353 bcdUSB
= le16_to_cpu(udev
->descriptor
.bcdUSB
);
354 return sprintf(buf
, "%2x.%02x\n", bcdUSB
>> 8, bcdUSB
& 0xff);
356 static DEVICE_ATTR(version
, S_IRUGO
, show_version
, NULL
);
359 show_maxchild (struct device
*dev
, struct device_attribute
*attr
, char *buf
)
361 struct usb_device
*udev
;
363 udev
= to_usb_device (dev
);
364 return sprintf (buf
, "%d\n", udev
->maxchild
);
366 static DEVICE_ATTR(maxchild
, S_IRUGO
, show_maxchild
, NULL
);
368 /* Descriptor fields */
369 #define usb_descriptor_attr_le16(field, format_string) \
371 show_##field (struct device *dev, struct device_attribute *attr, \
374 struct usb_device *udev; \
376 udev = to_usb_device (dev); \
377 return sprintf (buf, format_string, \
378 le16_to_cpu(udev->descriptor.field)); \
380 static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
382 usb_descriptor_attr_le16(idVendor
, "%04x\n")
383 usb_descriptor_attr_le16(idProduct
, "%04x\n")
384 usb_descriptor_attr_le16(bcdDevice
, "%04x\n")
386 #define usb_descriptor_attr(field, format_string) \
388 show_##field (struct device *dev, struct device_attribute *attr, \
391 struct usb_device *udev; \
393 udev = to_usb_device (dev); \
394 return sprintf (buf, format_string, udev->descriptor.field); \
396 static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
398 usb_descriptor_attr (bDeviceClass
, "%02x\n")
399 usb_descriptor_attr (bDeviceSubClass
, "%02x\n")
400 usb_descriptor_attr (bDeviceProtocol
, "%02x\n")
401 usb_descriptor_attr (bNumConfigurations
, "%d\n")
402 usb_descriptor_attr (bMaxPacketSize0
, "%d\n")
404 static struct attribute
*dev_attrs
[] = {
405 /* current configuration's attributes */
406 &dev_attr_bNumInterfaces
.attr
,
407 &dev_attr_bConfigurationValue
.attr
,
408 &dev_attr_bmAttributes
.attr
,
409 &dev_attr_bMaxPower
.attr
,
410 /* device attributes */
411 &dev_attr_idVendor
.attr
,
412 &dev_attr_idProduct
.attr
,
413 &dev_attr_bcdDevice
.attr
,
414 &dev_attr_bDeviceClass
.attr
,
415 &dev_attr_bDeviceSubClass
.attr
,
416 &dev_attr_bDeviceProtocol
.attr
,
417 &dev_attr_bNumConfigurations
.attr
,
418 &dev_attr_bMaxPacketSize0
.attr
,
419 &dev_attr_speed
.attr
,
420 &dev_attr_devnum
.attr
,
421 &dev_attr_version
.attr
,
422 &dev_attr_maxchild
.attr
,
425 static struct attribute_group dev_attr_grp
= {
429 void usb_create_sysfs_dev_files (struct usb_device
*udev
)
431 struct device
*dev
= &udev
->dev
;
433 sysfs_create_group(&dev
->kobj
, &dev_attr_grp
);
435 if (udev
->manufacturer
)
436 device_create_file (dev
, &dev_attr_manufacturer
);
438 device_create_file (dev
, &dev_attr_product
);
440 device_create_file (dev
, &dev_attr_serial
);
441 device_create_file (dev
, &dev_attr_configuration
);
442 usb_create_ep_files(&dev
->kobj
, &udev
->ep0
, udev
);
445 void usb_remove_sysfs_dev_files (struct usb_device
*udev
)
447 struct device
*dev
= &udev
->dev
;
449 usb_remove_ep_files(&udev
->ep0
);
450 sysfs_remove_group(&dev
->kobj
, &dev_attr_grp
);
452 if (udev
->descriptor
.iManufacturer
)
453 device_remove_file(dev
, &dev_attr_manufacturer
);
454 if (udev
->descriptor
.iProduct
)
455 device_remove_file(dev
, &dev_attr_product
);
456 if (udev
->descriptor
.iSerialNumber
)
457 device_remove_file(dev
, &dev_attr_serial
);
458 device_remove_file (dev
, &dev_attr_configuration
);
461 /* Interface fields */
462 #define usb_intf_attr(field, format_string) \
464 show_##field (struct device *dev, struct device_attribute *attr, \
467 struct usb_interface *intf = to_usb_interface (dev); \
469 return sprintf (buf, format_string, \
470 intf->cur_altsetting->desc.field); \
472 static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
474 usb_intf_attr (bInterfaceNumber
, "%02x\n")
475 usb_intf_attr (bAlternateSetting
, "%2d\n")
476 usb_intf_attr (bNumEndpoints
, "%02x\n")
477 usb_intf_attr (bInterfaceClass
, "%02x\n")
478 usb_intf_attr (bInterfaceSubClass
, "%02x\n")
479 usb_intf_attr (bInterfaceProtocol
, "%02x\n")
481 static ssize_t
show_interface_string(struct device
*dev
,
482 struct device_attribute
*attr
, char *buf
)
484 struct usb_interface
*intf
;
485 struct usb_device
*udev
;
488 intf
= to_usb_interface (dev
);
489 udev
= interface_to_usbdev (intf
);
490 len
= snprintf(buf
, 256, "%s", intf
->cur_altsetting
->string
);
497 static DEVICE_ATTR(interface
, S_IRUGO
, show_interface_string
, NULL
);
499 static ssize_t
show_modalias(struct device
*dev
,
500 struct device_attribute
*attr
, char *buf
)
502 struct usb_interface
*intf
;
503 struct usb_device
*udev
;
504 struct usb_host_interface
*alt
;
506 intf
= to_usb_interface(dev
);
507 udev
= interface_to_usbdev(intf
);
508 alt
= intf
->cur_altsetting
;
510 return sprintf(buf
, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
511 "ic%02Xisc%02Xip%02X\n",
512 le16_to_cpu(udev
->descriptor
.idVendor
),
513 le16_to_cpu(udev
->descriptor
.idProduct
),
514 le16_to_cpu(udev
->descriptor
.bcdDevice
),
515 udev
->descriptor
.bDeviceClass
,
516 udev
->descriptor
.bDeviceSubClass
,
517 udev
->descriptor
.bDeviceProtocol
,
518 alt
->desc
.bInterfaceClass
,
519 alt
->desc
.bInterfaceSubClass
,
520 alt
->desc
.bInterfaceProtocol
);
522 static DEVICE_ATTR(modalias
, S_IRUGO
, show_modalias
, NULL
);
524 static struct attribute
*intf_attrs
[] = {
525 &dev_attr_bInterfaceNumber
.attr
,
526 &dev_attr_bAlternateSetting
.attr
,
527 &dev_attr_bNumEndpoints
.attr
,
528 &dev_attr_bInterfaceClass
.attr
,
529 &dev_attr_bInterfaceSubClass
.attr
,
530 &dev_attr_bInterfaceProtocol
.attr
,
531 &dev_attr_modalias
.attr
,
534 static struct attribute_group intf_attr_grp
= {
538 static inline void usb_create_intf_ep_files(struct usb_interface
*intf
)
540 struct usb_host_interface
*iface_desc
;
543 iface_desc
= intf
->cur_altsetting
;
544 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
)
545 usb_create_ep_files(&intf
->dev
.kobj
, &iface_desc
->endpoint
[i
],
546 interface_to_usbdev(intf
));
549 static inline void usb_remove_intf_ep_files(struct usb_interface
*intf
)
551 struct usb_host_interface
*iface_desc
;
554 iface_desc
= intf
->cur_altsetting
;
555 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
)
556 usb_remove_ep_files(&iface_desc
->endpoint
[i
]);
559 void usb_create_sysfs_intf_files (struct usb_interface
*intf
)
561 sysfs_create_group(&intf
->dev
.kobj
, &intf_attr_grp
);
563 if (intf
->cur_altsetting
->string
)
564 device_create_file(&intf
->dev
, &dev_attr_interface
);
565 usb_create_intf_ep_files(intf
);
568 void usb_remove_sysfs_intf_files (struct usb_interface
*intf
)
570 usb_remove_intf_ep_files(intf
);
571 sysfs_remove_group(&intf
->dev
.kobj
, &intf_attr_grp
);
573 if (intf
->cur_altsetting
->string
)
574 device_remove_file(&intf
->dev
, &dev_attr_interface
);