
On at least freebsd-13 trying to cancel a transfer whilst the libusb thread is not running results in the transfers not completing cancellation. The next time they're attempted to be re-added the libusb code thinks they're still active, and returns BUSY on the buffers. This causes gqrx to error out when one makes DSP changes or stops/starts it. You have to restart gqrx to fix it. After digging into it a bit, the libusb code expects that you're actively running the main loop in order to have some deferred actions run in the context of said main loop thread. This includes processing cancelled transfers - the callbacks have to be run (if they exist) before the buffers are properly cancelled and have their tracking metadata (a couple of private pointers and state) removed from inside of libusb. This patch does the following: * separate out adding and cancelling transfers from the libusb worker thread create/destroy path * create the libusb worker thread when opening the device * destroy the libusb worker thread when closing the device * only add and cancel transfers when starting and stopping tx/rx * handle cancelled transfers gracefully in the USB callback Whilst here, also make the libusb device memory zeroed by using calloc instead of malloc. This fixes all of the weird libusb related buffer management problems on FreeBSD.
This repository contains hardware designs and software for HackRF, a low cost, open source Software Defined Radio platform.
(photo by fd0 from https://github.com/fd0/hackrf-one-pictures)
principal author: Michael Ossmann mike@ossmann.com
Description
Languages
KiCad
70.6%
C
26%
CMake
1%
Python
1%
Assembly
0.8%
Other
0.5%