Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 May 2021 21:23:15 +0200
From:      Hans Petter Selasky <hps@selasky.org>
To:        Naina Patrascu <patrascu.naina14@gmail.com>, freebsd-hackers@freebsd.org,  lucian_ioan.popescu@stud.acs.upb.ro, Elena Mihailescu <elenamihailescu22@gmail.com>
Subject:   Re: Indexing problem with address number of a USB device
Message-ID:  <a217ce33-0af2-abfe-c268-5aa394198b78@selasky.org>
In-Reply-To: <20210512191448.GK14975@funkthat.com>
References:  <CAKHb35vf=63QRtMWGT-u3KGYXxp678GHk9ygfE77UBhOE4bgtQ@mail.gmail.com> <20210512191448.GK14975@funkthat.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 5/12/21 9:14 PM, John-Mark Gurney wrote:
> Naina Patrascu wrote this message on Tue, May 11, 2021 at 18:47 +0300:
>> We are working on the USB passthrough functionality for bhyve. We are
>> currently focusing on the passthrough of a USB stick and a USB keyboard.
>>
>> We are facing an indexing problem when trying to assign a USB device to a
>> virtual machine.
>> For example, we have the USB keyboard at busnum=1 and devaddr=2 on the
>> FreeBSD host virtual machine:
>>
>> # usbconfig -d ugen1.2
>> ugen1.2: <Gaming KB Gaming KB> at usbus1, cfg=0 md=HOST spd=LOW (1.5Mbps)
>> pwr=ON (100mA)
>>
>> We specify to "bhyve" command to pass through the device to a guest virtual
>> machine: -s 30,xhci,1-2
>>
>> As part of the enumeration process, the host controller executes the
>> internal scan to discover the physical devices and to compare them with the
>> ones assigned with the bhyve command.
>> But the USB device is discovered at bus 1 address 1, and we have to adjust
>> accordingly when parsing the bus-port to match the port number:
>>
>> 04f3:152e 1-1 connecting.
>> 04f3:152e 1-1 belong to this vm.
>> 04F3:152E 1-1 is attached to virtual port 5.
>>
>> We hardcoded when parsing bus-port: port -= 1.
>> When trying to pass through a USB stick, we have to increase the port
>> number to match the one discovered in the internal scan:
>>
>> # usbconfig -d ugen3.2
>> ugen3.2: <Kingston DataTraveler 3.0> at usbus3, cfg=0 md=HOST spd=HIGH
>> (480Mbps) pwr=ON (300mA)
>>
>> 0951:1666 3-3 connecting.
>> 0951:1666 3-3 belong to this vm.
>> 0951:1666 3-3 is attached to virtual port 1.
>>
>> In our last investigation, we discovered that when increasing the number of
>> USB devices on the FreeBSD host vm, the port indexes of the devices
>> discovered by the internal scan, also varies.
>>
>> In function [1] we get the physical devices using libusb library and then
>> we execute the internal scan using function [2]. We get the information
>> about the physical device in function [3], also using libusb library.
>>
>> Can you help us understand where this problem could come from and how to
>> debug it?
> 
> Yes, the ugen named does not map to port naming.  I ran across this when
> I did the work to make serial devices consistent based upon the port
> number.  The review for that work is here:
> https://reviews.freebsd.org/D21886#554613
> 
> The device address is a different enumeration from the port address
> information.  The script linked in the review creates a mapping from
> the device name to the proper port number mapping.
> 
> To see this, you can look at devinfo -v, and look at the port value
> vs the devaddr (device address assigned at enumeration).
> 
> Hope this helps.
> 
> 

Hi,

LibUSB in FreeBSD has a helper function to compute the full port topology:

      libusb_get_port_numbers()
and:

      libusb20_dev_get_port_path()

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?a217ce33-0af2-abfe-c268-5aa394198b78>