configfs.c (41930B)
1// SPDX-License-Identifier: GPL-2.0 2#include <linux/configfs.h> 3#include <linux/module.h> 4#include <linux/slab.h> 5#include <linux/device.h> 6#include <linux/nls.h> 7#include <linux/usb/composite.h> 8#include <linux/usb/gadget_configfs.h> 9#include "configfs.h" 10#include "u_f.h" 11#include "u_os_desc.h" 12 13int check_user_usb_string(const char *name, 14 struct usb_gadget_strings *stringtab_dev) 15{ 16 u16 num; 17 int ret; 18 19 ret = kstrtou16(name, 0, &num); 20 if (ret) 21 return ret; 22 23 if (!usb_validate_langid(num)) 24 return -EINVAL; 25 26 stringtab_dev->language = num; 27 return 0; 28} 29 30#define MAX_NAME_LEN 40 31#define MAX_USB_STRING_LANGS 2 32 33static const struct usb_descriptor_header *otg_desc[2]; 34 35struct gadget_info { 36 struct config_group group; 37 struct config_group functions_group; 38 struct config_group configs_group; 39 struct config_group strings_group; 40 struct config_group os_desc_group; 41 42 struct mutex lock; 43 struct usb_gadget_strings *gstrings[MAX_USB_STRING_LANGS + 1]; 44 struct list_head string_list; 45 struct list_head available_func; 46 47 struct usb_composite_driver composite; 48 struct usb_composite_dev cdev; 49 bool use_os_desc; 50 char b_vendor_code; 51 char qw_sign[OS_STRING_QW_SIGN_LEN]; 52 spinlock_t spinlock; 53 bool unbind; 54}; 55 56static inline struct gadget_info *to_gadget_info(struct config_item *item) 57{ 58 return container_of(to_config_group(item), struct gadget_info, group); 59} 60 61struct config_usb_cfg { 62 struct config_group group; 63 struct config_group strings_group; 64 struct list_head string_list; 65 struct usb_configuration c; 66 struct list_head func_list; 67 struct usb_gadget_strings *gstrings[MAX_USB_STRING_LANGS + 1]; 68}; 69 70static inline struct config_usb_cfg *to_config_usb_cfg(struct config_item *item) 71{ 72 return container_of(to_config_group(item), struct config_usb_cfg, 73 group); 74} 75 76static inline struct gadget_info *cfg_to_gadget_info(struct config_usb_cfg *cfg) 77{ 78 return container_of(cfg->c.cdev, struct gadget_info, cdev); 79} 80 81struct gadget_strings { 82 struct usb_gadget_strings stringtab_dev; 83 struct usb_string strings[USB_GADGET_FIRST_AVAIL_IDX]; 84 char *manufacturer; 85 char *product; 86 char *serialnumber; 87 88 struct config_group group; 89 struct list_head list; 90}; 91 92struct gadget_config_name { 93 struct usb_gadget_strings stringtab_dev; 94 struct usb_string strings; 95 char *configuration; 96 97 struct config_group group; 98 struct list_head list; 99}; 100 101#define USB_MAX_STRING_WITH_NULL_LEN (USB_MAX_STRING_LEN+1) 102 103static int usb_string_copy(const char *s, char **s_copy) 104{ 105 int ret; 106 char *str; 107 char *copy = *s_copy; 108 ret = strlen(s); 109 if (ret > USB_MAX_STRING_LEN) 110 return -EOVERFLOW; 111 112 if (copy) { 113 str = copy; 114 } else { 115 str = kmalloc(USB_MAX_STRING_WITH_NULL_LEN, GFP_KERNEL); 116 if (!str) 117 return -ENOMEM; 118 } 119 strcpy(str, s); 120 if (str[ret - 1] == '\n') 121 str[ret - 1] = '\0'; 122 *s_copy = str; 123 return 0; 124} 125 126#define GI_DEVICE_DESC_SIMPLE_R_u8(__name) \ 127static ssize_t gadget_dev_desc_##__name##_show(struct config_item *item, \ 128 char *page) \ 129{ \ 130 return sprintf(page, "0x%02x\n", \ 131 to_gadget_info(item)->cdev.desc.__name); \ 132} 133 134#define GI_DEVICE_DESC_SIMPLE_R_u16(__name) \ 135static ssize_t gadget_dev_desc_##__name##_show(struct config_item *item, \ 136 char *page) \ 137{ \ 138 return sprintf(page, "0x%04x\n", \ 139 le16_to_cpup(&to_gadget_info(item)->cdev.desc.__name)); \ 140} 141 142 143#define GI_DEVICE_DESC_SIMPLE_W_u8(_name) \ 144static ssize_t gadget_dev_desc_##_name##_store(struct config_item *item, \ 145 const char *page, size_t len) \ 146{ \ 147 u8 val; \ 148 int ret; \ 149 ret = kstrtou8(page, 0, &val); \ 150 if (ret) \ 151 return ret; \ 152 to_gadget_info(item)->cdev.desc._name = val; \ 153 return len; \ 154} 155 156#define GI_DEVICE_DESC_SIMPLE_W_u16(_name) \ 157static ssize_t gadget_dev_desc_##_name##_store(struct config_item *item, \ 158 const char *page, size_t len) \ 159{ \ 160 u16 val; \ 161 int ret; \ 162 ret = kstrtou16(page, 0, &val); \ 163 if (ret) \ 164 return ret; \ 165 to_gadget_info(item)->cdev.desc._name = cpu_to_le16p(&val); \ 166 return len; \ 167} 168 169#define GI_DEVICE_DESC_SIMPLE_RW(_name, _type) \ 170 GI_DEVICE_DESC_SIMPLE_R_##_type(_name) \ 171 GI_DEVICE_DESC_SIMPLE_W_##_type(_name) 172 173GI_DEVICE_DESC_SIMPLE_R_u16(bcdUSB); 174GI_DEVICE_DESC_SIMPLE_RW(bDeviceClass, u8); 175GI_DEVICE_DESC_SIMPLE_RW(bDeviceSubClass, u8); 176GI_DEVICE_DESC_SIMPLE_RW(bDeviceProtocol, u8); 177GI_DEVICE_DESC_SIMPLE_RW(bMaxPacketSize0, u8); 178GI_DEVICE_DESC_SIMPLE_RW(idVendor, u16); 179GI_DEVICE_DESC_SIMPLE_RW(idProduct, u16); 180GI_DEVICE_DESC_SIMPLE_R_u16(bcdDevice); 181 182static ssize_t is_valid_bcd(u16 bcd_val) 183{ 184 if ((bcd_val & 0xf) > 9) 185 return -EINVAL; 186 if (((bcd_val >> 4) & 0xf) > 9) 187 return -EINVAL; 188 if (((bcd_val >> 8) & 0xf) > 9) 189 return -EINVAL; 190 if (((bcd_val >> 12) & 0xf) > 9) 191 return -EINVAL; 192 return 0; 193} 194 195static ssize_t gadget_dev_desc_bcdDevice_store(struct config_item *item, 196 const char *page, size_t len) 197{ 198 u16 bcdDevice; 199 int ret; 200 201 ret = kstrtou16(page, 0, &bcdDevice); 202 if (ret) 203 return ret; 204 ret = is_valid_bcd(bcdDevice); 205 if (ret) 206 return ret; 207 208 to_gadget_info(item)->cdev.desc.bcdDevice = cpu_to_le16(bcdDevice); 209 return len; 210} 211 212static ssize_t gadget_dev_desc_bcdUSB_store(struct config_item *item, 213 const char *page, size_t len) 214{ 215 u16 bcdUSB; 216 int ret; 217 218 ret = kstrtou16(page, 0, &bcdUSB); 219 if (ret) 220 return ret; 221 ret = is_valid_bcd(bcdUSB); 222 if (ret) 223 return ret; 224 225 to_gadget_info(item)->cdev.desc.bcdUSB = cpu_to_le16(bcdUSB); 226 return len; 227} 228 229static ssize_t gadget_dev_desc_UDC_show(struct config_item *item, char *page) 230{ 231 struct gadget_info *gi = to_gadget_info(item); 232 char *udc_name; 233 int ret; 234 235 mutex_lock(&gi->lock); 236 udc_name = gi->composite.gadget_driver.udc_name; 237 ret = sprintf(page, "%s\n", udc_name ?: ""); 238 mutex_unlock(&gi->lock); 239 240 return ret; 241} 242 243static int unregister_gadget(struct gadget_info *gi) 244{ 245 int ret; 246 247 if (!gi->composite.gadget_driver.udc_name) 248 return -ENODEV; 249 250 ret = usb_gadget_unregister_driver(&gi->composite.gadget_driver); 251 if (ret) 252 return ret; 253 kfree(gi->composite.gadget_driver.udc_name); 254 gi->composite.gadget_driver.udc_name = NULL; 255 return 0; 256} 257 258static ssize_t gadget_dev_desc_UDC_store(struct config_item *item, 259 const char *page, size_t len) 260{ 261 struct gadget_info *gi = to_gadget_info(item); 262 char *name; 263 int ret; 264 265 if (strlen(page) < len) 266 return -EOVERFLOW; 267 268 name = kstrdup(page, GFP_KERNEL); 269 if (!name) 270 return -ENOMEM; 271 if (name[len - 1] == '\n') 272 name[len - 1] = '\0'; 273 274 mutex_lock(&gi->lock); 275 276 if (!strlen(name)) { 277 ret = unregister_gadget(gi); 278 if (ret) 279 goto err; 280 kfree(name); 281 } else { 282 if (gi->composite.gadget_driver.udc_name) { 283 ret = -EBUSY; 284 goto err; 285 } 286 gi->composite.gadget_driver.udc_name = name; 287 ret = usb_gadget_register_driver(&gi->composite.gadget_driver); 288 if (ret) { 289 gi->composite.gadget_driver.udc_name = NULL; 290 goto err; 291 } 292 } 293 mutex_unlock(&gi->lock); 294 return len; 295err: 296 kfree(name); 297 mutex_unlock(&gi->lock); 298 return ret; 299} 300 301static ssize_t gadget_dev_desc_max_speed_show(struct config_item *item, 302 char *page) 303{ 304 enum usb_device_speed speed = to_gadget_info(item)->composite.max_speed; 305 306 return sprintf(page, "%s\n", usb_speed_string(speed)); 307} 308 309static ssize_t gadget_dev_desc_max_speed_store(struct config_item *item, 310 const char *page, size_t len) 311{ 312 struct gadget_info *gi = to_gadget_info(item); 313 314 mutex_lock(&gi->lock); 315 316 /* Prevent changing of max_speed after the driver is binded */ 317 if (gi->composite.gadget_driver.udc_name) 318 goto err; 319 320 if (strncmp(page, "super-speed-plus", 16) == 0) 321 gi->composite.max_speed = USB_SPEED_SUPER_PLUS; 322 else if (strncmp(page, "super-speed", 11) == 0) 323 gi->composite.max_speed = USB_SPEED_SUPER; 324 else if (strncmp(page, "high-speed", 10) == 0) 325 gi->composite.max_speed = USB_SPEED_HIGH; 326 else if (strncmp(page, "full-speed", 10) == 0) 327 gi->composite.max_speed = USB_SPEED_FULL; 328 else if (strncmp(page, "low-speed", 9) == 0) 329 gi->composite.max_speed = USB_SPEED_LOW; 330 else 331 goto err; 332 333 gi->composite.gadget_driver.max_speed = gi->composite.max_speed; 334 335 mutex_unlock(&gi->lock); 336 return len; 337err: 338 mutex_unlock(&gi->lock); 339 return -EINVAL; 340} 341 342CONFIGFS_ATTR(gadget_dev_desc_, bDeviceClass); 343CONFIGFS_ATTR(gadget_dev_desc_, bDeviceSubClass); 344CONFIGFS_ATTR(gadget_dev_desc_, bDeviceProtocol); 345CONFIGFS_ATTR(gadget_dev_desc_, bMaxPacketSize0); 346CONFIGFS_ATTR(gadget_dev_desc_, idVendor); 347CONFIGFS_ATTR(gadget_dev_desc_, idProduct); 348CONFIGFS_ATTR(gadget_dev_desc_, bcdDevice); 349CONFIGFS_ATTR(gadget_dev_desc_, bcdUSB); 350CONFIGFS_ATTR(gadget_dev_desc_, UDC); 351CONFIGFS_ATTR(gadget_dev_desc_, max_speed); 352 353static struct configfs_attribute *gadget_root_attrs[] = { 354 &gadget_dev_desc_attr_bDeviceClass, 355 &gadget_dev_desc_attr_bDeviceSubClass, 356 &gadget_dev_desc_attr_bDeviceProtocol, 357 &gadget_dev_desc_attr_bMaxPacketSize0, 358 &gadget_dev_desc_attr_idVendor, 359 &gadget_dev_desc_attr_idProduct, 360 &gadget_dev_desc_attr_bcdDevice, 361 &gadget_dev_desc_attr_bcdUSB, 362 &gadget_dev_desc_attr_UDC, 363 &gadget_dev_desc_attr_max_speed, 364 NULL, 365}; 366 367static inline struct gadget_strings *to_gadget_strings(struct config_item *item) 368{ 369 return container_of(to_config_group(item), struct gadget_strings, 370 group); 371} 372 373static inline struct gadget_config_name *to_gadget_config_name( 374 struct config_item *item) 375{ 376 return container_of(to_config_group(item), struct gadget_config_name, 377 group); 378} 379 380static inline struct usb_function_instance *to_usb_function_instance( 381 struct config_item *item) 382{ 383 return container_of(to_config_group(item), 384 struct usb_function_instance, group); 385} 386 387static void gadget_info_attr_release(struct config_item *item) 388{ 389 struct gadget_info *gi = to_gadget_info(item); 390 391 WARN_ON(!list_empty(&gi->cdev.configs)); 392 WARN_ON(!list_empty(&gi->string_list)); 393 WARN_ON(!list_empty(&gi->available_func)); 394 kfree(gi->composite.gadget_driver.function); 395 kfree(gi); 396} 397 398static struct configfs_item_operations gadget_root_item_ops = { 399 .release = gadget_info_attr_release, 400}; 401 402static void gadget_config_attr_release(struct config_item *item) 403{ 404 struct config_usb_cfg *cfg = to_config_usb_cfg(item); 405 406 WARN_ON(!list_empty(&cfg->c.functions)); 407 list_del(&cfg->c.list); 408 kfree(cfg->c.label); 409 kfree(cfg); 410} 411 412static int config_usb_cfg_link( 413 struct config_item *usb_cfg_ci, 414 struct config_item *usb_func_ci) 415{ 416 struct config_usb_cfg *cfg = to_config_usb_cfg(usb_cfg_ci); 417 struct gadget_info *gi = cfg_to_gadget_info(cfg); 418 419 struct usb_function_instance *fi = 420 to_usb_function_instance(usb_func_ci); 421 struct usb_function_instance *a_fi = NULL, *iter; 422 struct usb_function *f; 423 int ret; 424 425 mutex_lock(&gi->lock); 426 /* 427 * Make sure this function is from within our _this_ gadget and not 428 * from another gadget or a random directory. 429 * Also a function instance can only be linked once. 430 */ 431 list_for_each_entry(iter, &gi->available_func, cfs_list) { 432 if (iter != fi) 433 continue; 434 a_fi = iter; 435 break; 436 } 437 if (!a_fi) { 438 ret = -EINVAL; 439 goto out; 440 } 441 442 list_for_each_entry(f, &cfg->func_list, list) { 443 if (f->fi == fi) { 444 ret = -EEXIST; 445 goto out; 446 } 447 } 448 449 f = usb_get_function(fi); 450 if (IS_ERR(f)) { 451 ret = PTR_ERR(f); 452 goto out; 453 } 454 455 /* stash the function until we bind it to the gadget */ 456 list_add_tail(&f->list, &cfg->func_list); 457 ret = 0; 458out: 459 mutex_unlock(&gi->lock); 460 return ret; 461} 462 463static void config_usb_cfg_unlink( 464 struct config_item *usb_cfg_ci, 465 struct config_item *usb_func_ci) 466{ 467 struct config_usb_cfg *cfg = to_config_usb_cfg(usb_cfg_ci); 468 struct gadget_info *gi = cfg_to_gadget_info(cfg); 469 470 struct usb_function_instance *fi = 471 to_usb_function_instance(usb_func_ci); 472 struct usb_function *f; 473 474 /* 475 * ideally I would like to forbid to unlink functions while a gadget is 476 * bound to an UDC. Since this isn't possible at the moment, we simply 477 * force an unbind, the function is available here and then we can 478 * remove the function. 479 */ 480 mutex_lock(&gi->lock); 481 if (gi->composite.gadget_driver.udc_name) 482 unregister_gadget(gi); 483 WARN_ON(gi->composite.gadget_driver.udc_name); 484 485 list_for_each_entry(f, &cfg->func_list, list) { 486 if (f->fi == fi) { 487 list_del(&f->list); 488 usb_put_function(f); 489 mutex_unlock(&gi->lock); 490 return; 491 } 492 } 493 mutex_unlock(&gi->lock); 494 WARN(1, "Unable to locate function to unbind\n"); 495} 496 497static struct configfs_item_operations gadget_config_item_ops = { 498 .release = gadget_config_attr_release, 499 .allow_link = config_usb_cfg_link, 500 .drop_link = config_usb_cfg_unlink, 501}; 502 503 504static ssize_t gadget_config_desc_MaxPower_show(struct config_item *item, 505 char *page) 506{ 507 struct config_usb_cfg *cfg = to_config_usb_cfg(item); 508 509 return sprintf(page, "%u\n", cfg->c.MaxPower); 510} 511 512static ssize_t gadget_config_desc_MaxPower_store(struct config_item *item, 513 const char *page, size_t len) 514{ 515 struct config_usb_cfg *cfg = to_config_usb_cfg(item); 516 u16 val; 517 int ret; 518 ret = kstrtou16(page, 0, &val); 519 if (ret) 520 return ret; 521 if (DIV_ROUND_UP(val, 8) > 0xff) 522 return -ERANGE; 523 cfg->c.MaxPower = val; 524 return len; 525} 526 527static ssize_t gadget_config_desc_bmAttributes_show(struct config_item *item, 528 char *page) 529{ 530 struct config_usb_cfg *cfg = to_config_usb_cfg(item); 531 532 return sprintf(page, "0x%02x\n", cfg->c.bmAttributes); 533} 534 535static ssize_t gadget_config_desc_bmAttributes_store(struct config_item *item, 536 const char *page, size_t len) 537{ 538 struct config_usb_cfg *cfg = to_config_usb_cfg(item); 539 u8 val; 540 int ret; 541 ret = kstrtou8(page, 0, &val); 542 if (ret) 543 return ret; 544 if (!(val & USB_CONFIG_ATT_ONE)) 545 return -EINVAL; 546 if (val & ~(USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER | 547 USB_CONFIG_ATT_WAKEUP)) 548 return -EINVAL; 549 cfg->c.bmAttributes = val; 550 return len; 551} 552 553CONFIGFS_ATTR(gadget_config_desc_, MaxPower); 554CONFIGFS_ATTR(gadget_config_desc_, bmAttributes); 555 556static struct configfs_attribute *gadget_config_attrs[] = { 557 &gadget_config_desc_attr_MaxPower, 558 &gadget_config_desc_attr_bmAttributes, 559 NULL, 560}; 561 562static const struct config_item_type gadget_config_type = { 563 .ct_item_ops = &gadget_config_item_ops, 564 .ct_attrs = gadget_config_attrs, 565 .ct_owner = THIS_MODULE, 566}; 567 568static const struct config_item_type gadget_root_type = { 569 .ct_item_ops = &gadget_root_item_ops, 570 .ct_attrs = gadget_root_attrs, 571 .ct_owner = THIS_MODULE, 572}; 573 574static void composite_init_dev(struct usb_composite_dev *cdev) 575{ 576 spin_lock_init(&cdev->lock); 577 INIT_LIST_HEAD(&cdev->configs); 578 INIT_LIST_HEAD(&cdev->gstrings); 579} 580 581static struct config_group *function_make( 582 struct config_group *group, 583 const char *name) 584{ 585 struct gadget_info *gi; 586 struct usb_function_instance *fi; 587 char buf[MAX_NAME_LEN]; 588 char *func_name; 589 char *instance_name; 590 int ret; 591 592 ret = snprintf(buf, MAX_NAME_LEN, "%s", name); 593 if (ret >= MAX_NAME_LEN) 594 return ERR_PTR(-ENAMETOOLONG); 595 596 func_name = buf; 597 instance_name = strchr(func_name, '.'); 598 if (!instance_name) { 599 pr_err("Unable to locate . in FUNC.INSTANCE\n"); 600 return ERR_PTR(-EINVAL); 601 } 602 *instance_name = '\0'; 603 instance_name++; 604 605 fi = usb_get_function_instance(func_name); 606 if (IS_ERR(fi)) 607 return ERR_CAST(fi); 608 609 ret = config_item_set_name(&fi->group.cg_item, "%s", name); 610 if (ret) { 611 usb_put_function_instance(fi); 612 return ERR_PTR(ret); 613 } 614 if (fi->set_inst_name) { 615 ret = fi->set_inst_name(fi, instance_name); 616 if (ret) { 617 usb_put_function_instance(fi); 618 return ERR_PTR(ret); 619 } 620 } 621 622 gi = container_of(group, struct gadget_info, functions_group); 623 624 mutex_lock(&gi->lock); 625 list_add_tail(&fi->cfs_list, &gi->available_func); 626 mutex_unlock(&gi->lock); 627 return &fi->group; 628} 629 630static void function_drop( 631 struct config_group *group, 632 struct config_item *item) 633{ 634 struct usb_function_instance *fi = to_usb_function_instance(item); 635 struct gadget_info *gi; 636 637 gi = container_of(group, struct gadget_info, functions_group); 638 639 mutex_lock(&gi->lock); 640 list_del(&fi->cfs_list); 641 mutex_unlock(&gi->lock); 642 config_item_put(item); 643} 644 645static struct configfs_group_operations functions_ops = { 646 .make_group = &function_make, 647 .drop_item = &function_drop, 648}; 649 650static const struct config_item_type functions_type = { 651 .ct_group_ops = &functions_ops, 652 .ct_owner = THIS_MODULE, 653}; 654 655GS_STRINGS_RW(gadget_config_name, configuration); 656 657static struct configfs_attribute *gadget_config_name_langid_attrs[] = { 658 &gadget_config_name_attr_configuration, 659 NULL, 660}; 661 662static void gadget_config_name_attr_release(struct config_item *item) 663{ 664 struct gadget_config_name *cn = to_gadget_config_name(item); 665 666 kfree(cn->configuration); 667 668 list_del(&cn->list); 669 kfree(cn); 670} 671 672USB_CONFIG_STRING_RW_OPS(gadget_config_name); 673USB_CONFIG_STRINGS_LANG(gadget_config_name, config_usb_cfg); 674 675static struct config_group *config_desc_make( 676 struct config_group *group, 677 const char *name) 678{ 679 struct gadget_info *gi; 680 struct config_usb_cfg *cfg; 681 char buf[MAX_NAME_LEN]; 682 char *num_str; 683 u8 num; 684 int ret; 685 686 gi = container_of(group, struct gadget_info, configs_group); 687 ret = snprintf(buf, MAX_NAME_LEN, "%s", name); 688 if (ret >= MAX_NAME_LEN) 689 return ERR_PTR(-ENAMETOOLONG); 690 691 num_str = strchr(buf, '.'); 692 if (!num_str) { 693 pr_err("Unable to locate . in name.bConfigurationValue\n"); 694 return ERR_PTR(-EINVAL); 695 } 696 697 *num_str = '\0'; 698 num_str++; 699 700 if (!strlen(buf)) 701 return ERR_PTR(-EINVAL); 702 703 ret = kstrtou8(num_str, 0, &num); 704 if (ret) 705 return ERR_PTR(ret); 706 707 cfg = kzalloc(sizeof(*cfg), GFP_KERNEL); 708 if (!cfg) 709 return ERR_PTR(-ENOMEM); 710 cfg->c.label = kstrdup(buf, GFP_KERNEL); 711 if (!cfg->c.label) { 712 ret = -ENOMEM; 713 goto err; 714 } 715 cfg->c.bConfigurationValue = num; 716 cfg->c.MaxPower = CONFIG_USB_GADGET_VBUS_DRAW; 717 cfg->c.bmAttributes = USB_CONFIG_ATT_ONE; 718 INIT_LIST_HEAD(&cfg->string_list); 719 INIT_LIST_HEAD(&cfg->func_list); 720 721 config_group_init_type_name(&cfg->group, name, 722 &gadget_config_type); 723 724 config_group_init_type_name(&cfg->strings_group, "strings", 725 &gadget_config_name_strings_type); 726 configfs_add_default_group(&cfg->strings_group, &cfg->group); 727 728 ret = usb_add_config_only(&gi->cdev, &cfg->c); 729 if (ret) 730 goto err; 731 732 return &cfg->group; 733err: 734 kfree(cfg->c.label); 735 kfree(cfg); 736 return ERR_PTR(ret); 737} 738 739static void config_desc_drop( 740 struct config_group *group, 741 struct config_item *item) 742{ 743 config_item_put(item); 744} 745 746static struct configfs_group_operations config_desc_ops = { 747 .make_group = &config_desc_make, 748 .drop_item = &config_desc_drop, 749}; 750 751static const struct config_item_type config_desc_type = { 752 .ct_group_ops = &config_desc_ops, 753 .ct_owner = THIS_MODULE, 754}; 755 756GS_STRINGS_RW(gadget_strings, manufacturer); 757GS_STRINGS_RW(gadget_strings, product); 758GS_STRINGS_RW(gadget_strings, serialnumber); 759 760static struct configfs_attribute *gadget_strings_langid_attrs[] = { 761 &gadget_strings_attr_manufacturer, 762 &gadget_strings_attr_product, 763 &gadget_strings_attr_serialnumber, 764 NULL, 765}; 766 767static void gadget_strings_attr_release(struct config_item *item) 768{ 769 struct gadget_strings *gs = to_gadget_strings(item); 770 771 kfree(gs->manufacturer); 772 kfree(gs->product); 773 kfree(gs->serialnumber); 774 775 list_del(&gs->list); 776 kfree(gs); 777} 778 779USB_CONFIG_STRING_RW_OPS(gadget_strings); 780USB_CONFIG_STRINGS_LANG(gadget_strings, gadget_info); 781 782static inline struct gadget_info *os_desc_item_to_gadget_info( 783 struct config_item *item) 784{ 785 return container_of(to_config_group(item), 786 struct gadget_info, os_desc_group); 787} 788 789static ssize_t os_desc_use_show(struct config_item *item, char *page) 790{ 791 return sprintf(page, "%d\n", 792 os_desc_item_to_gadget_info(item)->use_os_desc); 793} 794 795static ssize_t os_desc_use_store(struct config_item *item, const char *page, 796 size_t len) 797{ 798 struct gadget_info *gi = os_desc_item_to_gadget_info(item); 799 int ret; 800 bool use; 801 802 mutex_lock(&gi->lock); 803 ret = strtobool(page, &use); 804 if (!ret) { 805 gi->use_os_desc = use; 806 ret = len; 807 } 808 mutex_unlock(&gi->lock); 809 810 return ret; 811} 812 813static ssize_t os_desc_b_vendor_code_show(struct config_item *item, char *page) 814{ 815 return sprintf(page, "0x%02x\n", 816 os_desc_item_to_gadget_info(item)->b_vendor_code); 817} 818 819static ssize_t os_desc_b_vendor_code_store(struct config_item *item, 820 const char *page, size_t len) 821{ 822 struct gadget_info *gi = os_desc_item_to_gadget_info(item); 823 int ret; 824 u8 b_vendor_code; 825 826 mutex_lock(&gi->lock); 827 ret = kstrtou8(page, 0, &b_vendor_code); 828 if (!ret) { 829 gi->b_vendor_code = b_vendor_code; 830 ret = len; 831 } 832 mutex_unlock(&gi->lock); 833 834 return ret; 835} 836 837static ssize_t os_desc_qw_sign_show(struct config_item *item, char *page) 838{ 839 struct gadget_info *gi = os_desc_item_to_gadget_info(item); 840 int res; 841 842 res = utf16s_to_utf8s((wchar_t *) gi->qw_sign, OS_STRING_QW_SIGN_LEN, 843 UTF16_LITTLE_ENDIAN, page, PAGE_SIZE - 1); 844 page[res++] = '\n'; 845 846 return res; 847} 848 849static ssize_t os_desc_qw_sign_store(struct config_item *item, const char *page, 850 size_t len) 851{ 852 struct gadget_info *gi = os_desc_item_to_gadget_info(item); 853 int res, l; 854 855 l = min((int)len, OS_STRING_QW_SIGN_LEN >> 1); 856 if (page[l - 1] == '\n') 857 --l; 858 859 mutex_lock(&gi->lock); 860 res = utf8s_to_utf16s(page, l, 861 UTF16_LITTLE_ENDIAN, (wchar_t *) gi->qw_sign, 862 OS_STRING_QW_SIGN_LEN); 863 if (res > 0) 864 res = len; 865 mutex_unlock(&gi->lock); 866 867 return res; 868} 869 870CONFIGFS_ATTR(os_desc_, use); 871CONFIGFS_ATTR(os_desc_, b_vendor_code); 872CONFIGFS_ATTR(os_desc_, qw_sign); 873 874static struct configfs_attribute *os_desc_attrs[] = { 875 &os_desc_attr_use, 876 &os_desc_attr_b_vendor_code, 877 &os_desc_attr_qw_sign, 878 NULL, 879}; 880 881static int os_desc_link(struct config_item *os_desc_ci, 882 struct config_item *usb_cfg_ci) 883{ 884 struct gadget_info *gi = os_desc_item_to_gadget_info(os_desc_ci); 885 struct usb_composite_dev *cdev = &gi->cdev; 886 struct config_usb_cfg *c_target = to_config_usb_cfg(usb_cfg_ci); 887 struct usb_configuration *c = NULL, *iter; 888 int ret; 889 890 mutex_lock(&gi->lock); 891 list_for_each_entry(iter, &cdev->configs, list) { 892 if (iter != &c_target->c) 893 continue; 894 c = iter; 895 break; 896 } 897 if (!c) { 898 ret = -EINVAL; 899 goto out; 900 } 901 902 if (cdev->os_desc_config) { 903 ret = -EBUSY; 904 goto out; 905 } 906 907 cdev->os_desc_config = &c_target->c; 908 ret = 0; 909 910out: 911 mutex_unlock(&gi->lock); 912 return ret; 913} 914 915static void os_desc_unlink(struct config_item *os_desc_ci, 916 struct config_item *usb_cfg_ci) 917{ 918 struct gadget_info *gi = os_desc_item_to_gadget_info(os_desc_ci); 919 struct usb_composite_dev *cdev = &gi->cdev; 920 921 mutex_lock(&gi->lock); 922 if (gi->composite.gadget_driver.udc_name) 923 unregister_gadget(gi); 924 cdev->os_desc_config = NULL; 925 WARN_ON(gi->composite.gadget_driver.udc_name); 926 mutex_unlock(&gi->lock); 927} 928 929static struct configfs_item_operations os_desc_ops = { 930 .allow_link = os_desc_link, 931 .drop_link = os_desc_unlink, 932}; 933 934static struct config_item_type os_desc_type = { 935 .ct_item_ops = &os_desc_ops, 936 .ct_attrs = os_desc_attrs, 937 .ct_owner = THIS_MODULE, 938}; 939 940static inline struct usb_os_desc_ext_prop 941*to_usb_os_desc_ext_prop(struct config_item *item) 942{ 943 return container_of(item, struct usb_os_desc_ext_prop, item); 944} 945 946static ssize_t ext_prop_type_show(struct config_item *item, char *page) 947{ 948 return sprintf(page, "%d\n", to_usb_os_desc_ext_prop(item)->type); 949} 950 951static ssize_t ext_prop_type_store(struct config_item *item, 952 const char *page, size_t len) 953{ 954 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 955 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); 956 u8 type; 957 int ret; 958 959 if (desc->opts_mutex) 960 mutex_lock(desc->opts_mutex); 961 ret = kstrtou8(page, 0, &type); 962 if (ret) 963 goto end; 964 if (type < USB_EXT_PROP_UNICODE || type > USB_EXT_PROP_UNICODE_MULTI) { 965 ret = -EINVAL; 966 goto end; 967 } 968 969 if ((ext_prop->type == USB_EXT_PROP_BINARY || 970 ext_prop->type == USB_EXT_PROP_LE32 || 971 ext_prop->type == USB_EXT_PROP_BE32) && 972 (type == USB_EXT_PROP_UNICODE || 973 type == USB_EXT_PROP_UNICODE_ENV || 974 type == USB_EXT_PROP_UNICODE_LINK)) 975 ext_prop->data_len <<= 1; 976 else if ((ext_prop->type == USB_EXT_PROP_UNICODE || 977 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || 978 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) && 979 (type == USB_EXT_PROP_BINARY || 980 type == USB_EXT_PROP_LE32 || 981 type == USB_EXT_PROP_BE32)) 982 ext_prop->data_len >>= 1; 983 ext_prop->type = type; 984 ret = len; 985 986end: 987 if (desc->opts_mutex) 988 mutex_unlock(desc->opts_mutex); 989 return ret; 990} 991 992static ssize_t ext_prop_data_show(struct config_item *item, char *page) 993{ 994 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 995 int len = ext_prop->data_len; 996 997 if (ext_prop->type == USB_EXT_PROP_UNICODE || 998 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || 999 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) 1000 len >>= 1; 1001 memcpy(page, ext_prop->data, len); 1002 1003 return len; 1004} 1005 1006static ssize_t ext_prop_data_store(struct config_item *item, 1007 const char *page, size_t len) 1008{ 1009 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 1010 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); 1011 char *new_data; 1012 size_t ret_len = len; 1013 1014 if (page[len - 1] == '\n' || page[len - 1] == '\0') 1015 --len; 1016 new_data = kmemdup(page, len, GFP_KERNEL); 1017 if (!new_data) 1018 return -ENOMEM; 1019 1020 if (desc->opts_mutex) 1021 mutex_lock(desc->opts_mutex); 1022 kfree(ext_prop->data); 1023 ext_prop->data = new_data; 1024 desc->ext_prop_len -= ext_prop->data_len; 1025 ext_prop->data_len = len; 1026 desc->ext_prop_len += ext_prop->data_len; 1027 if (ext_prop->type == USB_EXT_PROP_UNICODE || 1028 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || 1029 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) { 1030 desc->ext_prop_len -= ext_prop->data_len; 1031 ext_prop->data_len <<= 1; 1032 ext_prop->data_len += 2; 1033 desc->ext_prop_len += ext_prop->data_len; 1034 } 1035 if (desc->opts_mutex) 1036 mutex_unlock(desc->opts_mutex); 1037 return ret_len; 1038} 1039 1040CONFIGFS_ATTR(ext_prop_, type); 1041CONFIGFS_ATTR(ext_prop_, data); 1042 1043static struct configfs_attribute *ext_prop_attrs[] = { 1044 &ext_prop_attr_type, 1045 &ext_prop_attr_data, 1046 NULL, 1047}; 1048 1049static void usb_os_desc_ext_prop_release(struct config_item *item) 1050{ 1051 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 1052 1053 kfree(ext_prop); /* frees a whole chunk */ 1054} 1055 1056static struct configfs_item_operations ext_prop_ops = { 1057 .release = usb_os_desc_ext_prop_release, 1058}; 1059 1060static struct config_item *ext_prop_make( 1061 struct config_group *group, 1062 const char *name) 1063{ 1064 struct usb_os_desc_ext_prop *ext_prop; 1065 struct config_item_type *ext_prop_type; 1066 struct usb_os_desc *desc; 1067 char *vlabuf; 1068 1069 vla_group(data_chunk); 1070 vla_item(data_chunk, struct usb_os_desc_ext_prop, ext_prop, 1); 1071 vla_item(data_chunk, struct config_item_type, ext_prop_type, 1); 1072 1073 vlabuf = kzalloc(vla_group_size(data_chunk), GFP_KERNEL); 1074 if (!vlabuf) 1075 return ERR_PTR(-ENOMEM); 1076 1077 ext_prop = vla_ptr(vlabuf, data_chunk, ext_prop); 1078 ext_prop_type = vla_ptr(vlabuf, data_chunk, ext_prop_type); 1079 1080 desc = container_of(group, struct usb_os_desc, group); 1081 ext_prop_type->ct_item_ops = &ext_prop_ops; 1082 ext_prop_type->ct_attrs = ext_prop_attrs; 1083 ext_prop_type->ct_owner = desc->owner; 1084 1085 config_item_init_type_name(&ext_prop->item, name, ext_prop_type); 1086 1087 ext_prop->name = kstrdup(name, GFP_KERNEL); 1088 if (!ext_prop->name) { 1089 kfree(vlabuf); 1090 return ERR_PTR(-ENOMEM); 1091 } 1092 desc->ext_prop_len += 14; 1093 ext_prop->name_len = 2 * strlen(ext_prop->name) + 2; 1094 if (desc->opts_mutex) 1095 mutex_lock(desc->opts_mutex); 1096 desc->ext_prop_len += ext_prop->name_len; 1097 list_add_tail(&ext_prop->entry, &desc->ext_prop); 1098 ++desc->ext_prop_count; 1099 if (desc->opts_mutex) 1100 mutex_unlock(desc->opts_mutex); 1101 1102 return &ext_prop->item; 1103} 1104 1105static void ext_prop_drop(struct config_group *group, struct config_item *item) 1106{ 1107 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 1108 struct usb_os_desc *desc = to_usb_os_desc(&group->cg_item); 1109 1110 if (desc->opts_mutex) 1111 mutex_lock(desc->opts_mutex); 1112 list_del(&ext_prop->entry); 1113 --desc->ext_prop_count; 1114 kfree(ext_prop->name); 1115 desc->ext_prop_len -= (ext_prop->name_len + ext_prop->data_len + 14); 1116 if (desc->opts_mutex) 1117 mutex_unlock(desc->opts_mutex); 1118 config_item_put(item); 1119} 1120 1121static struct configfs_group_operations interf_grp_ops = { 1122 .make_item = &ext_prop_make, 1123 .drop_item = &ext_prop_drop, 1124}; 1125 1126static ssize_t interf_grp_compatible_id_show(struct config_item *item, 1127 char *page) 1128{ 1129 memcpy(page, to_usb_os_desc(item)->ext_compat_id, 8); 1130 return 8; 1131} 1132 1133static ssize_t interf_grp_compatible_id_store(struct config_item *item, 1134 const char *page, size_t len) 1135{ 1136 struct usb_os_desc *desc = to_usb_os_desc(item); 1137 int l; 1138 1139 l = min_t(int, 8, len); 1140 if (page[l - 1] == '\n') 1141 --l; 1142 if (desc->opts_mutex) 1143 mutex_lock(desc->opts_mutex); 1144 memcpy(desc->ext_compat_id, page, l); 1145 1146 if (desc->opts_mutex) 1147 mutex_unlock(desc->opts_mutex); 1148 1149 return len; 1150} 1151 1152static ssize_t interf_grp_sub_compatible_id_show(struct config_item *item, 1153 char *page) 1154{ 1155 memcpy(page, to_usb_os_desc(item)->ext_compat_id + 8, 8); 1156 return 8; 1157} 1158 1159static ssize_t interf_grp_sub_compatible_id_store(struct config_item *item, 1160 const char *page, size_t len) 1161{ 1162 struct usb_os_desc *desc = to_usb_os_desc(item); 1163 int l; 1164 1165 l = min_t(int, 8, len); 1166 if (page[l - 1] == '\n') 1167 --l; 1168 if (desc->opts_mutex) 1169 mutex_lock(desc->opts_mutex); 1170 memcpy(desc->ext_compat_id + 8, page, l); 1171 1172 if (desc->opts_mutex) 1173 mutex_unlock(desc->opts_mutex); 1174 1175 return len; 1176} 1177 1178CONFIGFS_ATTR(interf_grp_, compatible_id); 1179CONFIGFS_ATTR(interf_grp_, sub_compatible_id); 1180 1181static struct configfs_attribute *interf_grp_attrs[] = { 1182 &interf_grp_attr_compatible_id, 1183 &interf_grp_attr_sub_compatible_id, 1184 NULL 1185}; 1186 1187struct config_group *usb_os_desc_prepare_interf_dir( 1188 struct config_group *parent, 1189 int n_interf, 1190 struct usb_os_desc **desc, 1191 char **names, 1192 struct module *owner) 1193{ 1194 struct config_group *os_desc_group; 1195 struct config_item_type *os_desc_type, *interface_type; 1196 1197 vla_group(data_chunk); 1198 vla_item(data_chunk, struct config_group, os_desc_group, 1); 1199 vla_item(data_chunk, struct config_item_type, os_desc_type, 1); 1200 vla_item(data_chunk, struct config_item_type, interface_type, 1); 1201 1202 char *vlabuf = kzalloc(vla_group_size(data_chunk), GFP_KERNEL); 1203 if (!vlabuf) 1204 return ERR_PTR(-ENOMEM); 1205 1206 os_desc_group = vla_ptr(vlabuf, data_chunk, os_desc_group); 1207 os_desc_type = vla_ptr(vlabuf, data_chunk, os_desc_type); 1208 interface_type = vla_ptr(vlabuf, data_chunk, interface_type); 1209 1210 os_desc_type->ct_owner = owner; 1211 config_group_init_type_name(os_desc_group, "os_desc", os_desc_type); 1212 configfs_add_default_group(os_desc_group, parent); 1213 1214 interface_type->ct_group_ops = &interf_grp_ops; 1215 interface_type->ct_attrs = interf_grp_attrs; 1216 interface_type->ct_owner = owner; 1217 1218 while (n_interf--) { 1219 struct usb_os_desc *d; 1220 1221 d = desc[n_interf]; 1222 d->owner = owner; 1223 config_group_init_type_name(&d->group, "", interface_type); 1224 config_item_set_name(&d->group.cg_item, "interface.%s", 1225 names[n_interf]); 1226 configfs_add_default_group(&d->group, os_desc_group); 1227 } 1228 1229 return os_desc_group; 1230} 1231EXPORT_SYMBOL(usb_os_desc_prepare_interf_dir); 1232 1233static int configfs_do_nothing(struct usb_composite_dev *cdev) 1234{ 1235 WARN_ON(1); 1236 return -EINVAL; 1237} 1238 1239int composite_dev_prepare(struct usb_composite_driver *composite, 1240 struct usb_composite_dev *dev); 1241 1242int composite_os_desc_req_prepare(struct usb_composite_dev *cdev, 1243 struct usb_ep *ep0); 1244 1245static void purge_configs_funcs(struct gadget_info *gi) 1246{ 1247 struct usb_configuration *c; 1248 1249 list_for_each_entry(c, &gi->cdev.configs, list) { 1250 struct usb_function *f, *tmp; 1251 struct config_usb_cfg *cfg; 1252 1253 cfg = container_of(c, struct config_usb_cfg, c); 1254 1255 list_for_each_entry_safe_reverse(f, tmp, &c->functions, list) { 1256 1257 list_move(&f->list, &cfg->func_list); 1258 if (f->unbind) { 1259 dev_dbg(&gi->cdev.gadget->dev, 1260 "unbind function '%s'/%p\n", 1261 f->name, f); 1262 f->unbind(c, f); 1263 } 1264 } 1265 c->next_interface_id = 0; 1266 memset(c->interface, 0, sizeof(c->interface)); 1267 c->superspeed_plus = 0; 1268 c->superspeed = 0; 1269 c->highspeed = 0; 1270 c->fullspeed = 0; 1271 } 1272} 1273 1274static int configfs_composite_bind(struct usb_gadget *gadget, 1275 struct usb_gadget_driver *gdriver) 1276{ 1277 struct usb_composite_driver *composite = to_cdriver(gdriver); 1278 struct gadget_info *gi = container_of(composite, 1279 struct gadget_info, composite); 1280 struct usb_composite_dev *cdev = &gi->cdev; 1281 struct usb_configuration *c; 1282 struct usb_string *s; 1283 unsigned i; 1284 int ret; 1285 1286 /* the gi->lock is hold by the caller */ 1287 gi->unbind = 0; 1288 cdev->gadget = gadget; 1289 set_gadget_data(gadget, cdev); 1290 ret = composite_dev_prepare(composite, cdev); 1291 if (ret) 1292 return ret; 1293 /* and now the gadget bind */ 1294 ret = -EINVAL; 1295 1296 if (list_empty(&gi->cdev.configs)) { 1297 pr_err("Need at least one configuration in %s.\n", 1298 gi->composite.name); 1299 goto err_comp_cleanup; 1300 } 1301 1302 1303 list_for_each_entry(c, &gi->cdev.configs, list) { 1304 struct config_usb_cfg *cfg; 1305 1306 cfg = container_of(c, struct config_usb_cfg, c); 1307 if (list_empty(&cfg->func_list)) { 1308 pr_err("Config %s/%d of %s needs at least one function.\n", 1309 c->label, c->bConfigurationValue, 1310 gi->composite.name); 1311 goto err_comp_cleanup; 1312 } 1313 } 1314 1315 /* init all strings */ 1316 if (!list_empty(&gi->string_list)) { 1317 struct gadget_strings *gs; 1318 1319 i = 0; 1320 list_for_each_entry(gs, &gi->string_list, list) { 1321 1322 gi->gstrings[i] = &gs->stringtab_dev; 1323 gs->stringtab_dev.strings = gs->strings; 1324 gs->strings[USB_GADGET_MANUFACTURER_IDX].s = 1325 gs->manufacturer; 1326 gs->strings[USB_GADGET_PRODUCT_IDX].s = gs->product; 1327 gs->strings[USB_GADGET_SERIAL_IDX].s = gs->serialnumber; 1328 i++; 1329 } 1330 gi->gstrings[i] = NULL; 1331 s = usb_gstrings_attach(&gi->cdev, gi->gstrings, 1332 USB_GADGET_FIRST_AVAIL_IDX); 1333 if (IS_ERR(s)) { 1334 ret = PTR_ERR(s); 1335 goto err_comp_cleanup; 1336 } 1337 1338 gi->cdev.desc.iManufacturer = s[USB_GADGET_MANUFACTURER_IDX].id; 1339 gi->cdev.desc.iProduct = s[USB_GADGET_PRODUCT_IDX].id; 1340 gi->cdev.desc.iSerialNumber = s[USB_GADGET_SERIAL_IDX].id; 1341 } 1342 1343 if (gi->use_os_desc) { 1344 cdev->use_os_string = true; 1345 cdev->b_vendor_code = gi->b_vendor_code; 1346 memcpy(cdev->qw_sign, gi->qw_sign, OS_STRING_QW_SIGN_LEN); 1347 } 1348 1349 if (gadget_is_otg(gadget) && !otg_desc[0]) { 1350 struct usb_descriptor_header *usb_desc; 1351 1352 usb_desc = usb_otg_descriptor_alloc(gadget); 1353 if (!usb_desc) { 1354 ret = -ENOMEM; 1355 goto err_comp_cleanup; 1356 } 1357 usb_otg_descriptor_init(gadget, usb_desc); 1358 otg_desc[0] = usb_desc; 1359 otg_desc[1] = NULL; 1360 } 1361 1362 /* Go through all configs, attach all functions */ 1363 list_for_each_entry(c, &gi->cdev.configs, list) { 1364 struct config_usb_cfg *cfg; 1365 struct usb_function *f; 1366 struct usb_function *tmp; 1367 struct gadget_config_name *cn; 1368 1369 if (gadget_is_otg(gadget)) 1370 c->descriptors = otg_desc; 1371 1372 cfg = container_of(c, struct config_usb_cfg, c); 1373 if (!list_empty(&cfg->string_list)) { 1374 i = 0; 1375 list_for_each_entry(cn, &cfg->string_list, list) { 1376 cfg->gstrings[i] = &cn->stringtab_dev; 1377 cn->stringtab_dev.strings = &cn->strings; 1378 cn->strings.s = cn->configuration; 1379 i++; 1380 } 1381 cfg->gstrings[i] = NULL; 1382 s = usb_gstrings_attach(&gi->cdev, cfg->gstrings, 1); 1383 if (IS_ERR(s)) { 1384 ret = PTR_ERR(s); 1385 goto err_comp_cleanup; 1386 } 1387 c->iConfiguration = s[0].id; 1388 } 1389 1390 list_for_each_entry_safe(f, tmp, &cfg->func_list, list) { 1391 list_del(&f->list); 1392 ret = usb_add_function(c, f); 1393 if (ret) { 1394 list_add(&f->list, &cfg->func_list); 1395 goto err_purge_funcs; 1396 } 1397 } 1398 ret = usb_gadget_check_config(cdev->gadget); 1399 if (ret) 1400 goto err_purge_funcs; 1401 1402 usb_ep_autoconfig_reset(cdev->gadget); 1403 } 1404 if (cdev->use_os_string) { 1405 ret = composite_os_desc_req_prepare(cdev, gadget->ep0); 1406 if (ret) 1407 goto err_purge_funcs; 1408 } 1409 1410 usb_ep_autoconfig_reset(cdev->gadget); 1411 return 0; 1412 1413err_purge_funcs: 1414 purge_configs_funcs(gi); 1415err_comp_cleanup: 1416 composite_dev_cleanup(cdev); 1417 return ret; 1418} 1419 1420static void configfs_composite_unbind(struct usb_gadget *gadget) 1421{ 1422 struct usb_composite_dev *cdev; 1423 struct gadget_info *gi; 1424 unsigned long flags; 1425 1426 /* the gi->lock is hold by the caller */ 1427 1428 cdev = get_gadget_data(gadget); 1429 gi = container_of(cdev, struct gadget_info, cdev); 1430 spin_lock_irqsave(&gi->spinlock, flags); 1431 gi->unbind = 1; 1432 spin_unlock_irqrestore(&gi->spinlock, flags); 1433 1434 kfree(otg_desc[0]); 1435 otg_desc[0] = NULL; 1436 purge_configs_funcs(gi); 1437 composite_dev_cleanup(cdev); 1438 usb_ep_autoconfig_reset(cdev->gadget); 1439 spin_lock_irqsave(&gi->spinlock, flags); 1440 cdev->gadget = NULL; 1441 cdev->deactivations = 0; 1442 gadget->deactivated = false; 1443 set_gadget_data(gadget, NULL); 1444 spin_unlock_irqrestore(&gi->spinlock, flags); 1445} 1446 1447static int configfs_composite_setup(struct usb_gadget *gadget, 1448 const struct usb_ctrlrequest *ctrl) 1449{ 1450 struct usb_composite_dev *cdev; 1451 struct gadget_info *gi; 1452 unsigned long flags; 1453 int ret; 1454 1455 cdev = get_gadget_data(gadget); 1456 if (!cdev) 1457 return 0; 1458 1459 gi = container_of(cdev, struct gadget_info, cdev); 1460 spin_lock_irqsave(&gi->spinlock, flags); 1461 cdev = get_gadget_data(gadget); 1462 if (!cdev || gi->unbind) { 1463 spin_unlock_irqrestore(&gi->spinlock, flags); 1464 return 0; 1465 } 1466 1467 ret = composite_setup(gadget, ctrl); 1468 spin_unlock_irqrestore(&gi->spinlock, flags); 1469 return ret; 1470} 1471 1472static void configfs_composite_disconnect(struct usb_gadget *gadget) 1473{ 1474 struct usb_composite_dev *cdev; 1475 struct gadget_info *gi; 1476 unsigned long flags; 1477 1478 cdev = get_gadget_data(gadget); 1479 if (!cdev) 1480 return; 1481 1482 gi = container_of(cdev, struct gadget_info, cdev); 1483 spin_lock_irqsave(&gi->spinlock, flags); 1484 cdev = get_gadget_data(gadget); 1485 if (!cdev || gi->unbind) { 1486 spin_unlock_irqrestore(&gi->spinlock, flags); 1487 return; 1488 } 1489 1490 composite_disconnect(gadget); 1491 spin_unlock_irqrestore(&gi->spinlock, flags); 1492} 1493 1494static void configfs_composite_reset(struct usb_gadget *gadget) 1495{ 1496 struct usb_composite_dev *cdev; 1497 struct gadget_info *gi; 1498 unsigned long flags; 1499 1500 cdev = get_gadget_data(gadget); 1501 if (!cdev) 1502 return; 1503 1504 gi = container_of(cdev, struct gadget_info, cdev); 1505 spin_lock_irqsave(&gi->spinlock, flags); 1506 cdev = get_gadget_data(gadget); 1507 if (!cdev || gi->unbind) { 1508 spin_unlock_irqrestore(&gi->spinlock, flags); 1509 return; 1510 } 1511 1512 composite_reset(gadget); 1513 spin_unlock_irqrestore(&gi->spinlock, flags); 1514} 1515 1516static void configfs_composite_suspend(struct usb_gadget *gadget) 1517{ 1518 struct usb_composite_dev *cdev; 1519 struct gadget_info *gi; 1520 unsigned long flags; 1521 1522 cdev = get_gadget_data(gadget); 1523 if (!cdev) 1524 return; 1525 1526 gi = container_of(cdev, struct gadget_info, cdev); 1527 spin_lock_irqsave(&gi->spinlock, flags); 1528 cdev = get_gadget_data(gadget); 1529 if (!cdev || gi->unbind) { 1530 spin_unlock_irqrestore(&gi->spinlock, flags); 1531 return; 1532 } 1533 1534 composite_suspend(gadget); 1535 spin_unlock_irqrestore(&gi->spinlock, flags); 1536} 1537 1538static void configfs_composite_resume(struct usb_gadget *gadget) 1539{ 1540 struct usb_composite_dev *cdev; 1541 struct gadget_info *gi; 1542 unsigned long flags; 1543 1544 cdev = get_gadget_data(gadget); 1545 if (!cdev) 1546 return; 1547 1548 gi = container_of(cdev, struct gadget_info, cdev); 1549 spin_lock_irqsave(&gi->spinlock, flags); 1550 cdev = get_gadget_data(gadget); 1551 if (!cdev || gi->unbind) { 1552 spin_unlock_irqrestore(&gi->spinlock, flags); 1553 return; 1554 } 1555 1556 composite_resume(gadget); 1557 spin_unlock_irqrestore(&gi->spinlock, flags); 1558} 1559 1560static const struct usb_gadget_driver configfs_driver_template = { 1561 .bind = configfs_composite_bind, 1562 .unbind = configfs_composite_unbind, 1563 1564 .setup = configfs_composite_setup, 1565 .reset = configfs_composite_reset, 1566 .disconnect = configfs_composite_disconnect, 1567 1568 .suspend = configfs_composite_suspend, 1569 .resume = configfs_composite_resume, 1570 1571 .max_speed = USB_SPEED_SUPER_PLUS, 1572 .driver = { 1573 .owner = THIS_MODULE, 1574 .name = "configfs-gadget", 1575 }, 1576 .match_existing_only = 1, 1577}; 1578 1579static struct config_group *gadgets_make( 1580 struct config_group *group, 1581 const char *name) 1582{ 1583 struct gadget_info *gi; 1584 1585 gi = kzalloc(sizeof(*gi), GFP_KERNEL); 1586 if (!gi) 1587 return ERR_PTR(-ENOMEM); 1588 1589 config_group_init_type_name(&gi->group, name, &gadget_root_type); 1590 1591 config_group_init_type_name(&gi->functions_group, "functions", 1592 &functions_type); 1593 configfs_add_default_group(&gi->functions_group, &gi->group); 1594 1595 config_group_init_type_name(&gi->configs_group, "configs", 1596 &config_desc_type); 1597 configfs_add_default_group(&gi->configs_group, &gi->group); 1598 1599 config_group_init_type_name(&gi->strings_group, "strings", 1600 &gadget_strings_strings_type); 1601 configfs_add_default_group(&gi->strings_group, &gi->group); 1602 1603 config_group_init_type_name(&gi->os_desc_group, "os_desc", 1604 &os_desc_type); 1605 configfs_add_default_group(&gi->os_desc_group, &gi->group); 1606 1607 gi->composite.bind = configfs_do_nothing; 1608 gi->composite.unbind = configfs_do_nothing; 1609 gi->composite.suspend = NULL; 1610 gi->composite.resume = NULL; 1611 gi->composite.max_speed = USB_SPEED_SUPER_PLUS; 1612 1613 spin_lock_init(&gi->spinlock); 1614 mutex_init(&gi->lock); 1615 INIT_LIST_HEAD(&gi->string_list); 1616 INIT_LIST_HEAD(&gi->available_func); 1617 1618 composite_init_dev(&gi->cdev); 1619 gi->cdev.desc.bLength = USB_DT_DEVICE_SIZE; 1620 gi->cdev.desc.bDescriptorType = USB_DT_DEVICE; 1621 gi->cdev.desc.bcdDevice = cpu_to_le16(get_default_bcdDevice()); 1622 1623 gi->composite.gadget_driver = configfs_driver_template; 1624 1625 gi->composite.gadget_driver.function = kstrdup(name, GFP_KERNEL); 1626 gi->composite.name = gi->composite.gadget_driver.function; 1627 1628 if (!gi->composite.gadget_driver.function) 1629 goto err; 1630 1631 return &gi->group; 1632err: 1633 kfree(gi); 1634 return ERR_PTR(-ENOMEM); 1635} 1636 1637static void gadgets_drop(struct config_group *group, struct config_item *item) 1638{ 1639 config_item_put(item); 1640} 1641 1642static struct configfs_group_operations gadgets_ops = { 1643 .make_group = &gadgets_make, 1644 .drop_item = &gadgets_drop, 1645}; 1646 1647static const struct config_item_type gadgets_type = { 1648 .ct_group_ops = &gadgets_ops, 1649 .ct_owner = THIS_MODULE, 1650}; 1651 1652static struct configfs_subsystem gadget_subsys = { 1653 .su_group = { 1654 .cg_item = { 1655 .ci_namebuf = "usb_gadget", 1656 .ci_type = &gadgets_type, 1657 }, 1658 }, 1659 .su_mutex = __MUTEX_INITIALIZER(gadget_subsys.su_mutex), 1660}; 1661 1662void unregister_gadget_item(struct config_item *item) 1663{ 1664 struct gadget_info *gi = to_gadget_info(item); 1665 1666 mutex_lock(&gi->lock); 1667 unregister_gadget(gi); 1668 mutex_unlock(&gi->lock); 1669} 1670EXPORT_SYMBOL_GPL(unregister_gadget_item); 1671 1672static int __init gadget_cfs_init(void) 1673{ 1674 int ret; 1675 1676 config_group_init(&gadget_subsys.su_group); 1677 1678 ret = configfs_register_subsystem(&gadget_subsys); 1679 return ret; 1680} 1681module_init(gadget_cfs_init); 1682 1683static void __exit gadget_cfs_exit(void) 1684{ 1685 configfs_unregister_subsystem(&gadget_subsys); 1686} 1687module_exit(gadget_cfs_exit);