On Sat, Mar 11, 2023, Joakim Tjernlund wrote: > On Fri, 2023-03-10 at 22:58 +0000, Thinh Nguyen wrote: > > On Fri, Mar 10, 2023, Joakim Tjernlund wrote: > > > On Thu, 2023-03-09 at 21:09 +0000, Thinh Nguyen wrote: > > > > On Thu, Mar 09, 2023, Joakim Tjernlund wrote: > > > > > On Thu, 2023-03-09 at 19:56 +0000, Thinh Nguyen wrote: > > > > > > On Thu, Mar 09, 2023, Joakim Tjernlund wrote: > > > > > > > On Thu, 2023-03-09 at 17:32 +0100, Joakim Tjernlund wrote: > > > > > > > > On Wed, 2023-03-08 at 22:26 +0100, Joakim Tjernlund wrote: > > > > > > > > > On Wed, 2023-03-08 at 19:58 +0100, gregkh@xxxxxxxxxxxxxxxxxxx wrote: > > > > > > > > > > On Wed, Mar 08, 2023 at 06:12:51PM +0000, Joakim Tjernlund wrote: > > > > > > > > > > > On Wed, 2023-03-08 at 18:25 +0100, Greg KH wrote: > > > > > > > > > > > > On Wed, Mar 08, 2023 at 05:10:17PM +0000, Joakim Tjernlund wrote: > > > > > > > > > > > > > > > SNIP ... > > > > > > > > > > While I remember, I tried to create both a NCM and a ttyACM on top of my dwc3 gadget > > > but then I got som bind error when activating the UDC. Is that expected ? > > > I figured both could live on the same device and would just mux the two protocols. > > > > > > > I'm not clear what you meant here. The gadget driver and the UDC driver > > should be separated and abstracted from each other. > > > > Also, please note that all this talking points are based on the > > assumption that the issue is due to the host putting the device in > > suspend base on your experiment. We didn't review the logs. > > > > IMO, the best option should be to prevent suspend from the host side as > > it looks like your device may operate in usb3 speed also? > > > > BR, > > Thinh > > This script best explain I think: > #! /bin/sh > > stop() { > g="/sys/kernel/config/usb_gadget/g1" > if [ -e "${g}"/UDC ]; then > echo "" > "${g}"/UDC > rm -f "${g}"/os_desc/c.1 > rm -f "${g}"/configs/c.1/ncm.usb0 > rm -f "${g}"/configs/c.1/acm.GS0 > [ -d "${g}"/configs/c.1/strings/0x409 ] && rmdir "${g}"/configs/c.1/strings/0x409 > [ -d "${g}"/functions/acm.GS0 ] && rmdir "${g}"/functions/acm.GS0 > [ -d "${g}"/functions/ncm.usb0 ] && rmdir "${g}"/functions/ncm.usb0 > [ -d "${g}"/c.1/strings ] && rmdir "${g}"/c.1/strings > [ -d "${g}"/c.1/strings/0x409 ] && rmdir "${g}"/c.1/strings/0x409 > [ -d "${g}"/configs/c.1 ] && rmdir "${g}"/configs/c.1 > [ -d "${g}" ] && rmdir "${g}" > fi > } > > start() { > mkdir -p /sys/kernel/config/usb_gadget/g1 > cd /sys/kernel/config/usb_gadget/g1 > > ############################### > # Populate Device-Level Stuff # > ############################### > > #Setting device class/subclass/protocol to these values > # alerts the OS that this is a composite device with > # IADs in it's firmware. > # ref: https://urldefense.com/v3/__https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-interface-association-descriptor__;!!A4F2R9G_pg!f2DmukBCz-n2dXRTDTd22YjHdXgKXWZwCLtuwoB4SdjW-U7s2s9Cyez4-JjmHJNzhetxdX06a6iohV_1yj7bpq2Ha28LvwALSw$ > echo "0xEF" > bDeviceClass > echo "0x02" > bDeviceSubClass > echo "0x01" > bDeviceProtocol > > echo "0x15A2" > idVendor > echo "0x0001" > idProduct > > #mkdir strings/0x409 > #echo "1234567" > strings/0x409/serialnumber > #echo "Infinera" > strings/0x409/manufacturer > #echo "NDU" > strings/0x409/product > > #enable use of os_desc's (important for RNDIS & NCM enablement on Windows): > echo 1 > os_desc/use > echo 0xbc > os_desc/b_vendor_code #or 0xcd ? > echo MSFT100 > os_desc/qw_sign > > ################################# > # Populate Individual Functions # > ################################# > > #The order functions are populated here will be reflected in the > # order of descriptors written. > > ######### > # RNDIS # > ######### > #Note! If RNDIS is enabled, it *has* to be the first function! Otherwise, Windows 10 will report error 10 (failed to start device). > # (It's unclear why this is the case..) > # https://urldefense.com/v3/__https://docs.microsoft.com/en-us/answers/questions/474108/does-rndis-need-to-be-listed-as-the-first-function.html__;!!A4F2R9G_pg!f2DmukBCz-n2dXRTDTd22YjHdXgKXWZwCLtuwoB4SdjW-U7s2s9Cyez4-JjmHJNzhetxdX06a6iohV_1yj7bpq2Ha28URWCTNQ$ > # https://urldefense.com/v3/__https://stackoverflow.com/questions/68365739/windows-rndis-compatible-device-does-rndis-need-to-be-listed-as-the-first-funct__;!!A4F2R9G_pg!f2DmukBCz-n2dXRTDTd22YjHdXgKXWZwCLtuwoB4SdjW-U7s2s9Cyez4-JjmHJNzhetxdX06a6iohV_1yj7bpq2Ha2-HtzzXog$ > if [ 0 = 1 ] > then > mkdir functions/rndis.usb0 > mkdir -p functions/rndis.usb0/os_desc/interface.rndis > > # Set compatible / sub-compatible id's so that Windows can match this > # function to RNDIS6 driver more easily. > echo RNDIS > functions/rndis.usb0/os_desc/interface.rndis/compatible_id > echo 5162001 > functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id > > mkdir -p configs/c.1 > mkdir -p configs/c.1/strings/0x409 > echo "0xC0" > configs/c.1/bmAttributes # Self powered > echo "conf1" > configs/c.1/strings/0x409/configuration > ln -s functions/rndis.usb0 configs/c.1 > if [ ! -L os_desc/c.1 ] > then > ln -s configs/c.1 os_desc > fi > fi > > ######### > # NCM # > ######### > #Usually I test with *either* RNDIS or NCM enabled, but not both, hence the if(0) here.. > if [ 1 = 1 ] > then > mkdir functions/ncm.usb0 > mkdir -p functions/ncm.usb0/os_desc/interface.ncm > # Set compatible id so that Windows 10 can match this function to > # NCM driver more easily. > echo WINNCM > functions/ncm.usb0/os_desc/interface.ncm/compatible_id > > mkdir -p configs/c.1 > mkdir -p configs/c.1/strings/0x409 > echo "0xC0" > configs/c.1/bmAttributes # Self powered > echo "conf1" > configs/c.1/strings/0x409/configuration > ln -s functions/ncm.usb0 configs/c.1 > if [ ! -L os_desc/c.1 ] > then > ln -s configs/c.1 os_desc > fi > fi > > ######### > # ACM # > ######### > if [ 1 = 1 ] > then > mkdir -p functions/acm.GS0 > > mkdir -p configs/c.1 > mkdir -p configs/c.1/strings/0x409 > echo "0xC0" > configs/c.1/bmAttributes # Self powered > ln -fs functions/acm.GS0 configs/c.1 > if [ ! -L os_desc/c.1 ] > then > ln -s configs/c.1 os_desc > fi > fi > > #Activate/bind USB gadget > echo 2f00000.usb > UDC > } > command=$@ > > case ${command} in > start) > echo "Starting usb-lc" > start > #ifconfig lc 169.254.100.101 netmask 255.255.255.252 # for debug > ;; > stop) > echo "Stopping usb-lc" > stop > ;; > restart) > stop > start > ;; > > *) > echo "Create USB Gadget device dual NCM and rndis V0.1.1 for MAC, Linux and Windows" > exit 1 > ;; > esac > > > This gives me an error: > > ./config_gadget.sh start > Starting usb-lc > sh: write error: Device or resource busy > > the line causing that is: > echo 2f00000.usb > UDC > > Just create either NCM or ACM works, but not both Not sure. You may need to trace through the code path and see where it fails. BR, Thinh