diff options
Diffstat (limited to 'host/lib/usrp')
| -rw-r--r-- | host/lib/usrp/b200/b200_impl.cpp | 27 | 
1 files changed, 18 insertions, 9 deletions
diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp index a034ef632..239bd97b1 100644 --- a/host/lib/usrp/b200/b200_impl.cpp +++ b/host/lib/usrp/b200/b200_impl.cpp @@ -536,18 +536,27 @@ b200_impl::b200_impl(const uhd::device_addr_t& device_addr, usb_device_handle::s              << " is too large. It will be set to "              << B200_USB_DATA_MAX_RECV_FRAME_SIZE << ".";          recv_frame_size = B200_USB_DATA_MAX_RECV_FRAME_SIZE; -    } else if (recv_frame_size % max_transfer == 0) { +    } else if (recv_frame_size % max_transfer == 0 or recv_frame_size % 8 != 0) {          // The Cypress FX3 does not properly handle recv_frame_sizes that are -        // aligned to the maximum transfer size.  The code below coerces the -        // recv_frame_size down to a value that is not a multiple of of the -        // maximum transfer size and aligns to full 8 byte words for sc8, sc12, -        // and sc16 data types for best performance on the FPGA. -        recv_frame_size = (((recv_frame_size - 16) / 24) * 24) + 16; +        // aligned to the maximum transfer size and the FPGA code requires the +        // data to be aligned to 8 byte words.  The code below coerces the +        // recv_frame_size to a value that is a multiple of 8 bytes, not +        // a multiple of the maximum transfer size, and aligned to 24 bytes +        // to support full 8 byte word alignment for sc8, sc12, and sc16 data +        // types. + +        // Align to 8 byte words +        recv_frame_size += 8 - (recv_frame_size % 8); +        if (recv_frame_size % max_transfer == 0) { +            recv_frame_size = (((recv_frame_size - 16) / 24) * 24) + 16; +        }          UHD_LOGGER_WARNING("B200") -            << "Multiples of 512 not supported for recv_frame_size. " -            << "Requested recv_frame_size of " << device_addr["recv_frame_size"] -            << " reduced to " << recv_frame_size << "."; +            << "The recv_frame_size must be a multiple of 8 bytes and not a multiple of " +            << max_transfer << " bytes.  Requested recv_frame_size of " +            << device_addr["recv_frame_size"] +            << " coerced to " << recv_frame_size << ".";      } +      data_xport_args["recv_frame_size"] = std::to_string(recv_frame_size);      data_xport_args["num_recv_frames"] = device_addr.get("num_recv_frames", "16");      data_xport_args["send_frame_size"] = device_addr.get("send_frame_size", std::to_string(B200_USB_DATA_DEFAULT_FRAME_SIZE));  | 
