sysfs.c 26.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * drivers/usb/core/sysfs.c
 *
 * (C) Copyright 2002 David Brownell
 * (C) Copyright 2002,2004 Greg Kroah-Hartman
 * (C) Copyright 2002,2004 IBM Corp.
 *
 * All of the sysfs file attributes for usb devices and interfaces.
 *
 */


#include <linux/kernel.h>
14
#include <linux/string.h>
L
Linus Torvalds 已提交
15
#include <linux/usb.h>
16
#include <linux/usb/quirks.h>
L
Linus Torvalds 已提交
17 18 19
#include "usb.h"

/* Active configuration fields */
20
#define usb_actconfig_show(field, format_string)			\
21 22
static ssize_t field##_show(struct device *dev,				\
			    struct device_attribute *attr, char *buf)	\
L
Linus Torvalds 已提交
23 24 25
{									\
	struct usb_device *udev;					\
	struct usb_host_config *actconfig;				\
26
	ssize_t rc = 0;							\
L
Linus Torvalds 已提交
27
									\
28
	udev = to_usb_device(dev);					\
29
	usb_lock_device(udev);						\
L
Linus Torvalds 已提交
30 31
	actconfig = udev->actconfig;					\
	if (actconfig)							\
32
		rc = sprintf(buf, format_string,			\
33
				actconfig->desc.field);			\
34 35
	usb_unlock_device(udev);					\
	return rc;							\
L
Linus Torvalds 已提交
36 37
}									\

38 39
#define usb_actconfig_attr(field, format_string)		\
	usb_actconfig_show(field, format_string)		\
40
	static DEVICE_ATTR_RO(field)
L
Linus Torvalds 已提交
41

42 43
usb_actconfig_attr(bNumInterfaces, "%2d\n");
usb_actconfig_attr(bmAttributes, "%2x\n");
44

45
static ssize_t bMaxPower_show(struct device *dev,
46 47 48 49
		struct device_attribute *attr, char *buf)
{
	struct usb_device *udev;
	struct usb_host_config *actconfig;
50
	ssize_t rc = 0;
51 52

	udev = to_usb_device(dev);
53
	usb_lock_device(udev);
54
	actconfig = udev->actconfig;
55 56 57 58
	if (actconfig)
		rc = sprintf(buf, "%dmA\n", usb_get_max_power(udev, actconfig));
	usb_unlock_device(udev);
	return rc;
59
}
60
static DEVICE_ATTR_RO(bMaxPower);
L
Linus Torvalds 已提交
61

62
static ssize_t configuration_show(struct device *dev,
63
		struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
64 65 66
{
	struct usb_device *udev;
	struct usb_host_config *actconfig;
67
	ssize_t rc = 0;
L
Linus Torvalds 已提交
68

69
	udev = to_usb_device(dev);
70
	usb_lock_device(udev);
L
Linus Torvalds 已提交
71
	actconfig = udev->actconfig;
72 73 74 75
	if (actconfig && actconfig->string)
		rc = sprintf(buf, "%s\n", actconfig->string);
	usb_unlock_device(udev);
	return rc;
L
Linus Torvalds 已提交
76
}
77
static DEVICE_ATTR_RO(configuration);
L
Linus Torvalds 已提交
78 79

/* configuration value is always present, and r/w */
80
usb_actconfig_show(bConfigurationValue, "%u\n");
L
Linus Torvalds 已提交
81

82 83 84
static ssize_t bConfigurationValue_store(struct device *dev,
					 struct device_attribute *attr,
					 const char *buf, size_t count)
L
Linus Torvalds 已提交
85
{
86
	struct usb_device	*udev = to_usb_device(dev);
L
Linus Torvalds 已提交
87 88
	int			config, value;

89
	if (sscanf(buf, "%d", &config) != 1 || config < -1 || config > 255)
L
Linus Torvalds 已提交
90 91
		return -EINVAL;
	usb_lock_device(udev);
92
	value = usb_set_configuration(udev, config);
L
Linus Torvalds 已提交
93 94 95
	usb_unlock_device(udev);
	return (value < 0) ? value : count;
}
96
static DEVICE_ATTR_IGNORE_LOCKDEP(bConfigurationValue, S_IRUGO | S_IWUSR,
97
		bConfigurationValue_show, bConfigurationValue_store);
L
Linus Torvalds 已提交
98 99 100

/* String fields */
#define usb_string_attr(name)						\
101
static ssize_t  name##_show(struct device *dev,				\
102
		struct device_attribute *attr, char *buf)		\
L
Linus Torvalds 已提交
103 104
{									\
	struct usb_device *udev;					\
105
	int retval;							\
L
Linus Torvalds 已提交
106
									\
107
	udev = to_usb_device(dev);					\
108 109 110 111
	usb_lock_device(udev);						\
	retval = sprintf(buf, "%s\n", udev->name);			\
	usb_unlock_device(udev);					\
	return retval;							\
L
Linus Torvalds 已提交
112
}									\
113
static DEVICE_ATTR_RO(name)
L
Linus Torvalds 已提交
114 115 116 117 118

usb_string_attr(product);
usb_string_attr(manufacturer);
usb_string_attr(serial);

119 120
static ssize_t speed_show(struct device *dev, struct device_attribute *attr,
			  char *buf)
L
Linus Torvalds 已提交
121 122 123 124
{
	struct usb_device *udev;
	char *speed;

125
	udev = to_usb_device(dev);
L
Linus Torvalds 已提交
126 127 128 129 130 131 132 133 134 135 136 137

	switch (udev->speed) {
	case USB_SPEED_LOW:
		speed = "1.5";
		break;
	case USB_SPEED_UNKNOWN:
	case USB_SPEED_FULL:
		speed = "12";
		break;
	case USB_SPEED_HIGH:
		speed = "480";
		break;
138
	case USB_SPEED_WIRELESS:
139 140 141 142 143
		speed = "480";
		break;
	case USB_SPEED_SUPER:
		speed = "5000";
		break;
L
Linus Torvalds 已提交
144 145 146
	default:
		speed = "unknown";
	}
147
	return sprintf(buf, "%s\n", speed);
L
Linus Torvalds 已提交
148
}
149
static DEVICE_ATTR_RO(speed);
L
Linus Torvalds 已提交
150

151 152
static ssize_t busnum_show(struct device *dev, struct device_attribute *attr,
			   char *buf)
153 154 155 156 157 158
{
	struct usb_device *udev;

	udev = to_usb_device(dev);
	return sprintf(buf, "%d\n", udev->bus->busnum);
}
159
static DEVICE_ATTR_RO(busnum);
160

161 162
static ssize_t devnum_show(struct device *dev, struct device_attribute *attr,
			   char *buf)
L
Linus Torvalds 已提交
163 164 165
{
	struct usb_device *udev;

166 167
	udev = to_usb_device(dev);
	return sprintf(buf, "%d\n", udev->devnum);
L
Linus Torvalds 已提交
168
}
169
static DEVICE_ATTR_RO(devnum);
L
Linus Torvalds 已提交
170

171 172
static ssize_t devpath_show(struct device *dev, struct device_attribute *attr,
			    char *buf)
173 174 175 176 177 178
{
	struct usb_device *udev;

	udev = to_usb_device(dev);
	return sprintf(buf, "%s\n", udev->devpath);
}
179
static DEVICE_ATTR_RO(devpath);
180

181 182
static ssize_t version_show(struct device *dev, struct device_attribute *attr,
			    char *buf)
L
Linus Torvalds 已提交
183 184 185 186 187 188 189 190
{
	struct usb_device *udev;
	u16 bcdUSB;

	udev = to_usb_device(dev);
	bcdUSB = le16_to_cpu(udev->descriptor.bcdUSB);
	return sprintf(buf, "%2x.%02x\n", bcdUSB >> 8, bcdUSB & 0xff);
}
191
static DEVICE_ATTR_RO(version);
L
Linus Torvalds 已提交
192

193 194
static ssize_t maxchild_show(struct device *dev, struct device_attribute *attr,
			     char *buf)
L
Linus Torvalds 已提交
195 196 197
{
	struct usb_device *udev;

198 199
	udev = to_usb_device(dev);
	return sprintf(buf, "%d\n", udev->maxchild);
L
Linus Torvalds 已提交
200
}
201
static DEVICE_ATTR_RO(maxchild);
L
Linus Torvalds 已提交
202

203 204
static ssize_t quirks_show(struct device *dev, struct device_attribute *attr,
			   char *buf)
205 206 207 208 209 210
{
	struct usb_device *udev;

	udev = to_usb_device(dev);
	return sprintf(buf, "0x%x\n", udev->quirks);
}
211
static DEVICE_ATTR_RO(quirks);
212

213 214
static ssize_t avoid_reset_quirk_show(struct device *dev,
				      struct device_attribute *attr, char *buf)
215 216 217 218
{
	struct usb_device *udev;

	udev = to_usb_device(dev);
219
	return sprintf(buf, "%d\n", !!(udev->quirks & USB_QUIRK_RESET));
220 221
}

222 223 224
static ssize_t avoid_reset_quirk_store(struct device *dev,
				      struct device_attribute *attr,
				      const char *buf, size_t count)
225 226
{
	struct usb_device	*udev = to_usb_device(dev);
227
	int			val;
228

229
	if (sscanf(buf, "%d", &val) != 1 || val < 0 || val > 1)
230 231
		return -EINVAL;
	usb_lock_device(udev);
232
	if (val)
233
		udev->quirks |= USB_QUIRK_RESET;
234
	else
235
		udev->quirks &= ~USB_QUIRK_RESET;
236 237 238
	usb_unlock_device(udev);
	return count;
}
239
static DEVICE_ATTR_RW(avoid_reset_quirk);
240

241 242
static ssize_t urbnum_show(struct device *dev, struct device_attribute *attr,
			   char *buf)
243 244 245 246 247 248
{
	struct usb_device *udev;

	udev = to_usb_device(dev);
	return sprintf(buf, "%d\n", atomic_read(&udev->urbnum));
}
249
static DEVICE_ATTR_RO(urbnum);
250

251 252
static ssize_t removable_show(struct device *dev, struct device_attribute *attr,
			      char *buf)
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
{
	struct usb_device *udev;
	char *state;

	udev = to_usb_device(dev);

	switch (udev->removable) {
	case USB_DEVICE_REMOVABLE:
		state = "removable";
		break;
	case USB_DEVICE_FIXED:
		state = "fixed";
		break;
	default:
		state = "unknown";
	}

	return sprintf(buf, "%s\n", state);
}
272
static DEVICE_ATTR_RO(removable);
273

274 275
static ssize_t ltm_capable_show(struct device *dev,
				struct device_attribute *attr, char *buf)
276 277 278 279 280
{
	if (usb_device_supports_ltm(to_usb_device(dev)))
		return sprintf(buf, "%s\n", "yes");
	return sprintf(buf, "%s\n", "no");
}
281
static DEVICE_ATTR_RO(ltm_capable);
282

283
#ifdef	CONFIG_PM
284

285 286
static ssize_t persist_show(struct device *dev, struct device_attribute *attr,
			    char *buf)
287 288 289 290 291 292
{
	struct usb_device *udev = to_usb_device(dev);

	return sprintf(buf, "%d\n", udev->persist_enabled);
}

293 294
static ssize_t persist_store(struct device *dev, struct device_attribute *attr,
			     const char *buf, size_t count)
295 296 297 298 299 300 301 302 303 304
{
	struct usb_device *udev = to_usb_device(dev);
	int value;

	/* Hubs are always enabled for USB_PERSIST */
	if (udev->descriptor.bDeviceClass == USB_CLASS_HUB)
		return -EPERM;

	if (sscanf(buf, "%d", &value) != 1)
		return -EINVAL;
305 306

	usb_lock_device(udev);
307
	udev->persist_enabled = !!value;
308
	usb_unlock_device(udev);
309 310
	return count;
}
311
static DEVICE_ATTR_RW(persist);
312 313 314 315 316 317 318 319

static int add_persist_attributes(struct device *dev)
{
	int rc = 0;

	if (is_usb_device(dev)) {
		struct usb_device *udev = to_usb_device(dev);

320 321 322 323 324 325
		/* Hubs are automatically enabled for USB_PERSIST,
		 * no point in creating the attribute file.
		 */
		if (udev->descriptor.bDeviceClass != USB_CLASS_HUB)
			rc = sysfs_add_file_to_group(&dev->kobj,
					&dev_attr_persist.attr,
326
					power_group_name);
327 328 329 330 331 332 333 334
	}
	return rc;
}

static void remove_persist_attributes(struct device *dev)
{
	sysfs_remove_file_from_group(&dev->kobj,
			&dev_attr_persist.attr,
335
			power_group_name);
336
}
337

338 339
static ssize_t connected_duration_show(struct device *dev,
				       struct device_attribute *attr, char *buf)
S
Sarah Sharp 已提交
340 341 342 343 344 345
{
	struct usb_device *udev = to_usb_device(dev);

	return sprintf(buf, "%u\n",
			jiffies_to_msecs(jiffies - udev->connect_time));
}
346
static DEVICE_ATTR_RO(connected_duration);
S
Sarah Sharp 已提交
347 348 349 350 351 352 353 354

/*
 * If the device is resumed, the last time the device was suspended has
 * been pre-subtracted from active_duration.  We add the current time to
 * get the duration that the device was actually active.
 *
 * If the device is suspended, the active_duration is up-to-date.
 */
355 356
static ssize_t active_duration_show(struct device *dev,
				    struct device_attribute *attr, char *buf)
S
Sarah Sharp 已提交
357 358 359 360 361 362 363 364 365 366
{
	struct usb_device *udev = to_usb_device(dev);
	int duration;

	if (udev->state != USB_STATE_SUSPENDED)
		duration = jiffies_to_msecs(jiffies + udev->active_duration);
	else
		duration = jiffies_to_msecs(udev->active_duration);
	return sprintf(buf, "%u\n", duration);
}
367
static DEVICE_ATTR_RO(active_duration);
S
Sarah Sharp 已提交
368

369 370
static ssize_t autosuspend_show(struct device *dev,
				struct device_attribute *attr, char *buf)
371
{
372
	return sprintf(buf, "%d\n", dev->power.autosuspend_delay / 1000);
373 374
}

375 376 377
static ssize_t autosuspend_store(struct device *dev,
				 struct device_attribute *attr, const char *buf,
				 size_t count)
378
{
379
	int value;
380

381 382
	if (sscanf(buf, "%d", &value) != 1 || value >= INT_MAX/1000 ||
			value <= -INT_MAX/1000)
383 384
		return -EINVAL;

385
	pm_runtime_set_autosuspend_delay(dev, value * 1000);
386 387
	return count;
}
388
static DEVICE_ATTR_RW(autosuspend);
389

390 391 392
static const char on_string[] = "on";
static const char auto_string[] = "auto";

393 394
static void warn_level(void)
{
395 396 397 398 399 400 401 402 403
	static int level_warned;

	if (!level_warned) {
		level_warned = 1;
		printk(KERN_WARNING "WARNING! power/level is deprecated; "
				"use power/control instead\n");
	}
}

404 405
static ssize_t level_show(struct device *dev, struct device_attribute *attr,
			  char *buf)
406 407 408 409
{
	struct usb_device *udev = to_usb_device(dev);
	const char *p = auto_string;

410
	warn_level();
411
	if (udev->state != USB_STATE_SUSPENDED && !udev->dev.power.runtime_auto)
412
		p = on_string;
413 414 415
	return sprintf(buf, "%s\n", p);
}

416 417
static ssize_t level_store(struct device *dev, struct device_attribute *attr,
			   const char *buf, size_t count)
418 419 420 421
{
	struct usb_device *udev = to_usb_device(dev);
	int len = count;
	char *cp;
422
	int rc = count;
423

424
	warn_level();
425 426 427 428 429 430 431
	cp = memchr(buf, '\n', count);
	if (cp)
		len = cp - buf;

	usb_lock_device(udev);

	if (len == sizeof on_string - 1 &&
432
			strncmp(buf, on_string, len) == 0)
433
		usb_disable_autosuspend(udev);
434

435 436
	else if (len == sizeof auto_string - 1 &&
			strncmp(buf, auto_string, len) == 0)
437
		usb_enable_autosuspend(udev);
438

439
	else
440 441 442
		rc = -EINVAL;

	usb_unlock_device(udev);
443
	return rc;
444
}
445
static DEVICE_ATTR_RW(level);
446

447 448
static ssize_t usb2_hardware_lpm_show(struct device *dev,
				      struct device_attribute *attr, char *buf)
449 450 451 452
{
	struct usb_device *udev = to_usb_device(dev);
	const char *p;

453
	if (udev->usb2_hw_lpm_allowed == 1)
454 455 456 457 458 459 460
		p = "enabled";
	else
		p = "disabled";

	return sprintf(buf, "%s\n", p);
}

461 462 463
static ssize_t usb2_hardware_lpm_store(struct device *dev,
				       struct device_attribute *attr,
				       const char *buf, size_t count)
464 465 466 467 468 469 470 471 472
{
	struct usb_device *udev = to_usb_device(dev);
	bool value;
	int ret;

	usb_lock_device(udev);

	ret = strtobool(buf, &value);

473 474
	if (!ret) {
		udev->usb2_hw_lpm_allowed = value;
475
		ret = usb_set_usb2_hardware_lpm(udev, value);
476
	}
477 478 479 480 481 482 483 484

	usb_unlock_device(udev);

	if (!ret)
		return count;

	return ret;
}
485
static DEVICE_ATTR_RW(usb2_hardware_lpm);
486

487 488 489
static ssize_t usb2_lpm_l1_timeout_show(struct device *dev,
					struct device_attribute *attr,
					char *buf)
490 491 492 493 494
{
	struct usb_device *udev = to_usb_device(dev);
	return sprintf(buf, "%d\n", udev->l1_params.timeout);
}

495 496 497
static ssize_t usb2_lpm_l1_timeout_store(struct device *dev,
					 struct device_attribute *attr,
					 const char *buf, size_t count)
498 499 500 501 502 503 504 505 506 507 508
{
	struct usb_device *udev = to_usb_device(dev);
	u16 timeout;

	if (kstrtou16(buf, 0, &timeout))
		return -EINVAL;

	udev->l1_params.timeout = timeout;

	return count;
}
509
static DEVICE_ATTR_RW(usb2_lpm_l1_timeout);
510

511 512
static ssize_t usb2_lpm_besl_show(struct device *dev,
				  struct device_attribute *attr, char *buf)
513 514 515 516 517
{
	struct usb_device *udev = to_usb_device(dev);
	return sprintf(buf, "%d\n", udev->l1_params.besl);
}

518 519 520
static ssize_t usb2_lpm_besl_store(struct device *dev,
				   struct device_attribute *attr,
				   const char *buf, size_t count)
521 522 523 524 525 526 527 528 529 530 531
{
	struct usb_device *udev = to_usb_device(dev);
	u8 besl;

	if (kstrtou8(buf, 0, &besl) || besl > 15)
		return -EINVAL;

	udev->l1_params.besl = besl;

	return count;
}
532
static DEVICE_ATTR_RW(usb2_lpm_besl);
533

534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552
static ssize_t usb3_hardware_lpm_show(struct device *dev,
				      struct device_attribute *attr, char *buf)
{
	struct usb_device *udev = to_usb_device(dev);
	const char *p;

	usb_lock_device(udev);

	if (udev->usb3_lpm_enabled)
		p = "enabled";
	else
		p = "disabled";

	usb_unlock_device(udev);

	return sprintf(buf, "%s\n", p);
}
static DEVICE_ATTR_RO(usb3_hardware_lpm);

553 554
static struct attribute *usb2_hardware_lpm_attr[] = {
	&dev_attr_usb2_hardware_lpm.attr,
555 556
	&dev_attr_usb2_lpm_l1_timeout.attr,
	&dev_attr_usb2_lpm_besl.attr,
557 558 559 560 561 562 563
	NULL,
};
static struct attribute_group usb2_hardware_lpm_attr_group = {
	.name	= power_group_name,
	.attrs	= usb2_hardware_lpm_attr,
};

564 565 566 567 568 569 570 571 572
static struct attribute *usb3_hardware_lpm_attr[] = {
	&dev_attr_usb3_hardware_lpm.attr,
	NULL,
};
static struct attribute_group usb3_hardware_lpm_attr_group = {
	.name	= power_group_name,
	.attrs	= usb3_hardware_lpm_attr,
};

573 574 575 576 577 578 579 580 581 582 583 584
static struct attribute *power_attrs[] = {
	&dev_attr_autosuspend.attr,
	&dev_attr_level.attr,
	&dev_attr_connected_duration.attr,
	&dev_attr_active_duration.attr,
	NULL,
};
static struct attribute_group power_attr_group = {
	.name	= power_group_name,
	.attrs	= power_attrs,
};

585 586 587 588
static int add_power_attributes(struct device *dev)
{
	int rc = 0;

589 590
	if (is_usb_device(dev)) {
		struct usb_device *udev = to_usb_device(dev);
591
		rc = sysfs_merge_group(&dev->kobj, &power_attr_group);
592 593 594
		if (udev->usb2_hw_lpm_capable == 1)
			rc = sysfs_merge_group(&dev->kobj,
					&usb2_hardware_lpm_attr_group);
595 596 597
		if (udev->lpm_capable == 1)
			rc = sysfs_merge_group(&dev->kobj,
					&usb3_hardware_lpm_attr_group);
598 599
	}

600 601 602 603 604
	return rc;
}

static void remove_power_attributes(struct device *dev)
{
605
	sysfs_unmerge_group(&dev->kobj, &usb2_hardware_lpm_attr_group);
606
	sysfs_unmerge_group(&dev->kobj, &power_attr_group);
607 608 609 610
}

#else

611 612 613
#define add_persist_attributes(dev)	0
#define remove_persist_attributes(dev)	do {} while (0)

614 615 616
#define add_power_attributes(dev)	0
#define remove_power_attributes(dev)	do {} while (0)

617
#endif	/* CONFIG_PM */
618

619

L
Linus Torvalds 已提交
620 621 622
/* Descriptor fields */
#define usb_descriptor_attr_le16(field, format_string)			\
static ssize_t								\
623
field##_show(struct device *dev, struct device_attribute *attr,	\
624
		char *buf)						\
L
Linus Torvalds 已提交
625 626 627
{									\
	struct usb_device *udev;					\
									\
628 629
	udev = to_usb_device(dev);					\
	return sprintf(buf, format_string, 				\
L
Linus Torvalds 已提交
630 631
			le16_to_cpu(udev->descriptor.field));		\
}									\
632
static DEVICE_ATTR_RO(field)
L
Linus Torvalds 已提交
633

634 635 636
usb_descriptor_attr_le16(idVendor, "%04x\n");
usb_descriptor_attr_le16(idProduct, "%04x\n");
usb_descriptor_attr_le16(bcdDevice, "%04x\n");
L
Linus Torvalds 已提交
637 638 639

#define usb_descriptor_attr(field, format_string)			\
static ssize_t								\
640
field##_show(struct device *dev, struct device_attribute *attr,	\
641
		char *buf)						\
L
Linus Torvalds 已提交
642 643 644
{									\
	struct usb_device *udev;					\
									\
645 646
	udev = to_usb_device(dev);					\
	return sprintf(buf, format_string, udev->descriptor.field);	\
L
Linus Torvalds 已提交
647
}									\
648
static DEVICE_ATTR_RO(field)
L
Linus Torvalds 已提交
649

650 651 652 653 654
usb_descriptor_attr(bDeviceClass, "%02x\n");
usb_descriptor_attr(bDeviceSubClass, "%02x\n");
usb_descriptor_attr(bDeviceProtocol, "%02x\n");
usb_descriptor_attr(bNumConfigurations, "%d\n");
usb_descriptor_attr(bMaxPacketSize0, "%d\n");
655 656 657


/* show if the device is authorized (1) or not (0) */
658 659
static ssize_t authorized_show(struct device *dev,
			       struct device_attribute *attr, char *buf)
660 661 662 663 664 665 666 667 668 669
{
	struct usb_device *usb_dev = to_usb_device(dev);
	return snprintf(buf, PAGE_SIZE, "%u\n", usb_dev->authorized);
}

/*
 * Authorize a device to be used in the system
 *
 * Writing a 0 deauthorizes the device, writing a 1 authorizes it.
 */
670 671 672
static ssize_t authorized_store(struct device *dev,
				struct device_attribute *attr, const char *buf,
				size_t size)
673 674 675 676 677 678 679 680 681 682 683
{
	ssize_t result;
	struct usb_device *usb_dev = to_usb_device(dev);
	unsigned val;
	result = sscanf(buf, "%u\n", &val);
	if (result != 1)
		result = -EINVAL;
	else if (val == 0)
		result = usb_deauthorize_device(usb_dev);
	else
		result = usb_authorize_device(usb_dev);
684
	return result < 0 ? result : size;
685
}
686 687
static DEVICE_ATTR_IGNORE_LOCKDEP(authorized, S_IRUGO | S_IWUSR,
				  authorized_show, authorized_store);
688

689
/* "Safely remove a device" */
690 691
static ssize_t remove_store(struct device *dev, struct device_attribute *attr,
			    const char *buf, size_t count)
692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707
{
	struct usb_device *udev = to_usb_device(dev);
	int rc = 0;

	usb_lock_device(udev);
	if (udev->state != USB_STATE_NOTATTACHED) {

		/* To avoid races, first unconfigure and then remove */
		usb_set_configuration(udev, -1);
		rc = usb_remove_device(udev);
	}
	if (rc == 0)
		rc = count;
	usb_unlock_device(udev);
	return rc;
}
708
static DEVICE_ATTR_IGNORE_LOCKDEP(remove, S_IWUSR, NULL, remove_store);
709

710

L
Linus Torvalds 已提交
711 712
static struct attribute *dev_attrs[] = {
	/* current configuration's attributes */
713
	&dev_attr_configuration.attr,
L
Linus Torvalds 已提交
714 715 716 717 718
	&dev_attr_bNumInterfaces.attr,
	&dev_attr_bConfigurationValue.attr,
	&dev_attr_bmAttributes.attr,
	&dev_attr_bMaxPower.attr,
	/* device attributes */
719
	&dev_attr_urbnum.attr,
L
Linus Torvalds 已提交
720 721 722 723 724 725 726
	&dev_attr_idVendor.attr,
	&dev_attr_idProduct.attr,
	&dev_attr_bcdDevice.attr,
	&dev_attr_bDeviceClass.attr,
	&dev_attr_bDeviceSubClass.attr,
	&dev_attr_bDeviceProtocol.attr,
	&dev_attr_bNumConfigurations.attr,
727
	&dev_attr_bMaxPacketSize0.attr,
L
Linus Torvalds 已提交
728
	&dev_attr_speed.attr,
729
	&dev_attr_busnum.attr,
L
Linus Torvalds 已提交
730
	&dev_attr_devnum.attr,
731
	&dev_attr_devpath.attr,
L
Linus Torvalds 已提交
732 733
	&dev_attr_version.attr,
	&dev_attr_maxchild.attr,
734
	&dev_attr_quirks.attr,
735
	&dev_attr_avoid_reset_quirk.attr,
736
	&dev_attr_authorized.attr,
737
	&dev_attr_remove.attr,
738
	&dev_attr_removable.attr,
739
	&dev_attr_ltm_capable.attr,
L
Linus Torvalds 已提交
740 741 742 743 744 745
	NULL,
};
static struct attribute_group dev_attr_grp = {
	.attrs = dev_attrs,
};

746 747 748 749 750 751 752 753 754 755
/* When modifying this list, be sure to modify dev_string_attrs_are_visible()
 * accordingly.
 */
static struct attribute *dev_string_attrs[] = {
	&dev_attr_manufacturer.attr,
	&dev_attr_product.attr,
	&dev_attr_serial.attr,
	NULL
};

756
static umode_t dev_string_attrs_are_visible(struct kobject *kobj,
757 758
		struct attribute *a, int n)
{
759 760
	struct device *dev = container_of(kobj, struct device, kobj);
	struct usb_device *udev = to_usb_device(dev);
761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779

	if (a == &dev_attr_manufacturer.attr) {
		if (udev->manufacturer == NULL)
			return 0;
	} else if (a == &dev_attr_product.attr) {
		if (udev->product == NULL)
			return 0;
	} else if (a == &dev_attr_serial.attr) {
		if (udev->serial == NULL)
			return 0;
	}
	return a->mode;
}

static struct attribute_group dev_string_attr_grp = {
	.attrs =	dev_string_attrs,
	.is_visible =	dev_string_attrs_are_visible,
};

780
const struct attribute_group *usb_device_groups[] = {
781 782 783 784 785
	&dev_attr_grp,
	&dev_string_attr_grp,
	NULL
};

786 787 788
/* Binary descriptors */

static ssize_t
789 790
read_descriptors(struct file *filp, struct kobject *kobj,
		struct bin_attribute *attr,
791 792
		char *buf, loff_t off, size_t count)
{
793 794
	struct device *dev = container_of(kobj, struct device, kobj);
	struct usb_device *udev = to_usb_device(dev);
795 796
	size_t nleft = count;
	size_t srclen, n;
797 798
	int cfgno;
	void *src;
799

800 801 802
	/* The binary attribute begins with the device descriptor.
	 * Following that are the raw descriptor entries for all the
	 * configurations (config plus subsidiary descriptors).
803
	 */
804
	usb_lock_device(udev);
805 806 807 808 809 810 811 812 813 814
	for (cfgno = -1; cfgno < udev->descriptor.bNumConfigurations &&
			nleft > 0; ++cfgno) {
		if (cfgno < 0) {
			src = &udev->descriptor;
			srclen = sizeof(struct usb_device_descriptor);
		} else {
			src = udev->rawdescriptors[cfgno];
			srclen = __le16_to_cpu(udev->config[cfgno].desc.
					wTotalLength);
		}
815
		if (off < srclen) {
816 817
			n = min(nleft, srclen - (size_t) off);
			memcpy(buf, src + off, n);
818
			nleft -= n;
819 820 821 822
			buf += n;
			off = 0;
		} else {
			off -= srclen;
823 824
		}
	}
825
	usb_unlock_device(udev);
826 827 828 829 830 831 832 833 834
	return count - nleft;
}

static struct bin_attribute dev_bin_attr_descriptors = {
	.attr = {.name = "descriptors", .mode = 0444},
	.read = read_descriptors,
	.size = 18 + 65535,	/* dev descr + max-size raw descriptor */
};

835
int usb_create_sysfs_dev_files(struct usb_device *udev)
L
Linus Torvalds 已提交
836 837
{
	struct device *dev = &udev->dev;
838
	int retval;
L
Linus Torvalds 已提交
839

840 841 842 843
	retval = device_create_bin_file(dev, &dev_bin_attr_descriptors);
	if (retval)
		goto error;

844 845 846 847
	retval = add_persist_attributes(dev);
	if (retval)
		goto error;

848 849 850
	retval = add_power_attributes(dev);
	if (retval)
		goto error;
A
Alan Stern 已提交
851
	return retval;
852
error:
A
Alan Stern 已提交
853
	usb_remove_sysfs_dev_files(udev);
854
	return retval;
L
Linus Torvalds 已提交
855 856
}

857
void usb_remove_sysfs_dev_files(struct usb_device *udev)
L
Linus Torvalds 已提交
858 859 860
{
	struct device *dev = &udev->dev;

861
	remove_power_attributes(dev);
862
	remove_persist_attributes(dev);
863
	device_remove_bin_file(dev, &dev_bin_attr_descriptors);
L
Linus Torvalds 已提交
864 865
}

866
/* Interface Association Descriptor fields */
867 868
#define usb_intf_assoc_attr(field, format_string)			\
static ssize_t								\
869
iad_##field##_show(struct device *dev, struct device_attribute *attr,	\
870 871
		char *buf)						\
{									\
872
	struct usb_interface *intf = to_usb_interface(dev);		\
873
									\
874 875
	return sprintf(buf, format_string,				\
			intf->intf_assoc->field); 			\
876
}									\
877
static DEVICE_ATTR_RO(iad_##field)
878

879 880 881 882 883
usb_intf_assoc_attr(bFirstInterface, "%02x\n");
usb_intf_assoc_attr(bInterfaceCount, "%02d\n");
usb_intf_assoc_attr(bFunctionClass, "%02x\n");
usb_intf_assoc_attr(bFunctionSubClass, "%02x\n");
usb_intf_assoc_attr(bFunctionProtocol, "%02x\n");
884

L
Linus Torvalds 已提交
885 886 887
/* Interface fields */
#define usb_intf_attr(field, format_string)				\
static ssize_t								\
888
field##_show(struct device *dev, struct device_attribute *attr,		\
889
		char *buf)						\
L
Linus Torvalds 已提交
890
{									\
891
	struct usb_interface *intf = to_usb_interface(dev);		\
L
Linus Torvalds 已提交
892
									\
893
	return sprintf(buf, format_string,				\
894
			intf->cur_altsetting->desc.field); 		\
L
Linus Torvalds 已提交
895
}									\
896
static DEVICE_ATTR_RO(field)
L
Linus Torvalds 已提交
897

898 899 900 901 902 903
usb_intf_attr(bInterfaceNumber, "%02x\n");
usb_intf_attr(bAlternateSetting, "%2d\n");
usb_intf_attr(bNumEndpoints, "%02x\n");
usb_intf_attr(bInterfaceClass, "%02x\n");
usb_intf_attr(bInterfaceSubClass, "%02x\n");
usb_intf_attr(bInterfaceProtocol, "%02x\n");
L
Linus Torvalds 已提交
904

905 906
static ssize_t interface_show(struct device *dev, struct device_attribute *attr,
			      char *buf)
L
Linus Torvalds 已提交
907 908
{
	struct usb_interface *intf;
909
	char *string;
L
Linus Torvalds 已提交
910

911
	intf = to_usb_interface(dev);
912
	string = ACCESS_ONCE(intf->cur_altsetting->string);
913
	if (!string)
L
Linus Torvalds 已提交
914
		return 0;
915
	return sprintf(buf, "%s\n", string);
L
Linus Torvalds 已提交
916
}
917
static DEVICE_ATTR_RO(interface);
L
Linus Torvalds 已提交
918

919 920
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
			     char *buf)
921 922 923
{
	struct usb_interface *intf;
	struct usb_device *udev;
924
	struct usb_host_interface *alt;
925 926 927

	intf = to_usb_interface(dev);
	udev = interface_to_usbdev(intf);
928
	alt = ACCESS_ONCE(intf->cur_altsetting);
929 930

	return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
931
			"ic%02Xisc%02Xip%02Xin%02X\n",
932 933 934 935 936 937 938 939
			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,
			alt->desc.bInterfaceClass,
			alt->desc.bInterfaceSubClass,
940 941
			alt->desc.bInterfaceProtocol,
			alt->desc.bInterfaceNumber);
942
}
943
static DEVICE_ATTR_RO(modalias);
944

945 946 947
static ssize_t supports_autosuspend_show(struct device *dev,
					 struct device_attribute *attr,
					 char *buf)
948
{
949
	int s;
950

951
	device_lock(dev);
952
	/* Devices will be autosuspended even when an interface isn't claimed */
953 954
	s = (!dev->driver || to_usb_driver(dev->driver)->supports_autosuspend);
	device_unlock(dev);
955

956
	return sprintf(buf, "%u\n", s);
957
}
958
static DEVICE_ATTR_RO(supports_autosuspend);
959

960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994
/*
 * interface_authorized_show - show authorization status of an USB interface
 * 1 is authorized, 0 is deauthorized
 */
static ssize_t interface_authorized_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct usb_interface *intf = to_usb_interface(dev);

	return sprintf(buf, "%u\n", intf->authorized);
}

/*
 * interface_authorized_store - authorize or deauthorize an USB interface
 */
static ssize_t interface_authorized_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct usb_interface *intf = to_usb_interface(dev);
	bool val;

	if (strtobool(buf, &val) != 0)
		return -EINVAL;

	if (val)
		usb_authorize_interface(intf);
	else
		usb_deauthorize_interface(intf);

	return count;
}
static struct device_attribute dev_attr_interface_authorized =
		__ATTR(authorized, S_IRUGO | S_IWUSR,
		interface_authorized_show, interface_authorized_store);

L
Linus Torvalds 已提交
995 996 997 998 999 1000 1001
static struct attribute *intf_attrs[] = {
	&dev_attr_bInterfaceNumber.attr,
	&dev_attr_bAlternateSetting.attr,
	&dev_attr_bNumEndpoints.attr,
	&dev_attr_bInterfaceClass.attr,
	&dev_attr_bInterfaceSubClass.attr,
	&dev_attr_bInterfaceProtocol.attr,
1002
	&dev_attr_modalias.attr,
1003
	&dev_attr_supports_autosuspend.attr,
1004
	&dev_attr_interface_authorized.attr,
L
Linus Torvalds 已提交
1005 1006 1007 1008 1009 1010
	NULL,
};
static struct attribute_group intf_attr_grp = {
	.attrs = intf_attrs,
};

1011 1012 1013 1014 1015 1016 1017 1018 1019
static struct attribute *intf_assoc_attrs[] = {
	&dev_attr_iad_bFirstInterface.attr,
	&dev_attr_iad_bInterfaceCount.attr,
	&dev_attr_iad_bFunctionClass.attr,
	&dev_attr_iad_bFunctionSubClass.attr,
	&dev_attr_iad_bFunctionProtocol.attr,
	NULL,
};

1020
static umode_t intf_assoc_attrs_are_visible(struct kobject *kobj,
1021 1022
		struct attribute *a, int n)
{
1023 1024
	struct device *dev = container_of(kobj, struct device, kobj);
	struct usb_interface *intf = to_usb_interface(dev);
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035

	if (intf->intf_assoc == NULL)
		return 0;
	return a->mode;
}

static struct attribute_group intf_assoc_attr_grp = {
	.attrs =	intf_assoc_attrs,
	.is_visible =	intf_assoc_attrs_are_visible,
};

1036
const struct attribute_group *usb_interface_groups[] = {
1037 1038 1039 1040 1041
	&intf_attr_grp,
	&intf_assoc_attr_grp,
	NULL
};

1042
void usb_create_sysfs_intf_files(struct usb_interface *intf)
L
Linus Torvalds 已提交
1043
{
1044 1045 1046
	struct usb_device *udev = interface_to_usbdev(intf);
	struct usb_host_interface *alt = intf->cur_altsetting;

1047
	if (intf->sysfs_files_created || intf->unregistering)
1048
		return;
L
Linus Torvalds 已提交
1049

1050
	if (!alt->string && !(udev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
1051
		alt->string = usb_cache_string(udev, alt->desc.iInterface);
1052 1053
	if (alt->string && device_create_file(&intf->dev, &dev_attr_interface))
		;	/* We don't actually care if the function fails. */
1054
	intf->sysfs_files_created = 1;
L
Linus Torvalds 已提交
1055 1056
}

1057
void usb_remove_sysfs_intf_files(struct usb_interface *intf)
L
Linus Torvalds 已提交
1058
{
1059 1060
	if (!intf->sysfs_files_created)
		return;
1061 1062

	device_remove_file(&intf->dev, &dev_attr_interface);
1063
	intf->sysfs_files_created = 0;
L
Linus Torvalds 已提交
1064
}