- Remove uhd-builder-fedora41.Dockerfile (EOL)
- Add uhd-builder-fedora44.Dockerfile based on fedora:44
- Use --root-user-action=ignore for pip invocations
- Build-tested with GCC 16.1.1 and Python 3.14.4
In rare cases it was observed that the power good bits of the mixer
chips used in HBX show `1` already before they are really up. That could
cause the power-up sequence to continue even though those chips are not
yet up which needs to be avoided. This is accomplished by querying the
PG bits twice before and evaluating both, so any short glitches get
ironed out.
In addition, because the code for ADMV1420 and 1320 was similar enough,
it was changed to be a bit shorter and more pythonic.
When using X420/X440 via their QSFP28 interfaces, an MPM reboot due to
clocking changes may cause timeout errors because the QSFP28 interfaces
are cycling down and up again during the MPM reboot and the connection
gets lost for some time. This commit adds a note about this and how to
circumvent this.
The SPI flash BiSTs can only run for X410 as only the X410
daughterboards have a flash memory on them. There is a check for that in
the tests already, but if they aren't running on X410 they used to
return `False` indicating some kind of error. But since it is not an
error if a test tries to test something that is definitely not there on
a different device it now only reports that but returns `True` to not
cause confusion for X420/X440 users.
sim_find.cpp: Python 3.14's pyconfig.h redefines _POSIX_C_SOURCE and
_XOPEN_SOURCE to older values, but only if they haven't been defined yet.
Moving <Python.h> to be the first include (before any system header that
pulls in features.h via <string>) prevents the -Wmacro-redefinition
warnings that become errors under -Werror.
usrprio_rpc_client.cpp: Value-initialize usrprio_device_info to silence
-Wmaybe-uninitialized on the interface_num member, caught by GCC 16.
GCC 16 eagerly instantiates std::_Sp_counted_ptr_inplace<chdr_ctrl_xport>
in every TU that includes chdr_ctrl_xport.hpp with the inline make()
definition. This causes the destructor to be referenced in TUs that do
not link against chdr_ctrl_xport.cpp (e.g. client_zero_test), resulting
in undefined reference linker errors.
Fix by moving make() from the inline header definition into the .cpp
file, so std::make_shared<chdr_ctrl_xport> is only instantiated where
~chdr_ctrl_xport() is also defined.
GCC 16 emits a spurious -Warray-bounds warning when std::make_shared
uses placement new into its internal control block buffer. This causes
build failures in client_zero_test.cpp and mb_controller_test.cpp.
Suppress the warning with #pragma GCC diagnostic around the affected
std::make_shared calls, guarded by __GNUC__ >= 16 to leave older
compilers unaffected.
Fixes: https://github.com/EttusResearch/uhd/issues/923
On Linux, ICMP "Port Unreachable" is silently dropped on unconnected
UDP sockets but reported on connected sockets (ECONNREFUSED). Windows
reports WSAECONNRESET (10054) on all UDP sockets by default, breaking
device discovery when non-USRP hosts are on the subnet.
Apply SIO_UDP_CONNRESET=FALSE only for unconnected (broadcast) sockets,
leaving error reporting intact for connected sockets.
Originally, when the command time was changed, this triggered
programming experts in TX and RX direction. This caused long execution
times of any setters that were called at the same time (e.g.
set_*x_gain()). With this change, the calls with and without command
time are more on par. In HBX, the command time was used in an expert
where it was not necessary at all, so this has been removed, too.
The regular expression used to validate the mpm shell output uses
backslash characters but does not escape them. Prepended the string
with "r" so that it is treated as a raw string.
This changes the TX gain tables for HBX in the range between 9 and 20
GHz to avoid overshoots that could occur otherwise when changing gains
especially from gain index 38 to 39.
This adds a basic check for the correct format of Doxygen comments.
Since there were comments that started with `//!` and continued in the
next line with `//`, but Doxygen only used the first line, this ensures
that there aren't any such comments anymore. Refer to the coding
guidelines to see the correct format for documentation in the code.
This enables the ref_clk_calibration_iface discoverable feature in
Python. It can be used like this:
```python
mb_ctrl = graph.get_mb_controller(0)
ref_cal = mb_ctrl.get_ref_clk_calibration()
ref_cal.set_ref_clk_tuning_word(0x24a)
word = ref_cal.get_ref_clk_tuning_word()
ref_cal.store_ref_clk_tuning_word(word)
```
This feature is also exposed as a devtest.
The previous value of 20 ms caused spurious timeout errors under load.
The ZBX LO lock consistently completes within 30 ms in integration
testing. 50 ms provides adequate margin without masking genuine LO lock
failures.
After FPGA image reload, the FPGA resets its CHDR sequence counter to
zero. Stale ACKs from the old session can then arrive with a seq_num
matching a pending request in the new session.
Tighten the match check: also require op_code, address, and (for
WRITE/BLOCK_WRITE) data payload to agree. Mismatches are dropped and
ctrl_out_of_sequence is incremented. Add unit tests for both mismatch
cases.
These time functions are specific to libusb1_zero_copy, which is used
for B2xx USB streaming. These functions are rarely used, don't compile
when enabled, and rely on Boost. If we ever need them again, we'll need
to put them back in using std equivalents.
The logging macros are not affected.
This is an API change, because the logging_info object is modified, and
this object is part of uhd::_log::log. However, neither of those objects
are supposed to be used directly, the only correct usage of those is via
the logging macros.
The exception is uhd::log::add_logger(). To not break the add_logger()
API, we create a backward compatibility layer and provide an add_logger()
API call that still supports the old version (that uses
boost::posix_time).
This fixes many documentation issues where in the Doxygen output
sentences were incomplete and information was missing that is there in
the source files actually.
- boost::optional is replaced by std::optional
- In public APIs, boost::optional is still usable, but it is declared
deprecated. That means this is no API break (but it is an ABI break).
- Within the library portion (host/lib/**) there is no more usage of
boost::optional. Some backward-compatibility code (in actions.cpp and
ctrlport_endpoint.cpp) was moved out to the header.
Note: The most difficult replacement was that for
parse_log_level_from_string(), where boost::optional is the return
value. To retain API compatibility, we had to create a helper function.