aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/rfnoc
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2016-08-09 17:48:29 -0700
committerMartin Braun <martin.braun@ettus.com>2016-08-09 17:48:29 -0700
commit19ebebbc7fdbf8d245579d43ed85af857c4591d2 (patch)
treecf0e8c33b01a41618ac4bf9503f03b04fbf5ba68 /host/lib/rfnoc
parent3114dc384cd1f87a5d0986a73b0a203b60383a0f (diff)
downloaduhd-19ebebbc7fdbf8d245579d43ed85af857c4591d2.tar.gz
uhd-19ebebbc7fdbf8d245579d43ed85af857c4591d2.tar.bz2
uhd-19ebebbc7fdbf8d245579d43ed85af857c4591d2.zip
rfnoc: Legacy compat tracks TX and RX spp values separately
Diffstat (limited to 'host/lib/rfnoc')
-rw-r--r--host/lib/rfnoc/legacy_compat.cpp54
1 files changed, 37 insertions, 17 deletions
diff --git a/host/lib/rfnoc/legacy_compat.cpp b/host/lib/rfnoc/legacy_compat.cpp
index 915432f22..843cdea34 100644
--- a/host/lib/rfnoc/legacy_compat.cpp
+++ b/host/lib/rfnoc/legacy_compat.cpp
@@ -126,13 +126,17 @@ public:
_num_rx_chans_per_radio(_has_ddcs ?
std::min(num_ports(_tree, RADIO_BLOCK_NAME, "out"), num_ports(_tree, DDC_BLOCK_NAME, "out"))
: num_ports(_tree, RADIO_BLOCK_NAME, "out")),
- _spp(get_block_ctrl<radio_ctrl>(0, RADIO_BLOCK_NAME, 0)->get_arg<int>("spp")),
+ _rx_spp(get_block_ctrl<radio_ctrl>(0, RADIO_BLOCK_NAME, 0)->get_arg<int>("spp")),
+ _tx_spp(_rx_spp),
_rx_channel_map(_num_mboards, std::vector<radio_port_pair_t>(_num_radios_per_board)),
_tx_channel_map(_num_mboards, std::vector<radio_port_pair_t>(_num_radios_per_board))
{
_device->clear();
check_available_periphs(); // Throws if invalid configuration.
setup_prop_tree();
+ if (_tree->exists("/mboards/0/mtu/send")) {
+ _tx_spp = (_tree->access<size_t>("/mboards/0/mtu/send").get() - MAX_BYTES_PER_HEADER) / BYTES_PER_SAMPLE;
+ }
connect_blocks();
if (args.has_key("skip_ddc")) {
UHD_LEGACY_LOG() << "[legacy_compat] Skipping DDCs by user request." << std::endl;
@@ -316,17 +320,31 @@ private: // methods
uhd::stream_args_t &args,
chan_map_t &chan_map
) {
- const size_t args_spp = args.args.cast<size_t>("spp", _spp);
- if (args.args.has_key("spp") and args_spp != _spp) {
- for (size_t mboard = 0; mboard < _num_mboards; mboard++) {
- for (size_t radio = 0; radio < _num_radios_per_board; radio++) {
- get_block_ctrl<radio_ctrl>(mboard, RADIO_BLOCK_NAME, radio)->set_arg<int>("spp", args_spp);
+ // If the user provides spp, that value is always applied. If it's
+ // different from what we thought it was, we need to update the blocks.
+ // If it's not provided, we provide our own spp value.
+ const size_t args_spp = args.args.cast<size_t>("spp", 0);
+ if (dir == uhd::RX_DIRECTION) {
+ if (args.args.has_key("spp") and args_spp != _rx_spp) {
+ for (size_t mboard = 0; mboard < _num_mboards; mboard++) {
+ for (size_t radio = 0; radio < _num_radios_per_board; radio++) {
+ get_block_ctrl<radio_ctrl>(mboard, RADIO_BLOCK_NAME, radio)->set_arg<int>("spp", args_spp);
+ }
}
+ _rx_spp = args_spp;
+ // TODO: Update flow control on the blocks
+ } else {
+ args.args["spp"] = str(boost::format("%d") % _rx_spp);
+ }
+ } else {
+ if (args.args.has_key("spp") and args_spp != _tx_spp) {
+ _tx_spp = args_spp;
+ // TODO: Update flow control on the blocks
+ } else {
+ args.args["spp"] = str(boost::format("%d") % _tx_spp);
}
- _spp = args_spp;
- } else if (dir == uhd::RX_DIRECTION) {
- args.args["spp"] = str(boost::format("%d") % _spp);
}
+
if (args.channels.empty()) {
args.channels = std::vector<size_t>(1, 0);
}
@@ -421,10 +439,10 @@ private: // methods
}
const size_t this_spp = get_block_ctrl<radio_ctrl>(i, RADIO_BLOCK_NAME, k)->get_arg<int>("spp");
- if (this_spp != _spp) {
+ if (this_spp != _rx_spp) {
throw uhd::runtime_error(str(
boost::format("[legacy compat] Radios have differing spp values: %s has %d, others have %d")
- % radio_block_id.to_string() % this_spp % _spp
+ % radio_block_id.to_string() % this_spp % _rx_spp
));
}
}
@@ -546,7 +564,8 @@ private: // methods
void connect_blocks()
{
_graph = _device->create_graph("legacy");
- size_t bpp = _spp * BYTES_PER_SAMPLE + MAX_BYTES_PER_HEADER;
+ const size_t rx_bpp = _rx_spp * BYTES_PER_SAMPLE + MAX_BYTES_PER_HEADER;
+ const size_t tx_bpp = _tx_spp * BYTES_PER_SAMPLE + MAX_BYTES_PER_HEADER;
for (size_t mboard = 0; mboard < _num_mboards; mboard++) {
for (size_t radio = 0; radio < _num_radios_per_board; radio++) {
// Tx Channels
@@ -555,14 +574,14 @@ private: // methods
_graph->connect(
block_id_t(mboard, DUC_BLOCK_NAME, radio), chan,
block_id_t(mboard, RADIO_BLOCK_NAME, radio), chan,
- bpp
+ tx_bpp
);
if (_has_dmafifo) {
// We have DMA FIFO *and* DUCs
_graph->connect(
block_id_t(mboard, DFIFO_BLOCK_NAME, 0), radio,
block_id_t(mboard, DUC_BLOCK_NAME, radio), chan,
- bpp
+ tx_bpp
);
}
} else if (_has_dmafifo) {
@@ -570,7 +589,7 @@ private: // methods
_graph->connect(
block_id_t(mboard, DFIFO_BLOCK_NAME, 0), radio,
block_id_t(mboard, RADIO_BLOCK_NAME, radio), chan,
- bpp
+ tx_bpp
);
}
}
@@ -580,7 +599,7 @@ private: // methods
_graph->connect(
block_id_t(mboard, RADIO_BLOCK_NAME, radio), chan,
block_id_t(mboard, DDC_BLOCK_NAME, radio), chan,
- bpp
+ rx_bpp
);
}
}
@@ -668,7 +687,8 @@ private: // attributes
const size_t _num_radios_per_board;
const size_t _num_tx_chans_per_radio;
const size_t _num_rx_chans_per_radio;
- size_t _spp;
+ size_t _rx_spp;
+ size_t _tx_spp;
chan_map_t _rx_channel_map;
chan_map_t _tx_channel_map;