Message ID | 20230130093443.25644-7-dan.scally@ideasonboard.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add XU support to UVC Gadget | expand |
Hi Daniel, I love your patch! Perhaps something to improve: [auto build test WARNING on usb/usb-linus] [also build test WARNING on westeri-thunderbolt/next linus/master v6.2-rc6 next-20230130] [cannot apply to usb/usb-testing usb/usb-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Scally/usb-gadget-uvc-Make-bSourceID-read-write/20230130-174215 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-linus patch link: https://lore.kernel.org/r/20230130093443.25644-7-dan.scally%40ideasonboard.com patch subject: [PATCH v3 06/11] usb: gadget: configfs: Support arbitrary string descriptors config: i386-randconfig-a013-20230130 (https://download.01.org/0day-ci/archive/20230130/202301302236.Ogdqs7GZ-lkp@intel.com/config) compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/452304e81fac1427f314a4b0beef8561ef4ebf17 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Daniel-Scally/usb-gadget-uvc-Make-bSourceID-read-write/20230130-174215 git checkout 452304e81fac1427f314a4b0beef8561ef4ebf17 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/usb/gadget/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/usb/gadget/configfs.c:811:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ 1 warning generated. vim +/ret +811 drivers/usb/gadget/configfs.c 805 806 static ssize_t gadget_string_s_store(struct config_item *item, const char *page, 807 size_t len) 808 { 809 struct gadget_string *string = to_gadget_string(item); 810 int size = min(sizeof(string->string), len + 1); > 811 int ret; 812 813 if (len > USB_MAX_STRING_LEN) 814 return -EINVAL; 815 816 ret = strscpy(string->string, page, size); 817 return len; 818 } 819 CONFIGFS_ATTR(gadget_string_, s); 820
Hi Daniel, I love your patch! Perhaps something to improve: [auto build test WARNING on usb/usb-linus] [also build test WARNING on westeri-thunderbolt/next linus/master v6.2-rc6 next-20230130] [cannot apply to usb/usb-testing usb/usb-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Scally/usb-gadget-uvc-Make-bSourceID-read-write/20230130-174215 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-linus patch link: https://lore.kernel.org/r/20230130093443.25644-7-dan.scally%40ideasonboard.com patch subject: [PATCH v3 06/11] usb: gadget: configfs: Support arbitrary string descriptors config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230130/202301302344.mwzUOCim-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/452304e81fac1427f314a4b0beef8561ef4ebf17 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Daniel-Scally/usb-gadget-uvc-Make-bSourceID-read-write/20230130-174215 git checkout 452304e81fac1427f314a4b0beef8561ef4ebf17 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash drivers/usb/gadget/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): drivers/usb/gadget/configfs.c: In function 'gadget_string_s_store': >> drivers/usb/gadget/configfs.c:811:13: warning: variable 'ret' set but not used [-Wunused-but-set-variable] 811 | int ret; | ^~~ vim +/ret +811 drivers/usb/gadget/configfs.c 805 806 static ssize_t gadget_string_s_store(struct config_item *item, const char *page, 807 size_t len) 808 { 809 struct gadget_string *string = to_gadget_string(item); 810 int size = min(sizeof(string->string), len + 1); > 811 int ret; 812 813 if (len > USB_MAX_STRING_LEN) 814 return -EINVAL; 815 816 ret = strscpy(string->string, page, size); 817 return len; 818 } 819 CONFIGFS_ATTR(gadget_string_, s); 820
On Mon, Jan 30, 2023 at 09:34:38AM +0000, Daniel Scally wrote: > Add a framework to allow users to define arbitrary string descriptors > for a USB Gadget. This is modelled as a new type of config item rather > than as hardcoded attributes so as to be as flexible as possible. > > Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> > --- > Changes in v3: > > - Moved this functionality from the UVC function to usb gadget core. > > Changes in v2: > > - New patch > > drivers/usb/gadget/configfs.c | 172 +++++++++++++++++++++++++++++++++- > include/linux/usb/gadget.h | 11 +++ > 2 files changed, 181 insertions(+), 2 deletions(-) Shouldn't this patch also include an update to Documentation/usb/gadget_configfs.rst? Alan Stern
Hi Alan On 30/01/2023 16:37, Alan Stern wrote: > On Mon, Jan 30, 2023 at 09:34:38AM +0000, Daniel Scally wrote: >> Add a framework to allow users to define arbitrary string descriptors >> for a USB Gadget. This is modelled as a new type of config item rather >> than as hardcoded attributes so as to be as flexible as possible. >> >> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> >> --- >> Changes in v3: >> >> - Moved this functionality from the UVC function to usb gadget core. >> >> Changes in v2: >> >> - New patch >> >> drivers/usb/gadget/configfs.c | 172 +++++++++++++++++++++++++++++++++- >> include/linux/usb/gadget.h | 11 +++ >> 2 files changed, 181 insertions(+), 2 deletions(-) > Shouldn't this patch also include an update to > Documentation/usb/gadget_configfs.rst? Yes; I'll update that before resubmitting. > Alan Stern
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index e0f93c42cde6..7c8b8ab5dfa3 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -88,6 +88,8 @@ struct gadget_language { struct config_group group; struct list_head list; + struct list_head gadget_strings; + unsigned int nstrings; }; struct gadget_config_name { @@ -778,8 +780,174 @@ static void gadget_language_attr_release(struct config_item *item) kfree(gs); } -USB_CONFIG_STRING_RW_OPS(gadget_language); -USB_CONFIG_STRINGS_LANG(gadget_language, gadget_info); +static struct configfs_item_operations gadget_language_langid_item_ops = { + .release = gadget_language_attr_release, +}; + +static ssize_t gadget_string_id_show(struct config_item *item, char *page) +{ + struct gadget_string *string = to_gadget_string(item); + int ret; + + ret = sprintf(page, "%u\n", string->usb_string.id); + return ret; +} +CONFIGFS_ATTR_RO(gadget_string_, id); + +static ssize_t gadget_string_s_show(struct config_item *item, char *page) +{ + struct gadget_string *string = to_gadget_string(item); + int ret; + + ret = snprintf(page, sizeof(string->string), "%s\n", string->string); + return ret; +} + +static ssize_t gadget_string_s_store(struct config_item *item, const char *page, + size_t len) +{ + struct gadget_string *string = to_gadget_string(item); + int size = min(sizeof(string->string), len + 1); + int ret; + + if (len > USB_MAX_STRING_LEN) + return -EINVAL; + + ret = strscpy(string->string, page, size); + return len; +} +CONFIGFS_ATTR(gadget_string_, s); + +static struct configfs_attribute *gadget_string_attrs[] = { + &gadget_string_attr_id, + &gadget_string_attr_s, + NULL, +}; + +static void gadget_string_release(struct config_item *item) +{ + struct gadget_string *string = to_gadget_string(item); + + kfree(string); +} + +static struct configfs_item_operations gadget_string_item_ops = { + .release = gadget_string_release, +}; + +static const struct config_item_type gadget_string_type = { + .ct_item_ops = &gadget_string_item_ops, + .ct_attrs = gadget_string_attrs, + .ct_owner = THIS_MODULE, +}; + +static struct config_item *gadget_language_string_make(struct config_group *group, + const char *name) +{ + struct gadget_language *language; + struct gadget_string *string; + + language = to_gadget_language(&group->cg_item); + + string = kzalloc(sizeof(*string), GFP_KERNEL); + if (!string) + return ERR_PTR(-ENOMEM); + + string->usb_string.id = language->nstrings++; + string->usb_string.s = string->string; + list_add_tail(&string->list, &language->gadget_strings); + + config_item_init_type_name(&string->item, name, &gadget_string_type); + + return &string->item; +} + +static void gadget_language_string_drop(struct config_group *group, + struct config_item *item) +{ + struct gadget_language *language; + struct gadget_string *string; + unsigned int i = USB_GADGET_FIRST_AVAIL_IDX; + + language = to_gadget_language(&group->cg_item); + string = to_gadget_string(item); + + list_del(&string->list); + language->nstrings--; + + /* Reset the ids for the language's strings to guarantee a continuous set */ + list_for_each_entry(string, &language->gadget_strings, list) + string->usb_string.id = i++; +} + +static struct configfs_group_operations gadget_language_langid_group_ops = { + .make_item = gadget_language_string_make, + .drop_item = gadget_language_string_drop, +}; + +static struct config_item_type gadget_language_type = { + .ct_item_ops = &gadget_language_langid_item_ops, + .ct_group_ops = &gadget_language_langid_group_ops, + .ct_attrs = gadget_language_langid_attrs, + .ct_owner = THIS_MODULE, +}; + +static struct config_group *gadget_language_make(struct config_group *group, + const char *name) +{ + struct gadget_info *gi; + struct gadget_language *gs; + struct gadget_language *new; + int langs = 0; + int ret; + + new = kzalloc(sizeof(*new), GFP_KERNEL); + if (!new) + return ERR_PTR(-ENOMEM); + + ret = check_user_usb_string(name, &new->stringtab_dev); + if (ret) + goto err; + config_group_init_type_name(&new->group, name, + &gadget_language_type); + + gi = container_of(group, struct gadget_info, strings_group); + ret = -EEXIST; + list_for_each_entry(gs, &gi->string_list, list) { + if (gs->stringtab_dev.language == new->stringtab_dev.language) + goto err; + langs++; + } + ret = -EOVERFLOW; + if (langs >= MAX_USB_STRING_LANGS) + goto err; + + list_add_tail(&new->list, &gi->string_list); + INIT_LIST_HEAD(&new->gadget_strings); + + /* We have the default manufacturer, product and serialnumber strings */ + new->nstrings = 3; + return &new->group; +err: + kfree(new); + return ERR_PTR(ret); +} + +static void gadget_language_drop(struct config_group *group, + struct config_item *item) +{ + config_item_put(item); +} + +static struct configfs_group_operations gadget_language_group_ops = { + .make_group = &gadget_language_make, + .drop_item = &gadget_language_drop, +}; + +static struct config_item_type gadget_language_strings_type = { + .ct_group_ops = &gadget_language_group_ops, + .ct_owner = THIS_MODULE, +}; static inline struct gadget_info *os_desc_item_to_gadget_info( struct config_item *item) diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index dc3092cea99e..00750f7020f3 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -15,6 +15,7 @@ #ifndef __LINUX_USB_GADGET_H #define __LINUX_USB_GADGET_H +#include <linux/configfs.h> #include <linux/device.h> #include <linux/errno.h> #include <linux/init.h> @@ -821,6 +822,16 @@ int usb_gadget_get_string(const struct usb_gadget_strings *table, int id, u8 *bu /* check if the given language identifier is valid */ bool usb_validate_langid(u16 langid); +struct gadget_string { + struct config_item item; + struct list_head list; + char string[USB_MAX_STRING_LEN]; + struct usb_string usb_string; +}; + +#define to_gadget_string(str_item)\ +container_of(str_item, struct gadget_string, item) + /*-------------------------------------------------------------------------*/ /* utility to simplify managing config descriptors */
Add a framework to allow users to define arbitrary string descriptors for a USB Gadget. This is modelled as a new type of config item rather than as hardcoded attributes so as to be as flexible as possible. Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> --- Changes in v3: - Moved this functionality from the UVC function to usb gadget core. Changes in v2: - New patch drivers/usb/gadget/configfs.c | 172 +++++++++++++++++++++++++++++++++- include/linux/usb/gadget.h | 11 +++ 2 files changed, 181 insertions(+), 2 deletions(-)