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