aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/x300
diff options
context:
space:
mode:
authorPaul David <paul.david@ettus.com>2016-05-13 12:02:49 -0700
committerPaul David <paul.david@ettus.com>2016-05-19 09:32:13 -0700
commit6842e836e17d782bb13e0958de543478298c73d7 (patch)
tree7b22f510127fe87c5e775d708f5e32682fba33ca /host/lib/usrp/x300
parent4e8aaaeb8c767ad444a7afa67993e74d3fef0d90 (diff)
downloaduhd-6842e836e17d782bb13e0958de543478298c73d7.tar.gz
uhd-6842e836e17d782bb13e0958de543478298c73d7.tar.bz2
uhd-6842e836e17d782bb13e0958de543478298c73d7.zip
x300: Fixed an issue where the wrong XB port was being selected
- If there were duplicate IPs in the mboard eeprom, the last one would be selected instead of the first - The default IP addresses (used for the case where the mboard eeprom can't be read) would overwrite the previous settings - Added a warning for duplicate IP entries in the mboard eeprom
Diffstat (limited to 'host/lib/usrp/x300')
-rw-r--r--host/lib/usrp/x300/x300_impl.cpp61
1 files changed, 43 insertions, 18 deletions
diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp
index 5930d873c..85deaee90 100644
--- a/host/lib/usrp/x300/x300_impl.cpp
+++ b/host/lib/usrp/x300/x300_impl.cpp
@@ -402,10 +402,19 @@ void x300_impl::mboard_members_t::discover_eth(
// Index the MB EEPROM addresses
std::vector<std::string> mb_eeprom_addrs;
- mb_eeprom_addrs.push_back(mb_eeprom["ip-addr0"]);
- mb_eeprom_addrs.push_back(mb_eeprom["ip-addr1"]);
- mb_eeprom_addrs.push_back(mb_eeprom["ip-addr2"]);
- mb_eeprom_addrs.push_back(mb_eeprom["ip-addr3"]);
+ const size_t num_mb_eeprom_addrs = 4;
+ for (size_t i = 0; i < num_mb_eeprom_addrs; i++) {
+ const std::string key = "ip-addr" + boost::to_string(i);
+
+ // Show a warning if there exists duplicate addresses in the mboard eeprom
+ if (std::find(mb_eeprom_addrs.begin(), mb_eeprom_addrs.end(), mb_eeprom[key]) != mb_eeprom_addrs.end()) {
+ UHD_MSG(warning) << str(boost::format(
+ "Duplicate IP address %s found in mboard EEPROM. "
+ "Device may not function properly.\nView and reprogram the values "
+ "using the usrp_burn_mb_eeprom utility.\n") % mb_eeprom[key]);
+ }
+ mb_eeprom_addrs.push_back(mb_eeprom[key]);
+ }
BOOST_FOREACH(const std::string& addr, ip_addrs) {
x300_eth_conn_t conn_iface;
@@ -422,22 +431,38 @@ void x300_impl::mboard_members_t::discover_eth(
} else {
conn_iface.type = X300_IFACE_ETH1;
}
+ break;
}
}
- // Check default IP addresses
- if (addr == boost::asio::ip::address_v4(
- boost::uint32_t(X300_DEFAULT_IP_ETH0_1G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH0;
- } else if (addr == boost::asio::ip::address_v4(
- boost::uint32_t(X300_DEFAULT_IP_ETH1_1G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH1;
- } else if (addr == boost::asio::ip::address_v4(
- boost::uint32_t(X300_DEFAULT_IP_ETH0_10G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH0;
- } else if (addr == boost::asio::ip::address_v4(
- boost::uint32_t(X300_DEFAULT_IP_ETH1_10G)).to_string()) {
- conn_iface.type = X300_IFACE_ETH1;
+ // Check default IP addresses if we couldn't
+ // determine the IP from the mboard eeprom
+ if (conn_iface.type == X300_IFACE_NONE) {
+ UHD_MSG(warning) << str(boost::format(
+ "Address %s not found in mboard EEPROM. Address may be wrong or "
+ "the EEPROM may be corrupt.\n Attempting to continue with default "
+ "IP addresses.\n") % conn_iface.addr
+ );
+
+ if (addr == boost::asio::ip::address_v4(
+ boost::uint32_t(X300_DEFAULT_IP_ETH0_1G)).to_string()) {
+ conn_iface.type = X300_IFACE_ETH0;
+ } else if (addr == boost::asio::ip::address_v4(
+ boost::uint32_t(X300_DEFAULT_IP_ETH1_1G)).to_string()) {
+ conn_iface.type = X300_IFACE_ETH1;
+ } else if (addr == boost::asio::ip::address_v4(
+ boost::uint32_t(X300_DEFAULT_IP_ETH0_10G)).to_string()) {
+ conn_iface.type = X300_IFACE_ETH0;
+ } else if (addr == boost::asio::ip::address_v4(
+ boost::uint32_t(X300_DEFAULT_IP_ETH1_10G)).to_string()) {
+ conn_iface.type = X300_IFACE_ETH1;
+ } else {
+ throw uhd::assertion_error(str(boost::format(
+ "X300 Initialization Error: Failed to match address %s with "
+ "any addresses for the device. Please check the address.")
+ % conn_iface.addr
+ ));
+ }
}
// Save to a vector of connections
@@ -459,7 +484,7 @@ void x300_impl::mboard_members_t::discover_eth(
catch(std::exception &)
{
throw uhd::io_error(str(boost::format(
- "X300 Initialization: Invalid address %s")
+ "X300 Initialization Error: Invalid address %s")
% conn_iface.addr));
}
eth_conns.push_back(conn_iface);