Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

usb: gadget: f_ncm: Always set current gadget in ncm_bind()

Previously, gadget assignment to the net device occurred exclusively
during the initial binding attempt.

Nevertheless, the gadget pointer could change during bind/unbind
cycles due to various conditions, including the unloading/loading
of the UDC device driver or the detachment/reconnection of an
OTG-capable USB hub device.

This patch relocates the gether_set_gadget() function out from
ncm_opts->bound condition check, ensuring that the correct gadget
is assigned during each bind request.

The provided logs demonstrate the consistency of ncm_opts throughout
the power cycle, while the gadget may change.

* OTG hub connected during boot up and assignment of gadget and
ncm_opts pointer

[ 2.366301] usb 2-1.5: New USB device found, idVendor=2996, idProduct=0105
[ 2.366304] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2.366306] usb 2-1.5: Product: H2H Bridge
[ 2.366308] usb 2-1.5: Manufacturer: Aptiv
[ 2.366309] usb 2-1.5: SerialNumber: 13FEB2021
[ 2.427989] usb 2-1.5: New USB device found, VID=2996, PID=0105
[ 2.428959] dabridge 2-1.5:1.0: dabridge 2-4 total endpoints=5, 0000000093a8d681
[ 2.429710] dabridge 2-1.5:1.0: P(0105) D(22.06.22) F(17.3.16) H(1.1) high-speed
[ 2.429714] dabridge 2-1.5:1.0: Hub 2-2 P(0151) V(06.87)
[ 2.429956] dabridge 2-1.5:1.0: All downstream ports in host mode

[ 2.430093] gadget 000000003c414d59 ------> gadget pointer

* NCM opts and associated gadget pointer during First ncm_bind

[ 34.763929] NCM opts 00000000aa304ac9
[ 34.763930] NCM gadget 000000003c414d59

* OTG capable hub disconnecte or assume driver unload.

[ 97.203114] usb 2-1: USB disconnect, device number 2
[ 97.203118] usb 2-1.1: USB disconnect, device number 3
[ 97.209217] usb 2-1.5: USB disconnect, device number 4
[ 97.230990] dabr_udc deleted

* Reconnect the OTG hub or load driver assaign new gadget pointer.

[ 111.534035] usb 2-1.1: New USB device found, idVendor=2996, idProduct=0120, bcdDevice= 6.87
[ 111.534038] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 111.534040] usb 2-1.1: Product: Vendor
[ 111.534041] usb 2-1.1: Manufacturer: Aptiv
[ 111.534042] usb 2-1.1: SerialNumber: Superior
[ 111.535175] usb 2-1.1: New USB device found, VID=2996, PID=0120
[ 111.610995] usb 2-1.5: new high-speed USB device number 8 using xhci-hcd
[ 111.630052] usb 2-1.5: New USB device found, idVendor=2996, idProduct=0105, bcdDevice=21.02
[ 111.630055] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 111.630057] usb 2-1.5: Product: H2H Bridge
[ 111.630058] usb 2-1.5: Manufacturer: Aptiv
[ 111.630059] usb 2-1.5: SerialNumber: 13FEB2021
[ 111.687464] usb 2-1.5: New USB device found, VID=2996, PID=0105
[ 111.690375] dabridge 2-1.5:1.0: dabridge 2-8 total endpoints=5, 000000000d87c961
[ 111.691172] dabridge 2-1.5:1.0: P(0105) D(22.06.22) F(17.3.16) H(1.1) high-speed
[ 111.691176] dabridge 2-1.5:1.0: Hub 2-6 P(0151) V(06.87)
[ 111.691646] dabridge 2-1.5:1.0: All downstream ports in host mode

[ 111.692298] gadget 00000000dc72f7a9 --------> new gadget ptr on connect

* NCM opts and associated gadget pointer during second ncm_bind

[ 113.271786] NCM opts 00000000aa304ac9 -----> same opts ptr used during first bind
[ 113.271788] NCM gadget 00000000dc72f7a9 ----> however new gaget ptr, that will not set
in net_device due to ncm_opts->bound = true

Signed-off-by: Hardik Gajjar <hgajjar@de.adit-jv.com>
Link: https://lore.kernel.org/r/20231020153324.82794-1-hgajjar@de.adit-jv.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Hardik Gajjar and committed by
Greg Kroah-Hartman
a04224da c9a1d9e7

+11 -16
+11 -16
drivers/usb/gadget/function/f_ncm.c
··· 1410 1410 struct usb_composite_dev *cdev = c->cdev; 1411 1411 struct f_ncm *ncm = func_to_ncm(f); 1412 1412 struct usb_string *us; 1413 - int status; 1413 + int status = 0; 1414 1414 struct usb_ep *ep; 1415 1415 struct f_ncm_opts *ncm_opts; 1416 1416 ··· 1428 1428 f->os_desc_table[0].os_desc = &ncm_opts->ncm_os_desc; 1429 1429 } 1430 1430 1431 - /* 1432 - * in drivers/usb/gadget/configfs.c:configfs_composite_bind() 1433 - * configurations are bound in sequence with list_for_each_entry, 1434 - * in each configuration its functions are bound in sequence 1435 - * with list_for_each_entry, so we assume no race condition 1436 - * with regard to ncm_opts->bound access 1437 - */ 1438 - if (!ncm_opts->bound) { 1439 - mutex_lock(&ncm_opts->lock); 1440 - gether_set_gadget(ncm_opts->net, cdev->gadget); 1431 + mutex_lock(&ncm_opts->lock); 1432 + gether_set_gadget(ncm_opts->net, cdev->gadget); 1433 + if (!ncm_opts->bound) 1441 1434 status = gether_register_netdev(ncm_opts->net); 1442 - mutex_unlock(&ncm_opts->lock); 1443 - if (status) 1444 - goto fail; 1445 - ncm_opts->bound = true; 1446 - } 1435 + mutex_unlock(&ncm_opts->lock); 1436 + 1437 + if (status) 1438 + goto fail; 1439 + 1440 + ncm_opts->bound = true; 1441 + 1447 1442 us = usb_gstrings_attach(cdev, ncm_strings, 1448 1443 ARRAY_SIZE(ncm_string_defs)); 1449 1444 if (IS_ERR(us)) {