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 int 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 0; 441 } 442 } 443 mutex_unlock(&gi->lock); 444 WARN(1, "Unable to locate function to unbind\n"); 445 return 0; 446 } 447 448 static struct configfs_item_operations gadget_config_item_ops = { 449 .release = gadget_config_attr_release, 450 .allow_link = config_usb_cfg_link, 451 .drop_link = config_usb_cfg_unlink, 452 }; 453 454 455 static ssize_t gadget_config_desc_MaxPower_show(struct config_item *item, 456 char *page) 457 { 458 return sprintf(page, "%u\n", to_config_usb_cfg(item)->c.MaxPower); 459 } 460 461 static ssize_t gadget_config_desc_MaxPower_store(struct config_item *item, 462 const char *page, size_t len) 463 { 464 u16 val; 465 int ret; 466 ret = kstrtou16(page, 0, &val); 467 if (ret) 468 return ret; 469 if (DIV_ROUND_UP(val, 8) > 0xff) 470 return -ERANGE; 471 to_config_usb_cfg(item)->c.MaxPower = val; 472 return len; 473 } 474 475 static ssize_t gadget_config_desc_bmAttributes_show(struct config_item *item, 476 char *page) 477 { 478 return sprintf(page, "0x%02x\n", 479 to_config_usb_cfg(item)->c.bmAttributes); 480 } 481 482 static ssize_t gadget_config_desc_bmAttributes_store(struct config_item *item, 483 const char *page, size_t len) 484 { 485 u8 val; 486 int ret; 487 ret = kstrtou8(page, 0, &val); 488 if (ret) 489 return ret; 490 if (!(val & USB_CONFIG_ATT_ONE)) 491 return -EINVAL; 492 if (val & ~(USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER | 493 USB_CONFIG_ATT_WAKEUP)) 494 return -EINVAL; 495 to_config_usb_cfg(item)->c.bmAttributes = val; 496 return len; 497 } 498 499 CONFIGFS_ATTR(gadget_config_desc_, MaxPower); 500 CONFIGFS_ATTR(gadget_config_desc_, bmAttributes); 501 502 static struct configfs_attribute *gadget_config_attrs[] = { 503 &gadget_config_desc_attr_MaxPower, 504 &gadget_config_desc_attr_bmAttributes, 505 NULL, 506 }; 507 508 static struct config_item_type gadget_config_type = { 509 .ct_item_ops = &gadget_config_item_ops, 510 .ct_attrs = gadget_config_attrs, 511 .ct_owner = THIS_MODULE, 512 }; 513 514 static struct config_item_type gadget_root_type = { 515 .ct_item_ops = &gadget_root_item_ops, 516 .ct_attrs = gadget_root_attrs, 517 .ct_owner = THIS_MODULE, 518 }; 519 520 static void composite_init_dev(struct usb_composite_dev *cdev) 521 { 522 spin_lock_init(&cdev->lock); 523 INIT_LIST_HEAD(&cdev->configs); 524 INIT_LIST_HEAD(&cdev->gstrings); 525 } 526 527 static struct config_group *function_make( 528 struct config_group *group, 529 const char *name) 530 { 531 struct gadget_info *gi; 532 struct usb_function_instance *fi; 533 char buf[MAX_NAME_LEN]; 534 char *func_name; 535 char *instance_name; 536 int ret; 537 538 ret = snprintf(buf, MAX_NAME_LEN, "%s", name); 539 if (ret >= MAX_NAME_LEN) 540 return ERR_PTR(-ENAMETOOLONG); 541 542 func_name = buf; 543 instance_name = strchr(func_name, '.'); 544 if (!instance_name) { 545 pr_err("Unable to locate . in FUNC.INSTANCE\n"); 546 return ERR_PTR(-EINVAL); 547 } 548 *instance_name = '\0'; 549 instance_name++; 550 551 fi = usb_get_function_instance(func_name); 552 if (IS_ERR(fi)) 553 return ERR_CAST(fi); 554 555 ret = config_item_set_name(&fi->group.cg_item, "%s", name); 556 if (ret) { 557 usb_put_function_instance(fi); 558 return ERR_PTR(ret); 559 } 560 if (fi->set_inst_name) { 561 ret = fi->set_inst_name(fi, instance_name); 562 if (ret) { 563 usb_put_function_instance(fi); 564 return ERR_PTR(ret); 565 } 566 } 567 568 gi = container_of(group, struct gadget_info, functions_group); 569 570 mutex_lock(&gi->lock); 571 list_add_tail(&fi->cfs_list, &gi->available_func); 572 mutex_unlock(&gi->lock); 573 return &fi->group; 574 } 575 576 static void function_drop( 577 struct config_group *group, 578 struct config_item *item) 579 { 580 struct usb_function_instance *fi = to_usb_function_instance(item); 581 struct gadget_info *gi; 582 583 gi = container_of(group, struct gadget_info, functions_group); 584 585 mutex_lock(&gi->lock); 586 list_del(&fi->cfs_list); 587 mutex_unlock(&gi->lock); 588 config_item_put(item); 589 } 590 591 static struct configfs_group_operations functions_ops = { 592 .make_group = &function_make, 593 .drop_item = &function_drop, 594 }; 595 596 static struct config_item_type functions_type = { 597 .ct_group_ops = &functions_ops, 598 .ct_owner = THIS_MODULE, 599 }; 600 601 GS_STRINGS_RW(gadget_config_name, configuration); 602 603 static struct configfs_attribute *gadget_config_name_langid_attrs[] = { 604 &gadget_config_name_attr_configuration, 605 NULL, 606 }; 607 608 static void gadget_config_name_attr_release(struct config_item *item) 609 { 610 struct gadget_config_name *cn = to_gadget_config_name(item); 611 612 kfree(cn->configuration); 613 614 list_del(&cn->list); 615 kfree(cn); 616 } 617 618 USB_CONFIG_STRING_RW_OPS(gadget_config_name); 619 USB_CONFIG_STRINGS_LANG(gadget_config_name, config_usb_cfg); 620 621 static struct config_group *config_desc_make( 622 struct config_group *group, 623 const char *name) 624 { 625 struct gadget_info *gi; 626 struct config_usb_cfg *cfg; 627 char buf[MAX_NAME_LEN]; 628 char *num_str; 629 u8 num; 630 int ret; 631 632 gi = container_of(group, struct gadget_info, configs_group); 633 ret = snprintf(buf, MAX_NAME_LEN, "%s", name); 634 if (ret >= MAX_NAME_LEN) 635 return ERR_PTR(-ENAMETOOLONG); 636 637 num_str = strchr(buf, '.'); 638 if (!num_str) { 639 pr_err("Unable to locate . in name.bConfigurationValue\n"); 640 return ERR_PTR(-EINVAL); 641 } 642 643 *num_str = '\0'; 644 num_str++; 645 646 if (!strlen(buf)) 647 return ERR_PTR(-EINVAL); 648 649 ret = kstrtou8(num_str, 0, &num); 650 if (ret) 651 return ERR_PTR(ret); 652 653 cfg = kzalloc(sizeof(*cfg), GFP_KERNEL); 654 if (!cfg) 655 return ERR_PTR(-ENOMEM); 656 cfg->c.label = kstrdup(buf, GFP_KERNEL); 657 if (!cfg->c.label) { 658 ret = -ENOMEM; 659 goto err; 660 } 661 cfg->c.bConfigurationValue = num; 662 cfg->c.MaxPower = CONFIG_USB_GADGET_VBUS_DRAW; 663 cfg->c.bmAttributes = USB_CONFIG_ATT_ONE; 664 INIT_LIST_HEAD(&cfg->string_list); 665 INIT_LIST_HEAD(&cfg->func_list); 666 667 config_group_init_type_name(&cfg->group, name, 668 &gadget_config_type); 669 670 config_group_init_type_name(&cfg->strings_group, "strings", 671 &gadget_config_name_strings_type); 672 configfs_add_default_group(&cfg->strings_group, &cfg->group); 673 674 ret = usb_add_config_only(&gi->cdev, &cfg->c); 675 if (ret) 676 goto err; 677 678 return &cfg->group; 679 err: 680 kfree(cfg->c.label); 681 kfree(cfg); 682 return ERR_PTR(ret); 683 } 684 685 static void config_desc_drop( 686 struct config_group *group, 687 struct config_item *item) 688 { 689 config_item_put(item); 690 } 691 692 static struct configfs_group_operations config_desc_ops = { 693 .make_group = &config_desc_make, 694 .drop_item = &config_desc_drop, 695 }; 696 697 static struct config_item_type config_desc_type = { 698 .ct_group_ops = &config_desc_ops, 699 .ct_owner = THIS_MODULE, 700 }; 701 702 GS_STRINGS_RW(gadget_strings, manufacturer); 703 GS_STRINGS_RW(gadget_strings, product); 704 GS_STRINGS_RW(gadget_strings, serialnumber); 705 706 static struct configfs_attribute *gadget_strings_langid_attrs[] = { 707 &gadget_strings_attr_manufacturer, 708 &gadget_strings_attr_product, 709 &gadget_strings_attr_serialnumber, 710 NULL, 711 }; 712 713 static void gadget_strings_attr_release(struct config_item *item) 714 { 715 struct gadget_strings *gs = to_gadget_strings(item); 716 717 kfree(gs->manufacturer); 718 kfree(gs->product); 719 kfree(gs->serialnumber); 720 721 list_del(&gs->list); 722 kfree(gs); 723 } 724 725 USB_CONFIG_STRING_RW_OPS(gadget_strings); 726 USB_CONFIG_STRINGS_LANG(gadget_strings, gadget_info); 727 728 static inline struct os_desc *to_os_desc(struct config_item *item) 729 { 730 return container_of(to_config_group(item), struct os_desc, group); 731 } 732 733 static inline struct gadget_info *os_desc_item_to_gadget_info( 734 struct config_item *item) 735 { 736 return to_gadget_info(to_os_desc(item)->group.cg_item.ci_parent); 737 } 738 739 static ssize_t os_desc_use_show(struct config_item *item, char *page) 740 { 741 return sprintf(page, "%d", 742 os_desc_item_to_gadget_info(item)->use_os_desc); 743 } 744 745 static ssize_t os_desc_use_store(struct config_item *item, const char *page, 746 size_t len) 747 { 748 struct gadget_info *gi = os_desc_item_to_gadget_info(item); 749 int ret; 750 bool use; 751 752 mutex_lock(&gi->lock); 753 ret = strtobool(page, &use); 754 if (!ret) { 755 gi->use_os_desc = use; 756 ret = len; 757 } 758 mutex_unlock(&gi->lock); 759 760 return ret; 761 } 762 763 static ssize_t os_desc_b_vendor_code_show(struct config_item *item, char *page) 764 { 765 return sprintf(page, "%d", 766 os_desc_item_to_gadget_info(item)->b_vendor_code); 767 } 768 769 static ssize_t os_desc_b_vendor_code_store(struct config_item *item, 770 const char *page, size_t len) 771 { 772 struct gadget_info *gi = os_desc_item_to_gadget_info(item); 773 int ret; 774 u8 b_vendor_code; 775 776 mutex_lock(&gi->lock); 777 ret = kstrtou8(page, 0, &b_vendor_code); 778 if (!ret) { 779 gi->b_vendor_code = b_vendor_code; 780 ret = len; 781 } 782 mutex_unlock(&gi->lock); 783 784 return ret; 785 } 786 787 static ssize_t os_desc_qw_sign_show(struct config_item *item, char *page) 788 { 789 struct gadget_info *gi = os_desc_item_to_gadget_info(item); 790 791 memcpy(page, gi->qw_sign, OS_STRING_QW_SIGN_LEN); 792 return OS_STRING_QW_SIGN_LEN; 793 } 794 795 static ssize_t os_desc_qw_sign_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 res, l; 800 801 l = min((int)len, OS_STRING_QW_SIGN_LEN >> 1); 802 if (page[l - 1] == '\n') 803 --l; 804 805 mutex_lock(&gi->lock); 806 res = utf8s_to_utf16s(page, l, 807 UTF16_LITTLE_ENDIAN, (wchar_t *) gi->qw_sign, 808 OS_STRING_QW_SIGN_LEN); 809 if (res > 0) 810 res = len; 811 mutex_unlock(&gi->lock); 812 813 return res; 814 } 815 816 CONFIGFS_ATTR(os_desc_, use); 817 CONFIGFS_ATTR(os_desc_, b_vendor_code); 818 CONFIGFS_ATTR(os_desc_, qw_sign); 819 820 static struct configfs_attribute *os_desc_attrs[] = { 821 &os_desc_attr_use, 822 &os_desc_attr_b_vendor_code, 823 &os_desc_attr_qw_sign, 824 NULL, 825 }; 826 827 static void os_desc_attr_release(struct config_item *item) 828 { 829 struct os_desc *os_desc = to_os_desc(item); 830 kfree(os_desc); 831 } 832 833 static int os_desc_link(struct config_item *os_desc_ci, 834 struct config_item *usb_cfg_ci) 835 { 836 struct gadget_info *gi = container_of(to_config_group(os_desc_ci), 837 struct gadget_info, os_desc_group); 838 struct usb_composite_dev *cdev = &gi->cdev; 839 struct config_usb_cfg *c_target = 840 container_of(to_config_group(usb_cfg_ci), 841 struct config_usb_cfg, group); 842 struct usb_configuration *c; 843 int ret; 844 845 mutex_lock(&gi->lock); 846 list_for_each_entry(c, &cdev->configs, list) { 847 if (c == &c_target->c) 848 break; 849 } 850 if (c != &c_target->c) { 851 ret = -EINVAL; 852 goto out; 853 } 854 855 if (cdev->os_desc_config) { 856 ret = -EBUSY; 857 goto out; 858 } 859 860 cdev->os_desc_config = &c_target->c; 861 ret = 0; 862 863 out: 864 mutex_unlock(&gi->lock); 865 return ret; 866 } 867 868 static int os_desc_unlink(struct config_item *os_desc_ci, 869 struct config_item *usb_cfg_ci) 870 { 871 struct gadget_info *gi = container_of(to_config_group(os_desc_ci), 872 struct gadget_info, os_desc_group); 873 struct usb_composite_dev *cdev = &gi->cdev; 874 875 mutex_lock(&gi->lock); 876 if (gi->composite.gadget_driver.udc_name) 877 unregister_gadget(gi); 878 cdev->os_desc_config = NULL; 879 WARN_ON(gi->composite.gadget_driver.udc_name); 880 mutex_unlock(&gi->lock); 881 return 0; 882 } 883 884 static struct configfs_item_operations os_desc_ops = { 885 .release = os_desc_attr_release, 886 .allow_link = os_desc_link, 887 .drop_link = os_desc_unlink, 888 }; 889 890 static struct config_item_type os_desc_type = { 891 .ct_item_ops = &os_desc_ops, 892 .ct_attrs = os_desc_attrs, 893 .ct_owner = THIS_MODULE, 894 }; 895 896 static inline struct usb_os_desc_ext_prop 897 *to_usb_os_desc_ext_prop(struct config_item *item) 898 { 899 return container_of(item, struct usb_os_desc_ext_prop, item); 900 } 901 902 static ssize_t ext_prop_type_show(struct config_item *item, char *page) 903 { 904 return sprintf(page, "%d", to_usb_os_desc_ext_prop(item)->type); 905 } 906 907 static ssize_t ext_prop_type_store(struct config_item *item, 908 const char *page, size_t len) 909 { 910 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 911 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); 912 u8 type; 913 int ret; 914 915 if (desc->opts_mutex) 916 mutex_lock(desc->opts_mutex); 917 ret = kstrtou8(page, 0, &type); 918 if (ret) 919 goto end; 920 if (type < USB_EXT_PROP_UNICODE || type > USB_EXT_PROP_UNICODE_MULTI) { 921 ret = -EINVAL; 922 goto end; 923 } 924 925 if ((ext_prop->type == USB_EXT_PROP_BINARY || 926 ext_prop->type == USB_EXT_PROP_LE32 || 927 ext_prop->type == USB_EXT_PROP_BE32) && 928 (type == USB_EXT_PROP_UNICODE || 929 type == USB_EXT_PROP_UNICODE_ENV || 930 type == USB_EXT_PROP_UNICODE_LINK)) 931 ext_prop->data_len <<= 1; 932 else if ((ext_prop->type == USB_EXT_PROP_UNICODE || 933 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || 934 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) && 935 (type == USB_EXT_PROP_BINARY || 936 type == USB_EXT_PROP_LE32 || 937 type == USB_EXT_PROP_BE32)) 938 ext_prop->data_len >>= 1; 939 ext_prop->type = type; 940 ret = len; 941 942 end: 943 if (desc->opts_mutex) 944 mutex_unlock(desc->opts_mutex); 945 return ret; 946 } 947 948 static ssize_t ext_prop_data_show(struct config_item *item, char *page) 949 { 950 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 951 int len = ext_prop->data_len; 952 953 if (ext_prop->type == USB_EXT_PROP_UNICODE || 954 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || 955 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) 956 len >>= 1; 957 memcpy(page, ext_prop->data, len); 958 959 return len; 960 } 961 962 static ssize_t ext_prop_data_store(struct config_item *item, 963 const char *page, size_t len) 964 { 965 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 966 struct usb_os_desc *desc = to_usb_os_desc(ext_prop->item.ci_parent); 967 char *new_data; 968 size_t ret_len = len; 969 970 if (page[len - 1] == '\n' || page[len - 1] == '\0') 971 --len; 972 new_data = kmemdup(page, len, GFP_KERNEL); 973 if (!new_data) 974 return -ENOMEM; 975 976 if (desc->opts_mutex) 977 mutex_lock(desc->opts_mutex); 978 kfree(ext_prop->data); 979 ext_prop->data = new_data; 980 desc->ext_prop_len -= ext_prop->data_len; 981 ext_prop->data_len = len; 982 desc->ext_prop_len += ext_prop->data_len; 983 if (ext_prop->type == USB_EXT_PROP_UNICODE || 984 ext_prop->type == USB_EXT_PROP_UNICODE_ENV || 985 ext_prop->type == USB_EXT_PROP_UNICODE_LINK) { 986 desc->ext_prop_len -= ext_prop->data_len; 987 ext_prop->data_len <<= 1; 988 ext_prop->data_len += 2; 989 desc->ext_prop_len += ext_prop->data_len; 990 } 991 if (desc->opts_mutex) 992 mutex_unlock(desc->opts_mutex); 993 return ret_len; 994 } 995 996 CONFIGFS_ATTR(ext_prop_, type); 997 CONFIGFS_ATTR(ext_prop_, data); 998 999 static struct configfs_attribute *ext_prop_attrs[] = { 1000 &ext_prop_attr_type, 1001 &ext_prop_attr_data, 1002 NULL, 1003 }; 1004 1005 static void usb_os_desc_ext_prop_release(struct config_item *item) 1006 { 1007 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 1008 1009 kfree(ext_prop); /* frees a whole chunk */ 1010 } 1011 1012 static struct configfs_item_operations ext_prop_ops = { 1013 .release = usb_os_desc_ext_prop_release, 1014 }; 1015 1016 static struct config_item *ext_prop_make( 1017 struct config_group *group, 1018 const char *name) 1019 { 1020 struct usb_os_desc_ext_prop *ext_prop; 1021 struct config_item_type *ext_prop_type; 1022 struct usb_os_desc *desc; 1023 char *vlabuf; 1024 1025 vla_group(data_chunk); 1026 vla_item(data_chunk, struct usb_os_desc_ext_prop, ext_prop, 1); 1027 vla_item(data_chunk, struct config_item_type, ext_prop_type, 1); 1028 1029 vlabuf = kzalloc(vla_group_size(data_chunk), GFP_KERNEL); 1030 if (!vlabuf) 1031 return ERR_PTR(-ENOMEM); 1032 1033 ext_prop = vla_ptr(vlabuf, data_chunk, ext_prop); 1034 ext_prop_type = vla_ptr(vlabuf, data_chunk, ext_prop_type); 1035 1036 desc = container_of(group, struct usb_os_desc, group); 1037 ext_prop_type->ct_item_ops = &ext_prop_ops; 1038 ext_prop_type->ct_attrs = ext_prop_attrs; 1039 ext_prop_type->ct_owner = desc->owner; 1040 1041 config_item_init_type_name(&ext_prop->item, name, ext_prop_type); 1042 1043 ext_prop->name = kstrdup(name, GFP_KERNEL); 1044 if (!ext_prop->name) { 1045 kfree(vlabuf); 1046 return ERR_PTR(-ENOMEM); 1047 } 1048 desc->ext_prop_len += 14; 1049 ext_prop->name_len = 2 * strlen(ext_prop->name) + 2; 1050 if (desc->opts_mutex) 1051 mutex_lock(desc->opts_mutex); 1052 desc->ext_prop_len += ext_prop->name_len; 1053 list_add_tail(&ext_prop->entry, &desc->ext_prop); 1054 ++desc->ext_prop_count; 1055 if (desc->opts_mutex) 1056 mutex_unlock(desc->opts_mutex); 1057 1058 return &ext_prop->item; 1059 } 1060 1061 static void ext_prop_drop(struct config_group *group, struct config_item *item) 1062 { 1063 struct usb_os_desc_ext_prop *ext_prop = to_usb_os_desc_ext_prop(item); 1064 struct usb_os_desc *desc = to_usb_os_desc(&group->cg_item); 1065 1066 if (desc->opts_mutex) 1067 mutex_lock(desc->opts_mutex); 1068 list_del(&ext_prop->entry); 1069 --desc->ext_prop_count; 1070 kfree(ext_prop->name); 1071 desc->ext_prop_len -= (ext_prop->name_len + ext_prop->data_len + 14); 1072 if (desc->opts_mutex) 1073 mutex_unlock(desc->opts_mutex); 1074 config_item_put(item); 1075 } 1076 1077 static struct configfs_group_operations interf_grp_ops = { 1078 .make_item = &ext_prop_make, 1079 .drop_item = &ext_prop_drop, 1080 }; 1081 1082 static ssize_t interf_grp_compatible_id_show(struct config_item *item, 1083 char *page) 1084 { 1085 memcpy(page, to_usb_os_desc(item)->ext_compat_id, 8); 1086 return 8; 1087 } 1088 1089 static ssize_t interf_grp_compatible_id_store(struct config_item *item, 1090 const char *page, size_t len) 1091 { 1092 struct usb_os_desc *desc = to_usb_os_desc(item); 1093 int l; 1094 1095 l = min_t(int, 8, len); 1096 if (page[l - 1] == '\n') 1097 --l; 1098 if (desc->opts_mutex) 1099 mutex_lock(desc->opts_mutex); 1100 memcpy(desc->ext_compat_id, page, l); 1101 1102 if (desc->opts_mutex) 1103 mutex_unlock(desc->opts_mutex); 1104 1105 return len; 1106 } 1107 1108 static ssize_t interf_grp_sub_compatible_id_show(struct config_item *item, 1109 char *page) 1110 { 1111 memcpy(page, to_usb_os_desc(item)->ext_compat_id + 8, 8); 1112 return 8; 1113 } 1114 1115 static ssize_t interf_grp_sub_compatible_id_store(struct config_item *item, 1116 const char *page, size_t len) 1117 { 1118 struct usb_os_desc *desc = to_usb_os_desc(item); 1119 int l; 1120 1121 l = min_t(int, 8, len); 1122 if (page[l - 1] == '\n') 1123 --l; 1124 if (desc->opts_mutex) 1125 mutex_lock(desc->opts_mutex); 1126 memcpy(desc->ext_compat_id + 8, page, l); 1127 1128 if (desc->opts_mutex) 1129 mutex_unlock(desc->opts_mutex); 1130 1131 return len; 1132 } 1133 1134 CONFIGFS_ATTR(interf_grp_, compatible_id); 1135 CONFIGFS_ATTR(interf_grp_, sub_compatible_id); 1136 1137 static struct configfs_attribute *interf_grp_attrs[] = { 1138 &interf_grp_attr_compatible_id, 1139 &interf_grp_attr_sub_compatible_id, 1140 NULL 1141 }; 1142 1143 int usb_os_desc_prepare_interf_dir(struct config_group *parent, 1144 int n_interf, 1145 struct usb_os_desc **desc, 1146 char **names, 1147 struct module *owner) 1148 { 1149 struct config_group *os_desc_group; 1150 struct config_item_type *os_desc_type, *interface_type; 1151 1152 vla_group(data_chunk); 1153 vla_item(data_chunk, struct config_group, os_desc_group, 1); 1154 vla_item(data_chunk, struct config_item_type, os_desc_type, 1); 1155 vla_item(data_chunk, struct config_item_type, interface_type, 1); 1156 1157 char *vlabuf = kzalloc(vla_group_size(data_chunk), GFP_KERNEL); 1158 if (!vlabuf) 1159 return -ENOMEM; 1160 1161 os_desc_group = vla_ptr(vlabuf, data_chunk, os_desc_group); 1162 os_desc_type = vla_ptr(vlabuf, data_chunk, os_desc_type); 1163 interface_type = vla_ptr(vlabuf, data_chunk, interface_type); 1164 1165 os_desc_type->ct_owner = owner; 1166 config_group_init_type_name(os_desc_group, "os_desc", os_desc_type); 1167 configfs_add_default_group(os_desc_group, parent); 1168 1169 interface_type->ct_group_ops = &interf_grp_ops; 1170 interface_type->ct_attrs = interf_grp_attrs; 1171 interface_type->ct_owner = owner; 1172 1173 while (n_interf--) { 1174 struct usb_os_desc *d; 1175 1176 d = desc[n_interf]; 1177 d->owner = owner; 1178 config_group_init_type_name(&d->group, "", interface_type); 1179 config_item_set_name(&d->group.cg_item, "interface.%s", 1180 names[n_interf]); 1181 configfs_add_default_group(&d->group, os_desc_group); 1182 } 1183 1184 return 0; 1185 } 1186 EXPORT_SYMBOL(usb_os_desc_prepare_interf_dir); 1187 1188 static int configfs_do_nothing(struct usb_composite_dev *cdev) 1189 { 1190 WARN_ON(1); 1191 return -EINVAL; 1192 } 1193 1194 int composite_dev_prepare(struct usb_composite_driver *composite, 1195 struct usb_composite_dev *dev); 1196 1197 int composite_os_desc_req_prepare(struct usb_composite_dev *cdev, 1198 struct usb_ep *ep0); 1199 1200 static void purge_configs_funcs(struct gadget_info *gi) 1201 { 1202 struct usb_configuration *c; 1203 1204 list_for_each_entry(c, &gi->cdev.configs, list) { 1205 struct usb_function *f, *tmp; 1206 struct config_usb_cfg *cfg; 1207 1208 cfg = container_of(c, struct config_usb_cfg, c); 1209 1210 list_for_each_entry_safe(f, tmp, &c->functions, list) { 1211 1212 list_move_tail(&f->list, &cfg->func_list); 1213 if (f->unbind) { 1214 dev_dbg(&gi->cdev.gadget->dev, 1215 "unbind function '%s'/%p\n", 1216 f->name, f); 1217 f->unbind(c, f); 1218 } 1219 } 1220 c->next_interface_id = 0; 1221 memset(c->interface, 0, sizeof(c->interface)); 1222 c->superspeed_plus = 0; 1223 c->superspeed = 0; 1224 c->highspeed = 0; 1225 c->fullspeed = 0; 1226 } 1227 } 1228 1229 static int configfs_composite_bind(struct usb_gadget *gadget, 1230 struct usb_gadget_driver *gdriver) 1231 { 1232 struct usb_composite_driver *composite = to_cdriver(gdriver); 1233 struct gadget_info *gi = container_of(composite, 1234 struct gadget_info, composite); 1235 struct usb_composite_dev *cdev = &gi->cdev; 1236 struct usb_configuration *c; 1237 struct usb_string *s; 1238 unsigned i; 1239 int ret; 1240 1241 /* the gi->lock is hold by the caller */ 1242 cdev->gadget = gadget; 1243 set_gadget_data(gadget, cdev); 1244 ret = composite_dev_prepare(composite, cdev); 1245 if (ret) 1246 return ret; 1247 /* and now the gadget bind */ 1248 ret = -EINVAL; 1249 1250 if (list_empty(&gi->cdev.configs)) { 1251 pr_err("Need at least one configuration in %s.\n", 1252 gi->composite.name); 1253 goto err_comp_cleanup; 1254 } 1255 1256 1257 list_for_each_entry(c, &gi->cdev.configs, list) { 1258 struct config_usb_cfg *cfg; 1259 1260 cfg = container_of(c, struct config_usb_cfg, c); 1261 if (list_empty(&cfg->func_list)) { 1262 pr_err("Config %s/%d of %s needs at least one function.\n", 1263 c->label, c->bConfigurationValue, 1264 gi->composite.name); 1265 goto err_comp_cleanup; 1266 } 1267 } 1268 1269 /* init all strings */ 1270 if (!list_empty(&gi->string_list)) { 1271 struct gadget_strings *gs; 1272 1273 i = 0; 1274 list_for_each_entry(gs, &gi->string_list, list) { 1275 1276 gi->gstrings[i] = &gs->stringtab_dev; 1277 gs->stringtab_dev.strings = gs->strings; 1278 gs->strings[USB_GADGET_MANUFACTURER_IDX].s = 1279 gs->manufacturer; 1280 gs->strings[USB_GADGET_PRODUCT_IDX].s = gs->product; 1281 gs->strings[USB_GADGET_SERIAL_IDX].s = gs->serialnumber; 1282 i++; 1283 } 1284 gi->gstrings[i] = NULL; 1285 s = usb_gstrings_attach(&gi->cdev, gi->gstrings, 1286 USB_GADGET_FIRST_AVAIL_IDX); 1287 if (IS_ERR(s)) { 1288 ret = PTR_ERR(s); 1289 goto err_comp_cleanup; 1290 } 1291 1292 gi->cdev.desc.iManufacturer = s[USB_GADGET_MANUFACTURER_IDX].id; 1293 gi->cdev.desc.iProduct = s[USB_GADGET_PRODUCT_IDX].id; 1294 gi->cdev.desc.iSerialNumber = s[USB_GADGET_SERIAL_IDX].id; 1295 } 1296 1297 if (gi->use_os_desc) { 1298 cdev->use_os_string = true; 1299 cdev->b_vendor_code = gi->b_vendor_code; 1300 memcpy(cdev->qw_sign, gi->qw_sign, OS_STRING_QW_SIGN_LEN); 1301 } 1302 1303 if (gadget_is_otg(gadget) && !otg_desc[0]) { 1304 struct usb_descriptor_header *usb_desc; 1305 1306 usb_desc = usb_otg_descriptor_alloc(gadget); 1307 if (!usb_desc) { 1308 ret = -ENOMEM; 1309 goto err_comp_cleanup; 1310 } 1311 usb_otg_descriptor_init(gadget, usb_desc); 1312 otg_desc[0] = usb_desc; 1313 otg_desc[1] = NULL; 1314 } 1315 1316 /* Go through all configs, attach all functions */ 1317 list_for_each_entry(c, &gi->cdev.configs, list) { 1318 struct config_usb_cfg *cfg; 1319 struct usb_function *f; 1320 struct usb_function *tmp; 1321 struct gadget_config_name *cn; 1322 1323 if (gadget_is_otg(gadget)) 1324 c->descriptors = otg_desc; 1325 1326 cfg = container_of(c, struct config_usb_cfg, c); 1327 if (!list_empty(&cfg->string_list)) { 1328 i = 0; 1329 list_for_each_entry(cn, &cfg->string_list, list) { 1330 cfg->gstrings[i] = &cn->stringtab_dev; 1331 cn->stringtab_dev.strings = &cn->strings; 1332 cn->strings.s = cn->configuration; 1333 i++; 1334 } 1335 cfg->gstrings[i] = NULL; 1336 s = usb_gstrings_attach(&gi->cdev, cfg->gstrings, 1); 1337 if (IS_ERR(s)) { 1338 ret = PTR_ERR(s); 1339 goto err_comp_cleanup; 1340 } 1341 c->iConfiguration = s[0].id; 1342 } 1343 1344 list_for_each_entry_safe(f, tmp, &cfg->func_list, list) { 1345 list_del(&f->list); 1346 ret = usb_add_function(c, f); 1347 if (ret) { 1348 list_add(&f->list, &cfg->func_list); 1349 goto err_purge_funcs; 1350 } 1351 } 1352 usb_ep_autoconfig_reset(cdev->gadget); 1353 } 1354 if (cdev->use_os_string) { 1355 ret = composite_os_desc_req_prepare(cdev, gadget->ep0); 1356 if (ret) 1357 goto err_purge_funcs; 1358 } 1359 1360 usb_ep_autoconfig_reset(cdev->gadget); 1361 return 0; 1362 1363 err_purge_funcs: 1364 purge_configs_funcs(gi); 1365 err_comp_cleanup: 1366 composite_dev_cleanup(cdev); 1367 return ret; 1368 } 1369 1370 static void configfs_composite_unbind(struct usb_gadget *gadget) 1371 { 1372 struct usb_composite_dev *cdev; 1373 struct gadget_info *gi; 1374 1375 /* the gi->lock is hold by the caller */ 1376 1377 cdev = get_gadget_data(gadget); 1378 gi = container_of(cdev, struct gadget_info, cdev); 1379 1380 kfree(otg_desc[0]); 1381 otg_desc[0] = NULL; 1382 purge_configs_funcs(gi); 1383 composite_dev_cleanup(cdev); 1384 usb_ep_autoconfig_reset(cdev->gadget); 1385 cdev->gadget = NULL; 1386 set_gadget_data(gadget, NULL); 1387 } 1388 1389 static const struct usb_gadget_driver configfs_driver_template = { 1390 .bind = configfs_composite_bind, 1391 .unbind = configfs_composite_unbind, 1392 1393 .setup = composite_setup, 1394 .reset = composite_disconnect, 1395 .disconnect = composite_disconnect, 1396 1397 .suspend = composite_suspend, 1398 .resume = composite_resume, 1399 1400 .max_speed = USB_SPEED_SUPER, 1401 .driver = { 1402 .owner = THIS_MODULE, 1403 .name = "configfs-gadget", 1404 }, 1405 .match_existing_only = 1, 1406 }; 1407 1408 static struct config_group *gadgets_make( 1409 struct config_group *group, 1410 const char *name) 1411 { 1412 struct gadget_info *gi; 1413 1414 gi = kzalloc(sizeof(*gi), GFP_KERNEL); 1415 if (!gi) 1416 return ERR_PTR(-ENOMEM); 1417 1418 config_group_init_type_name(&gi->group, name, &gadget_root_type); 1419 1420 config_group_init_type_name(&gi->functions_group, "functions", 1421 &functions_type); 1422 configfs_add_default_group(&gi->functions_group, &gi->group); 1423 1424 config_group_init_type_name(&gi->configs_group, "configs", 1425 &config_desc_type); 1426 configfs_add_default_group(&gi->configs_group, &gi->group); 1427 1428 config_group_init_type_name(&gi->strings_group, "strings", 1429 &gadget_strings_strings_type); 1430 configfs_add_default_group(&gi->strings_group, &gi->group); 1431 1432 config_group_init_type_name(&gi->os_desc_group, "os_desc", 1433 &os_desc_type); 1434 configfs_add_default_group(&gi->os_desc_group, &gi->group); 1435 1436 gi->composite.bind = configfs_do_nothing; 1437 gi->composite.unbind = configfs_do_nothing; 1438 gi->composite.suspend = NULL; 1439 gi->composite.resume = NULL; 1440 gi->composite.max_speed = USB_SPEED_SUPER; 1441 1442 mutex_init(&gi->lock); 1443 INIT_LIST_HEAD(&gi->string_list); 1444 INIT_LIST_HEAD(&gi->available_func); 1445 1446 composite_init_dev(&gi->cdev); 1447 gi->cdev.desc.bLength = USB_DT_DEVICE_SIZE; 1448 gi->cdev.desc.bDescriptorType = USB_DT_DEVICE; 1449 gi->cdev.desc.bcdDevice = cpu_to_le16(get_default_bcdDevice()); 1450 1451 gi->composite.gadget_driver = configfs_driver_template; 1452 1453 gi->composite.gadget_driver.function = kstrdup(name, GFP_KERNEL); 1454 gi->composite.name = gi->composite.gadget_driver.function; 1455 1456 if (!gi->composite.gadget_driver.function) 1457 goto err; 1458 1459 return &gi->group; 1460 err: 1461 kfree(gi); 1462 return ERR_PTR(-ENOMEM); 1463 } 1464 1465 static void gadgets_drop(struct config_group *group, struct config_item *item) 1466 { 1467 config_item_put(item); 1468 } 1469 1470 static struct configfs_group_operations gadgets_ops = { 1471 .make_group = &gadgets_make, 1472 .drop_item = &gadgets_drop, 1473 }; 1474 1475 static struct config_item_type gadgets_type = { 1476 .ct_group_ops = &gadgets_ops, 1477 .ct_owner = THIS_MODULE, 1478 }; 1479 1480 static struct configfs_subsystem gadget_subsys = { 1481 .su_group = { 1482 .cg_item = { 1483 .ci_namebuf = "usb_gadget", 1484 .ci_type = &gadgets_type, 1485 }, 1486 }, 1487 .su_mutex = __MUTEX_INITIALIZER(gadget_subsys.su_mutex), 1488 }; 1489 1490 void unregister_gadget_item(struct config_item *item) 1491 { 1492 struct gadget_info *gi = to_gadget_info(item); 1493 1494 mutex_lock(&gi->lock); 1495 unregister_gadget(gi); 1496 mutex_unlock(&gi->lock); 1497 } 1498 EXPORT_SYMBOL_GPL(unregister_gadget_item); 1499 1500 static int __init gadget_cfs_init(void) 1501 { 1502 int ret; 1503 1504 config_group_init(&gadget_subsys.su_group); 1505 1506 ret = configfs_register_subsystem(&gadget_subsys); 1507 return ret; 1508 } 1509 module_init(gadget_cfs_init); 1510 1511 static void __exit gadget_cfs_exit(void) 1512 { 1513 configfs_unregister_subsystem(&gadget_subsys); 1514 } 1515 module_exit(gadget_cfs_exit); 1516