What is wrong with FreeBSD and USB Support

Markus Rechberger mrechberger at gmail.com
Mon Mar 6 06:05:23 UTC 2017

libusb20_dev_open() opens an USB device so that setting up USB
transfers becomes possible. The number of USB transfers can be zero
which means only control transfers are allowed. This function returns
zero on success else a LIBUSB20_ERROR value is returned. A return
value of LIBUSB20_ERROR_BUSY means that the device is already opened.

libusb20_tr_get_pointer() will return a pointer to the allocated USB
transfer according to the pdev and tr_index arguments. This function
returns NULL in case of failure.

what is the definition of a "tr_index"? The documentation does not
cover that anywhere, someone can only copy it from the sample sources.
Please don't expect that anyone reading the manpage will have an idea
how the FreeBSD API works, because all those items simply do not exist
with other operating systems, neither is the ep_index calculation
needed with other systems.

uint8_t ep_index = (((addr & 0x80) / 0x40) | (addr * 4)) % (16 * 4);
uhe->bsd_xfer[0] = libusb20_tr_get_pointer(dev->bsd_udev, ep_index + 0);
uhe->bsd_xfer[1] = libusb20_tr_get_pointer(dev->bsd_udev, ep_index + 1);

So my guess is that the examples are just using 2 urb transfers and
freebsd just cannot catch up. However it is still unclear how to
correctly initiate more than 2 urb transfers by reading the


On Mon, Mar 6, 2017 at 6:50 AM, Markus Rechberger <mrechberger at gmail.com> wrote:
> Hi,
> I got one step further it turns out that the problem is indeed the
> FreeBSD Stack, the latency is terrible causing an overflow on the
> chipside. Once that happens the transfer has to be restarted (which
> requires to toggle a register).
> Is there any way to do low latency transfers with FreeBSD?
> Markus
> On Mon, Mar 6, 2017 at 6:19 AM, Markus Rechberger <mrechberger at gmail.com> wrote:
>> Hi,
>> I have been trying to port a driver to freebsd for a day now and the
>> result is quite negative.
>> So my feedback about libusb20 and the FreeBSD USB Kernel Stack:
>> 1. the documentation is not clear how to set up asynchronous bulk
>> transfers (please explain the architecture of this API)
>> 2. the errors returned by libusb20 (and probably from the kernel) are
>> not detailed enough (in certain cases I'm able to get libusb20 unknown
>> error, to my understanding every error should have some meaning).
>> 3. the FreeBSD USB Stack messes around with the transfer itself
>> damaging the entire result (eg resulting in stalled USB bulk
>> transfers).
>> 4. The FreeBSD data transfer implementation itself is a disaster, I'm
>> able to transfer data at a rate of 2 MB/sec, anything higher results
>> in a stalled usb transfer?!
>> 5. USB Control messages are 100% slower than with other operating
>> systems (eg. it took 14 seconds to load a driver with FreeBSD while it
>> only takes 7 seconds on other systems).
>> Since I have been using USB stacks with Linux, Mac and some other
>> systems I can say that FreeBSD has the most irritating implementation
>> of all.
>> So finally I wonder what is wrong with FreeBSD's USB support?
>> Best Regards,
>> Markus

More information about the freebsd-multimedia mailing list