diff options
author | Paul David <paul.david@ettus.com> | 2016-05-13 12:02:49 -0700 |
---|---|---|
committer | Paul David <paul.david@ettus.com> | 2016-05-19 09:32:13 -0700 |
commit | 6842e836e17d782bb13e0958de543478298c73d7 (patch) | |
tree | 7b22f510127fe87c5e775d708f5e32682fba33ca | |
parent | 4e8aaaeb8c767ad444a7afa67993e74d3fef0d90 (diff) | |
download | uhd-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
-rw-r--r-- | host/lib/usrp/x300/x300_impl.cpp | 61 |
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); |