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