sysfs.c 26.7 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
static ssize_t usb3_hardware_lpm_u1_show(struct device *dev,
535 536 537 538 539 540 541
				      struct device_attribute *attr, char *buf)
{
	struct usb_device *udev = to_usb_device(dev);
	const char *p;

	usb_lock_device(udev);

542
	if (udev->usb3_lpm_u1_enabled)
543 544 545 546 547 548 549 550
		p = "enabled";
	else
		p = "disabled";

	usb_unlock_device(udev);

	return sprintf(buf, "%s\n", p);
}
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
static DEVICE_ATTR_RO(usb3_hardware_lpm_u1);

static ssize_t usb3_hardware_lpm_u2_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_u2_enabled)
		p = "enabled";
	else
		p = "disabled";

	usb_unlock_device(udev);

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

572 573
static struct attribute *usb2_hardware_lpm_attr[] = {
	&dev_attr_usb2_hardware_lpm.attr,
574 575
	&dev_attr_usb2_lpm_l1_timeout.attr,
	&dev_attr_usb2_lpm_besl.attr,
576 577 578 579 580 581 582
	NULL,
};
static struct attribute_group usb2_hardware_lpm_attr_group = {
	.name	= power_group_name,
	.attrs	= usb2_hardware_lpm_attr,
};

583
static struct attribute *usb3_hardware_lpm_attr[] = {
584 585
	&dev_attr_usb3_hardware_lpm_u1.attr,
	&dev_attr_usb3_hardware_lpm_u2.attr,
586 587 588 589 590 591 592
	NULL,
};
static struct attribute_group usb3_hardware_lpm_attr_group = {
	.name	= power_group_name,
	.attrs	= usb3_hardware_lpm_attr,
};

593 594 595 596 597 598 599 600 601 602 603 604
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,
};

605 606 607 608
static int add_power_attributes(struct device *dev)
{
	int rc = 0;

609 610
	if (is_usb_device(dev)) {
		struct usb_device *udev = to_usb_device(dev);
611
		rc = sysfs_merge_group(&dev->kobj, &power_attr_group);
612 613 614
		if (udev->usb2_hw_lpm_capable == 1)
			rc = sysfs_merge_group(&dev->kobj,
					&usb2_hardware_lpm_attr_group);
615 616
		if (udev->speed == USB_SPEED_SUPER &&
				udev->lpm_capable == 1)
617 618
			rc = sysfs_merge_group(&dev->kobj,
					&usb3_hardware_lpm_attr_group);
619 620
	}

621 622 623 624 625
	return rc;
}

static void remove_power_attributes(struct device *dev)
{
626
	sysfs_unmerge_group(&dev->kobj, &usb2_hardware_lpm_attr_group);
627
	sysfs_unmerge_group(&dev->kobj, &power_attr_group);
628 629 630 631
}

#else

632 633 634
#define add_persist_attributes(dev)	0
#define remove_persist_attributes(dev)	do {} while (0)

635 636 637
#define add_power_attributes(dev)	0
#define remove_power_attributes(dev)	do {} while (0)

638
#endif	/* CONFIG_PM */
639

640

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

655 656 657
usb_descriptor_attr_le16(idVendor, "%04x\n");
usb_descriptor_attr_le16(idProduct, "%04x\n");
usb_descriptor_attr_le16(bcdDevice, "%04x\n");
L
Linus Torvalds 已提交
658 659 660

#define usb_descriptor_attr(field, format_string)			\
static ssize_t								\
661
field##_show(struct device *dev, struct device_attribute *attr,	\
662
		char *buf)						\
L
Linus Torvalds 已提交
663 664 665
{									\
	struct usb_device *udev;					\
									\
666 667
	udev = to_usb_device(dev);					\
	return sprintf(buf, format_string, udev->descriptor.field);	\
L
Linus Torvalds 已提交
668
}									\
669
static DEVICE_ATTR_RO(field)
L
Linus Torvalds 已提交
670

671 672 673 674 675
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");
676 677 678


/* show if the device is authorized (1) or not (0) */
679 680
static ssize_t authorized_show(struct device *dev,
			       struct device_attribute *attr, char *buf)
681 682 683 684 685 686 687 688 689 690
{
	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.
 */
691 692 693
static ssize_t authorized_store(struct device *dev,
				struct device_attribute *attr, const char *buf,
				size_t size)
694 695 696 697 698 699 700 701 702 703 704
{
	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);
705
	return result < 0 ? result : size;
706
}
707 708
static DEVICE_ATTR_IGNORE_LOCKDEP(authorized, S_IRUGO | S_IWUSR,
				  authorized_show, authorized_store);
709

710
/* "Safely remove a device" */
711 712
static ssize_t remove_store(struct device *dev, struct device_attribute *attr,
			    const char *buf, size_t count)
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
{
	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;
}
729
static DEVICE_ATTR_IGNORE_LOCKDEP(remove, S_IWUSR, NULL, remove_store);
730

731

L
Linus Torvalds 已提交
732 733
static struct attribute *dev_attrs[] = {
	/* current configuration's attributes */
734
	&dev_attr_configuration.attr,
L
Linus Torvalds 已提交
735 736 737 738 739
	&dev_attr_bNumInterfaces.attr,
	&dev_attr_bConfigurationValue.attr,
	&dev_attr_bmAttributes.attr,
	&dev_attr_bMaxPower.attr,
	/* device attributes */
740
	&dev_attr_urbnum.attr,
L
Linus Torvalds 已提交
741 742 743 744 745 746 747
	&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,
748
	&dev_attr_bMaxPacketSize0.attr,
L
Linus Torvalds 已提交
749
	&dev_attr_speed.attr,
750
	&dev_attr_busnum.attr,
L
Linus Torvalds 已提交
751
	&dev_attr_devnum.attr,
752
	&dev_attr_devpath.attr,
L
Linus Torvalds 已提交
753 754
	&dev_attr_version.attr,
	&dev_attr_maxchild.attr,
755
	&dev_attr_quirks.attr,
756
	&dev_attr_avoid_reset_quirk.attr,
757
	&dev_attr_authorized.attr,
758
	&dev_attr_remove.attr,
759
	&dev_attr_removable.attr,
760
	&dev_attr_ltm_capable.attr,
L
Linus Torvalds 已提交
761 762 763 764 765 766
	NULL,
};
static struct attribute_group dev_attr_grp = {
	.attrs = dev_attrs,
};

767 768 769 770 771 772 773 774 775 776
/* 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
};

777
static umode_t dev_string_attrs_are_visible(struct kobject *kobj,
778 779
		struct attribute *a, int n)
{
780 781
	struct device *dev = container_of(kobj, struct device, kobj);
	struct usb_device *udev = to_usb_device(dev);
782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800

	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,
};

801
const struct attribute_group *usb_device_groups[] = {
802 803 804 805 806
	&dev_attr_grp,
	&dev_string_attr_grp,
	NULL
};

807 808 809
/* Binary descriptors */

static ssize_t
810 811
read_descriptors(struct file *filp, struct kobject *kobj,
		struct bin_attribute *attr,
812 813
		char *buf, loff_t off, size_t count)
{
814 815
	struct device *dev = container_of(kobj, struct device, kobj);
	struct usb_device *udev = to_usb_device(dev);
816 817
	size_t nleft = count;
	size_t srclen, n;
818 819
	int cfgno;
	void *src;
820

821 822 823
	/* The binary attribute begins with the device descriptor.
	 * Following that are the raw descriptor entries for all the
	 * configurations (config plus subsidiary descriptors).
824
	 */
825
	usb_lock_device(udev);
826 827 828 829 830 831 832 833 834 835
	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);
		}
836
		if (off < srclen) {
837 838
			n = min(nleft, srclen - (size_t) off);
			memcpy(buf, src + off, n);
839
			nleft -= n;
840 841 842 843
			buf += n;
			off = 0;
		} else {
			off -= srclen;
844 845
		}
	}
846
	usb_unlock_device(udev);
847 848 849 850 851 852 853 854 855
	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 */
};

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

861 862 863 864
	retval = device_create_bin_file(dev, &dev_bin_attr_descriptors);
	if (retval)
		goto error;

865 866 867 868
	retval = add_persist_attributes(dev);
	if (retval)
		goto error;

869 870 871
	retval = add_power_attributes(dev);
	if (retval)
		goto error;
A
Alan Stern 已提交
872
	return retval;
873
error:
A
Alan Stern 已提交
874
	usb_remove_sysfs_dev_files(udev);
875
	return retval;
L
Linus Torvalds 已提交
876 877
}

878
void usb_remove_sysfs_dev_files(struct usb_device *udev)
L
Linus Torvalds 已提交
879 880 881
{
	struct device *dev = &udev->dev;

882
	remove_power_attributes(dev);
883
	remove_persist_attributes(dev);
884
	device_remove_bin_file(dev, &dev_bin_attr_descriptors);
L
Linus Torvalds 已提交
885 886
}

887
/* Interface Association Descriptor fields */
888 889
#define usb_intf_assoc_attr(field, format_string)			\
static ssize_t								\
890
iad_##field##_show(struct device *dev, struct device_attribute *attr,	\
891 892
		char *buf)						\
{									\
893
	struct usb_interface *intf = to_usb_interface(dev);		\
894
									\
895 896
	return sprintf(buf, format_string,				\
			intf->intf_assoc->field); 			\
897
}									\
898
static DEVICE_ATTR_RO(iad_##field)
899

900 901 902 903 904
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");
905

L
Linus Torvalds 已提交
906 907 908
/* Interface fields */
#define usb_intf_attr(field, format_string)				\
static ssize_t								\
909
field##_show(struct device *dev, struct device_attribute *attr,		\
910
		char *buf)						\
L
Linus Torvalds 已提交
911
{									\
912
	struct usb_interface *intf = to_usb_interface(dev);		\
L
Linus Torvalds 已提交
913
									\
914
	return sprintf(buf, format_string,				\
915
			intf->cur_altsetting->desc.field); 		\
L
Linus Torvalds 已提交
916
}									\
917
static DEVICE_ATTR_RO(field)
L
Linus Torvalds 已提交
918

919 920 921 922 923 924
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 已提交
925

926 927
static ssize_t interface_show(struct device *dev, struct device_attribute *attr,
			      char *buf)
L
Linus Torvalds 已提交
928 929
{
	struct usb_interface *intf;
930
	char *string;
L
Linus Torvalds 已提交
931

932
	intf = to_usb_interface(dev);
933
	string = ACCESS_ONCE(intf->cur_altsetting->string);
934
	if (!string)
L
Linus Torvalds 已提交
935
		return 0;
936
	return sprintf(buf, "%s\n", string);
L
Linus Torvalds 已提交
937
}
938
static DEVICE_ATTR_RO(interface);
L
Linus Torvalds 已提交
939

940 941
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
			     char *buf)
942 943 944
{
	struct usb_interface *intf;
	struct usb_device *udev;
945
	struct usb_host_interface *alt;
946 947 948

	intf = to_usb_interface(dev);
	udev = interface_to_usbdev(intf);
949
	alt = ACCESS_ONCE(intf->cur_altsetting);
950 951

	return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
952
			"ic%02Xisc%02Xip%02Xin%02X\n",
953 954 955 956 957 958 959 960
			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,
961 962
			alt->desc.bInterfaceProtocol,
			alt->desc.bInterfaceNumber);
963
}
964
static DEVICE_ATTR_RO(modalias);
965

966 967 968
static ssize_t supports_autosuspend_show(struct device *dev,
					 struct device_attribute *attr,
					 char *buf)
969
{
970
	int s;
971

972
	device_lock(dev);
973
	/* Devices will be autosuspended even when an interface isn't claimed */
974 975
	s = (!dev->driver || to_usb_driver(dev->driver)->supports_autosuspend);
	device_unlock(dev);
976

977
	return sprintf(buf, "%u\n", s);
978
}
979
static DEVICE_ATTR_RO(supports_autosuspend);
980

981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
/*
 * 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 已提交
1016 1017 1018 1019 1020 1021 1022
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,
1023
	&dev_attr_modalias.attr,
1024
	&dev_attr_supports_autosuspend.attr,
1025
	&dev_attr_interface_authorized.attr,
L
Linus Torvalds 已提交
1026 1027 1028 1029 1030 1031
	NULL,
};
static struct attribute_group intf_attr_grp = {
	.attrs = intf_attrs,
};

1032 1033 1034 1035 1036 1037 1038 1039 1040
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,
};

1041
static umode_t intf_assoc_attrs_are_visible(struct kobject *kobj,
1042 1043
		struct attribute *a, int n)
{
1044 1045
	struct device *dev = container_of(kobj, struct device, kobj);
	struct usb_interface *intf = to_usb_interface(dev);
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056

	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,
};

1057
const struct attribute_group *usb_interface_groups[] = {
1058 1059 1060 1061 1062
	&intf_attr_grp,
	&intf_assoc_attr_grp,
	NULL
};

1063
void usb_create_sysfs_intf_files(struct usb_interface *intf)
L
Linus Torvalds 已提交
1064
{
1065 1066 1067
	struct usb_device *udev = interface_to_usbdev(intf);
	struct usb_host_interface *alt = intf->cur_altsetting;

1068
	if (intf->sysfs_files_created || intf->unregistering)
1069
		return;
L
Linus Torvalds 已提交
1070

1071
	if (!alt->string && !(udev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
1072
		alt->string = usb_cache_string(udev, alt->desc.iInterface);
1073 1074
	if (alt->string && device_create_file(&intf->dev, &dev_attr_interface))
		;	/* We don't actually care if the function fails. */
1075
	intf->sysfs_files_created = 1;
L
Linus Torvalds 已提交
1076 1077
}

1078
void usb_remove_sysfs_intf_files(struct usb_interface *intf)
L
Linus Torvalds 已提交
1079
{
1080 1081
	if (!intf->sysfs_files_created)
		return;
1082 1083

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