cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

configfs.c (41930B)


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