aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-10-14 11:51:48 -0700
committerJosh Blum <josh@joshknows.com>2010-10-14 11:51:48 -0700
commit4582a2deb385c0a4849f5d20c44a5469779bcbb2 (patch)
treea9a939d44e33b82974f07002d66d51727b668429 /host/lib/usrp
parent376e22ca3bf25c8d6bb53cd987b245e5b79860f9 (diff)
downloaduhd-4582a2deb385c0a4849f5d20c44a5469779bcbb2.tar.gz
uhd-4582a2deb385c0a4849f5d20c44a5469779bcbb2.tar.bz2
uhd-4582a2deb385c0a4849f5d20c44a5469779bcbb2.zip
usrp2: move udp port initialization into mboard impl so its done before async registers are setup
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp10
-rw-r--r--host/lib/usrp/usrp2/mboard_impl.cpp16
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp3
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp2
4 files changed, 16 insertions, 15 deletions
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index 25fd1c484..8314cf9ae 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -242,16 +242,6 @@ void usrp2_impl::io_impl::recv_pirate_loop(
* Helper Functions
**********************************************************************/
void usrp2_impl::io_init(void){
- //send a small data packet so the usrp2 knows the udp source port
- BOOST_FOREACH(zero_copy_if::sptr data_transport, _data_transports){
- managed_send_buffer::sptr send_buff = data_transport->get_send_buff();
- static const boost::uint32_t data[2] = {
- uhd::htonx(boost::uint32_t(0 /* don't care seq num */)),
- uhd::htonx(boost::uint32_t(USRP2_INVALID_VRT_HEADER))
- };
- std::memcpy(send_buff->cast<void*>(), &data, sizeof(data));
- send_buff->commit(sizeof(data));
- }
//the assumption is that all data transports should be identical
const size_t num_recv_frames = _data_transports.front()->get_num_recv_frames();
diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp
index 5210eee94..8f3ae5c1b 100644
--- a/host/lib/usrp/usrp2/mboard_impl.cpp
+++ b/host/lib/usrp/usrp2/mboard_impl.cpp
@@ -21,6 +21,7 @@
#include <uhd/usrp/dsp_utils.hpp>
#include <uhd/usrp/mboard_props.hpp>
#include <uhd/utils/assert.hpp>
+#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/algorithm.hpp>
#include <uhd/types/mac_addr.hpp>
#include <uhd/types/dict.hpp>
@@ -38,13 +39,24 @@ using namespace uhd::usrp;
usrp2_mboard_impl::usrp2_mboard_impl(
size_t index,
transport::udp_simple::sptr ctrl_transport,
+ transport::zero_copy_if::sptr data_transport,
size_t recv_samps_per_packet,
- size_t send_bytes_per_packet,
const device_addr_t &flow_control_hints
):
_index(index),
_recv_samps_per_packet(recv_samps_per_packet)
{
+ //Send a small data packet so the usrp2 knows the udp source port.
+ //This setup must happen before further initialization occurs
+ //or the async update packets will cause ICMP destination unreachable.
+ transport::managed_send_buffer::sptr send_buff = data_transport->get_send_buff();
+ static const boost::uint32_t data[2] = {
+ uhd::htonx(boost::uint32_t(0 /* don't care seq num */)),
+ uhd::htonx(boost::uint32_t(USRP2_INVALID_VRT_HEADER))
+ };
+ std::memcpy(send_buff->cast<void*>(), &data, sizeof(data));
+ send_buff->commit(sizeof(data));
+
//make a new interface for usrp2 stuff
_iface = usrp2_iface::make(ctrl_transport);
@@ -98,7 +110,7 @@ usrp2_mboard_impl::usrp2_mboard_impl(
//setting the packets per update
const double ups_per_fifo = flow_control_hints.cast<double>("ups_per_fifo", 8);
- const size_t packets_per_up = size_t(usrp2_impl::sram_bytes/ups_per_fifo/send_bytes_per_packet);
+ const size_t packets_per_up = size_t(usrp2_impl::sram_bytes/ups_per_fifo/data_transport->get_send_frame_size());
_iface->poke32(U2_REG_TX_CTRL_PACKETS_PER_UP, U2_FLAG_TX_CTRL_UP_ENB | packets_per_up);
//init the ddc
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index e271f839c..afc69f703 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -171,9 +171,8 @@ usrp2_impl::usrp2_impl(
//create a new mboard handler for each control transport
for(size_t i = 0; i < ctrl_transports.size(); i++){
_mboards.push_back(usrp2_mboard_impl::sptr(new usrp2_mboard_impl(
- i, ctrl_transports[i],
+ i, ctrl_transports[i], data_transports[i],
this->get_max_recv_samps_per_packet(),
- _data_transports[i]->get_send_frame_size(),
flow_control_hints
)));
//use an empty name when there is only one mboard
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 3aa6e9cd5..2531bd6cb 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -84,8 +84,8 @@ public:
usrp2_mboard_impl(
size_t index,
uhd::transport::udp_simple::sptr,
+ uhd::transport::zero_copy_if::sptr,
size_t recv_samps_per_packet,
- size_t send_bytes_per_packet,
const uhd::device_addr_t &flow_control_hints
);
~usrp2_mboard_impl(void);