Added new, shorter, timeout for samples transfer. Properly handle incomplete transfers.

git-svn-id: http://yate.null.ro/svn/yate/trunk@6067 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
marian 2015-11-19 15:15:01 +00:00
parent 5c99a83aef
commit 9802fbbc52
2 changed files with 26 additions and 5 deletions

View File

@ -74,16 +74,25 @@
; debug_level: libusb debug level
; Default to 0 (no debug messages)
; Currently libusb defines the follwing levels:
; 1: ERROR, 2: WARNING, 3: INFO, 4: DEBUG
;debug_level=0
; sync_transfer_timeout: integer: Sync transfer timeout in milliseconds
; This parameter is applied on device creation
; This parameter is used when transferring radio data (samples)
; Allowed interval: [20 .. 500]
; Defaults to 50
;sync_transfer_timeout=50
; ctrl_transfer_timeout: integer: Control transfer timeout in milliseconds
; This parmeter is applied on device creation
; This parameter is applied on device creation
; Allowed interval: [200 .. 2000]
; Defaults to 500
;ctrl_transfer_timeout=500
; bulk_transfer_timeout: integer: Bulk transfer timeout in milliseconds
; This parmeter is applied on device creation
; This parameter is applied on device creation
; Allowed interval: [200 .. 2000]
; Defaults to 500
;bulk_transfer_timeout=500

View File

@ -189,6 +189,7 @@ static inline double brfRxDcOffset(double val)
#define BRF_FPGA_CORR_MAX 4096
// libusb defaults
#define LUSB_SYNC_TIMEOUT 50 // Sync transfer timeout def val (in milliseconds)
#define LUSB_CTRL_TIMEOUT 500 // Control transfer timeout def val (in milliseconds)
#define LUSB_BULK_TIMEOUT 500 // Bulk transfer timeout def val (in milliseconds)
@ -1559,7 +1560,7 @@ private:
String* error = 0) {
m_txIO.syncFlags = flagsTx;
m_rxIO.syncFlags = flagsRx;
unsigned int intervals = (m_bulkTout / Thread::idleMsec()) + 1;
unsigned int intervals = (m_syncTout / Thread::idleMsec()) + 1;
unsigned int status = 0;
while (m_txIO.syncFlags || m_rxIO.syncFlags) {
Thread::idle();
@ -1603,6 +1604,7 @@ private:
DataBlock m_calCache;
//
NamedList m_calibration; // Calibration parameters
unsigned int m_syncTout; // Sync transfer timeout (in milliseconds)
unsigned int m_ctrlTout; // Control transfer timeout (in milliseconds)
unsigned int m_bulkTout; // Bulk transfer timeout (in milliseconds)
int m_altSetting;
@ -1949,6 +1951,7 @@ static const String s_ifcCmds[] = {
"vgagain","correction","lmswrite",
"bufoutput","rxdcoutput","txpattern","show",""};
// libusb
static unsigned int s_lusbSyncTransferTout = LUSB_SYNC_TIMEOUT; // Sync transfer timeout def val (in milliseconds)
static unsigned int s_lusbCtrlTransferTout = LUSB_CTRL_TIMEOUT; // Control transfer timeout def val (in milliseconds)
static unsigned int s_lusbBulkTransferTout = LUSB_BULK_TIMEOUT; // Bulk transfer timeout def val (in milliseconds)
@ -2110,7 +2113,13 @@ static void lusbTransferCb(libusb_transfer* transfer)
if (!t)
return;
Lock lck(t);
t->status = BrfLibUsbDevice::lusbCheckSuccess(transfer->status,&t->error);
if (transfer->status == LIBUSB_TRANSFER_COMPLETED &&
transfer->length != transfer->actual_length) {
t->status = RadioInterface::HardwareIOError;
t->error.printf("Incomplete transfer %u/%u",transfer->actual_length,transfer->length);
}
else
t->status = BrfLibUsbDevice::lusbCheckSuccess(transfer->status,&t->error);
t->running(false);
}
@ -2288,6 +2297,7 @@ BrfLibUsbDevice::BrfLibUsbDevice(BrfInterface* owner)
m_devSpeed(LIBUSB_SPEED_HIGH),
m_ctrlTransferPage(0),
m_calibration(""),
m_syncTout(s_lusbSyncTransferTout),
m_ctrlTout(s_lusbCtrlTransferTout),
m_bulkTout(s_lusbBulkTransferTout),
m_altSetting(BRF_ALTSET_INVALID),
@ -4561,7 +4571,7 @@ unsigned int BrfLibUsbDevice::syncTransfer(int ep, uint8_t* data, unsigned int l
t.running(true);
unsigned int cStatus = 0;
bool checkCancelled = !m_closingDevice;
if (t.fillBulk(data,len,m_bulkTout) && t.submit()) {
if (t.fillBulk(data,len,m_syncTout) && t.submit()) {
while (t.running()) {
struct timeval tv;
tv.tv_usec = 3 * Thread::idleUsec();
@ -7526,6 +7536,8 @@ void BrfModule::initialize()
installRelay(RadioCreate,"radio.create",gen.getIntValue("priority",90));
}
lusbSetDebugLevel();
s_lusbSyncTransferTout = lusb.getIntValue(YSTRING("sync_transfer_timeout"),
LUSB_SYNC_TIMEOUT,20,500);
s_lusbCtrlTransferTout = lusb.getIntValue(YSTRING("ctrl_transfer_timeout"),
LUSB_CTRL_TIMEOUT,200,2000);
s_lusbBulkTransferTout = lusb.getIntValue(YSTRING("bulk_transfer_timeout"),