aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-10-11 18:09:56 -0700
committerJosh Blum <josh@joshknows.com>2010-10-11 18:09:56 -0700
commit1314feb429b8c2713d9fd0e9da077825d0a9c3bc (patch)
treea5ba6e1396fe0f444f6e0f1287f8740deecf9da6 /host
parent453b450aa2f40f1ab3689855654fd2167f554ccc (diff)
downloaduhd-1314feb429b8c2713d9fd0e9da077825d0a9c3bc.tar.gz
uhd-1314feb429b8c2713d9fd0e9da077825d0a9c3bc.tar.bz2
uhd-1314feb429b8c2713d9fd0e9da077825d0a9c3bc.zip
usrp2: use 32-bit flow control sequence numbers
Diffstat (limited to 'host')
-rw-r--r--host/include/uhd/types/metadata.hpp4
-rw-r--r--host/lib/usrp/usrp2/fw_common.h2
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp29
3 files changed, 15 insertions, 20 deletions
diff --git a/host/include/uhd/types/metadata.hpp b/host/include/uhd/types/metadata.hpp
index 65952941c..96c4ad0d3 100644
--- a/host/include/uhd/types/metadata.hpp
+++ b/host/include/uhd/types/metadata.hpp
@@ -130,7 +130,7 @@ namespace uhd{
/*!
* Event codes:
- * - success: a packet was successfully transmitted
+ * - eob ack: an eob packet was successfully transmitted
* - underflow: an internal send buffer has emptied
* - sequence error: packet loss between host and device
* - time error: packet had time that was late (or too early)
@@ -138,7 +138,7 @@ namespace uhd{
* - sequence error in burst: packet loss within a burst
*/
enum event_code_t {
- EVENT_CODE_SUCCESS = 0x1,
+ EVENT_CODE_EOB_ACK = 0x1,
EVENT_CODE_UNDERFLOW = 0x2,
EVENT_CODE_SEQ_ERROR = 0x4,
EVENT_CODE_TIME_ERROR = 0x8,
diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h
index 783e5c772..2cd3ee595 100644
--- a/host/lib/usrp/usrp2/fw_common.h
+++ b/host/lib/usrp/usrp2/fw_common.h
@@ -33,7 +33,7 @@ extern "C" {
#endif
//fpga and firmware compatibility numbers
-#define USRP2_FPGA_COMPAT_NUM 2
+#define USRP2_FPGA_COMPAT_NUM 3
#define USRP2_FW_COMPAT_NUM 7
//used to differentiate control packets over data port
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index 6d5eb488c..2d1ebe57b 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -49,13 +49,14 @@ static const size_t vrt_send_header_offset_words32 = 1;
**********************************************************************/
class flow_control_monitor{
public:
+ typedef boost::uint32_t seq_type;
typedef boost::shared_ptr<flow_control_monitor> sptr;
/*!
* Make a new flow control monitor.
* \param max_seqs_out num seqs before throttling
*/
- flow_control_monitor(size_t max_seqs_out){
+ flow_control_monitor(seq_type max_seqs_out){
_last_seq_out = 0;
_last_seq_ack = 0;
_max_seqs_out = max_seqs_out;
@@ -67,7 +68,7 @@ public:
* \param timeout the timeout in seconds
* \return false on timeout
*/
- UHD_INLINE bool check_fc_condition(boost::uint16_t seq, double timeout){
+ UHD_INLINE bool check_fc_condition(seq_type seq, double timeout){
boost::unique_lock<boost::mutex> lock(_fc_mutex);
_last_seq_out = seq;
return _fc_cond.timed_wait(
@@ -81,7 +82,7 @@ public:
* Update the flow control condition.
* \param seq the last sequence number to be ACK'd
*/
- UHD_INLINE void update_fc_condition(boost::uint16_t seq){
+ UHD_INLINE void update_fc_condition(seq_type seq){
boost::unique_lock<boost::mutex> lock(_fc_mutex);
_last_seq_ack = seq;
lock.unlock();
@@ -90,17 +91,12 @@ public:
private:
bool ready(void){
- //return true;
- //std::cout << "_last_seq_out " << _last_seq_out << std::endl;
- //std::cout << "_last_seq_ack " << _last_seq_ack << std::endl;
- //std::cout << "boost::uint16_t(_last_seq_out -_last_seq_ack) " << boost::uint16_t(_last_seq_out -_last_seq_ack) << std::endl;
- return boost::uint16_t(_last_seq_out -_last_seq_ack) < boost::uint16_t(_max_seqs_out);
+ return seq_type(_last_seq_out -_last_seq_ack) < _max_seqs_out;
}
boost::mutex _fc_mutex;
boost::condition _fc_cond;
- boost::uint16_t _last_seq_out, _last_seq_ack;
- size_t _max_seqs_out;
+ seq_type _last_seq_out, _last_seq_ack, _max_seqs_out;
};
/***********************************************************************
@@ -141,16 +137,15 @@ struct usrp2_impl::io_impl{
){
UHD_ASSERT_THROW(trans.size() == buffs.size());
- //calculate the 16-bit sequence number for the special header
- const boost::uint16_t seq_num = boost::uint16_t(packet_handler_send_state.next_packet_seq & 0xffff);
- const boost::uint32_t fc_word32 = uhd::htonx(boost::uint32_t(seq_num));
+ //calculate the flow control word
+ const boost::uint32_t fc_word32 = packet_handler_send_state.next_packet_seq;
//grab a managed buffer for each index
for (size_t i = 0; i < buffs.size(); i++){
- if (not fc_mons[i]->check_fc_condition(seq_num, timeout)) return false;
+ if (not fc_mons[i]->check_fc_condition(fc_word32, timeout)) return false;
buffs[i] = trans[i]->get_send_buff(timeout);
if (not buffs[i].get()) return false;
- buffs[i]->cast<boost::uint32_t *>()[0] = fc_word32;
+ buffs[i]->cast<boost::uint32_t *>()[0] = uhd::htonx(fc_word32);
}
return true;
}
@@ -209,8 +204,8 @@ void usrp2_impl::io_impl::recv_pirate_loop(
//catch the flow control packets and react
if (metadata.event_code == 0){
- boost::uint32_t fc_word32 = uhd::ntohx((vrt_hdr + if_packet_info.num_header_words32)[1]);
- this->fc_mons[index]->update_fc_condition(fc_word32 & 0xffff);
+ boost::uint32_t fc_word32 = (vrt_hdr + if_packet_info.num_header_words32)[1];
+ this->fc_mons[index]->update_fc_condition(uhd::ntohx(fc_word32));
continue;
}