]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: gadget: configfs: Correctly set use_os_string at bind
authorWilliam Wu <william.wu@rock-chips.com>
Fri, 22 Aug 2025 03:36:09 +0000 (11:36 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Oct 2025 09:56:32 +0000 (11:56 +0200)
[ Upstream commit e271cc0d25015f4be6c88bd7731444644eb352c2 ]

Once the use_os_string flag is set to true for some functions
(e.g. adb/mtp) which need to response the OS string, and then
if we re-bind the ConfigFS gadget to use the other functions
(e.g. hid) which should not to response the OS string, however,
because the use_os_string flag is still true, so the usb gadget
response the OS string descriptor incorrectly, this can cause
the USB device to be unrecognizable on the Windows system.

An example of this as follows:

echo 1 > os_desc/use
ln -s functions/ffs.adb configs/b.1/function0
start adbd
echo "<udc device>" > UDC   #succeed

stop adbd
rm configs/b.1/function0
echo 0 > os_desc/use
ln -s functions/hid.gs0 configs/b.1/function0
echo "<udc device>" > UDC  #fail to connect on Windows

This patch sets the use_os_string flag to false at bind if
the functions not support OS Descriptors.

Signed-off-by: William Wu <william.wu@rock-chips.com>
Fixes: 87213d388e92 ("usb: gadget: configfs: OS String support")
Link: https://lore.kernel.org/r/1755833769-25434-1-git-send-email-william.wu@rock-chips.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/usb/gadget/configfs.c

index cdbf12639dfa75dd7bdaf9a3eafebcfdc17ed1c8..f55dcc3a401842538dc729aa676a83771274fec1 100644 (file)
@@ -1356,6 +1356,8 @@ static int configfs_composite_bind(struct usb_gadget *gadget,
                cdev->use_os_string = true;
                cdev->b_vendor_code = gi->b_vendor_code;
                memcpy(cdev->qw_sign, gi->qw_sign, OS_STRING_QW_SIGN_LEN);
+       } else {
+               cdev->use_os_string = false;
        }
 
        if (gadget_is_otg(gadget) && !otg_desc[0]) {