From owner-freebsd-multimedia@freebsd.org Mon Mar 6 06:05:23 2017 Return-Path: Delivered-To: freebsd-multimedia@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8AB9FCFB02B for ; Mon, 6 Mar 2017 06:05:23 +0000 (UTC) (envelope-from mrechberger@gmail.com) Received: from mail-qk0-x231.google.com (mail-qk0-x231.google.com [IPv6:2607:f8b0:400d:c09::231]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 480781BA2 for ; Mon, 6 Mar 2017 06:05:23 +0000 (UTC) (envelope-from mrechberger@gmail.com) Received: by mail-qk0-x231.google.com with SMTP id v125so76832457qkh.2 for ; Sun, 05 Mar 2017 22:05:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=VBak5ZGZczjQPVnl1XyB/QvlExi/rE0AUZiMpoN7cpc=; b=DhY6YbJQk8biXdu59JjNEkhW7gNM3WIjRQIiTBMzPqQwBjWD+H1zuydYriLBlmCfJg Ufg3FWE7GWnwIAXP8pdcTdoKXBu8T5nk86oxC6ED0E/c3NKq4TECl0EGxYsidUjGWY7r /NmyAILVaQH/dCj/ofhMsAs1tsKGdS7O8REc9jHe2lqaXaLLJaWbEjJzNRMPTtub3H11 PSJOC8mmblE/sTrEWoBVLFIqIIL1AJsmp//XSsxhI5UsanU1A/bK4Yk2WioozddUUVOC AT+DZbLpa+FBPCTogKN0nzc7tUGK7m0hdBbceFF5e8TbZTxLysFLdklioBHhMGK3v5ss KA3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=VBak5ZGZczjQPVnl1XyB/QvlExi/rE0AUZiMpoN7cpc=; b=kghdju/mCeK598O4dLIoSysdh+o8cDvDy5gznRYtxMOYTYnyQwDGJWiKc+uw2yr+rk zEtQskbtSna6tDic+aO73XM2eKaWcSUKVf5evqlHug2MURmLNB0vqxQ3dpzKAoFHKIYv ZEkQSH4uAk3XzsVSore74Tcz7QJ9XnMebx1v/G8S+41CogoYSyNGTzgm0ElKS16jxvNG To1AdC/cW9hgU2yL4RoFz1i5b9jC4Jx8htKfilQIKpWO5v7CVhT8GsV43OrJGhk1BIba ha7mcKZfWI9GNcEd4w4XckwSAGb/DtLj138zafpWIew/ckmAVKneOSevbuaF9v3JyoNB 2Mcg== X-Gm-Message-State: AMke39m1bwyMMn06Wwl7pLPe8WfHltL7rRENoUlwa003VHMRCsiwWebUdg1Nm46KrURy460PPTV6ex/Xr/+fMw== X-Received: by 10.237.41.229 with SMTP id o92mr13585579qtd.223.1488780322405; Sun, 05 Mar 2017 22:05:22 -0800 (PST) MIME-Version: 1.0 Received: by 10.12.174.114 with HTTP; Sun, 5 Mar 2017 22:05:22 -0800 (PST) In-Reply-To: References: From: Markus Rechberger Date: Mon, 6 Mar 2017 07:05:22 +0100 Message-ID: Subject: Re: What is wrong with FreeBSD and USB Support To: freebsd-multimedia@freebsd.org, Hans Petter Selasky Content-Type: text/plain; charset=UTF-8 X-BeenThere: freebsd-multimedia@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Multimedia discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Mar 2017 06:05:23 -0000 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 documentation. Markus On Mon, Mar 6, 2017 at 6:50 AM, Markus Rechberger 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 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