aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael West <michael.west@ettus.com>2019-03-04 17:54:35 -0800
committerMichael West <michael.west@ettus.com>2019-03-05 10:34:21 -0800
commit7ccc535e10c0e22c59e50a4198e916e920042657 (patch)
tree3912aecbf23ae82cbcc6113e4b727651f870da06
parent5b29b95de8219e8da26fd6c3e2b4a735caaf4374 (diff)
downloaduhd-7ccc535e10c0e22c59e50a4198e916e920042657.tar.gz
uhd-7ccc535e10c0e22c59e50a4198e916e920042657.tar.bz2
uhd-7ccc535e10c0e22c59e50a4198e916e920042657.zip
Revert "RFNoC: Fix flush in source_block_ctrl_base"
This reverts commit 655b9b0f8e8f8556d434404da51aaccd124bbc3a. Signed-off-by: Michael West <michael.west@ettus.com>
-rw-r--r--host/include/uhd/rfnoc/block_ctrl_base.hpp6
-rw-r--r--host/lib/rfnoc/source_block_ctrl_base.cpp19
2 files changed, 21 insertions, 4 deletions
diff --git a/host/include/uhd/rfnoc/block_ctrl_base.hpp b/host/include/uhd/rfnoc/block_ctrl_base.hpp
index df3fab02e..0bf701810 100644
--- a/host/include/uhd/rfnoc/block_ctrl_base.hpp
+++ b/host/include/uhd/rfnoc/block_ctrl_base.hpp
@@ -372,9 +372,6 @@ protected:
// than reset register SR_CLEAR_TX_FC.
virtual void _clear(const size_t port = 0);
- //! Flush any in-flight packets for this block
- bool _flush(const size_t port = 0);
-
//! Override this function if your block needs to specially handle
// setting the command time
virtual void _set_command_time(
@@ -407,6 +404,9 @@ private:
//! Helper to start flushing for this block
void _start_drain(const size_t port = 0);
+ //! Helper to flush any in-flight packets for this block
+ bool _flush(const size_t port = 0);
+
/***********************************************************************
* Private members
**********************************************************************/
diff --git a/host/lib/rfnoc/source_block_ctrl_base.cpp b/host/lib/rfnoc/source_block_ctrl_base.cpp
index 994d66380..656ab26af 100644
--- a/host/lib/rfnoc/source_block_ctrl_base.cpp
+++ b/host/lib/rfnoc/source_block_ctrl_base.cpp
@@ -102,7 +102,24 @@ void source_block_ctrl_base::configure_flow_control_out(const bool enable_fc_out
% buf_size_bytes % unique_id()));
}
- _flush(block_port);
+ // Disable flow control entirely and let all upstream data flush out
+ // We need to do this every time the window is changed because
+ // a) We don't know what state the flow-control module was left in
+ // in the previous run (it should still be enabled)
+ // b) Changing the window size where data is buffered upstream may
+ // result in stale packets entering the stream.
+ sr_write(SR_FLOW_CTRL_EN, 0, block_port);
+
+ // Wait for data to flush out.
+ // In the FPGA we are guaranteed that all buffered packets are more-or-less
+ // consecutive. 1ms@200MHz = 200,000 cycles of "flush time". 200k cycles = 200k * 8
+ // bytes (64 bits) = 1.6MB of data that can be flushed. Typically in the FPGA we have
+ // buffering in the order of kilobytes so waiting for 1MB to flush is more than enough
+ // time.
+ // TODO: Enhancement. We should get feedback from the FPGA about when the
+ // source_flow_control
+ // module is done flushing.
+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
// Enable source flow control module and conditionally enable byte based and/or packet
// count based flow control