День добрый.
Проблема в следующем. Во время запроса данных с USB устройства (IN-пакеты), через функции usb_fill_bulk_urb()/usb_submit_urb(), у меня перезаписывается входной буфер последним отправленным пакетом с устройства. Это происходит если пакеты были отправлены один за другим через достаточно короткий промежуток времени. То, что все пакеты доставляются на хост я вижу (работаю через виртуальную машину). Запрос на устройство делаю в контексте read (fops) драйвера раз в сек через 'tail -f /dev/usb_device'.
Существует ли метод, чтобы избежать потерь пакетов, кроме того, как тупо увеличить частоту обращения к функции usb_submit_urb...? Или это специфика для BULK передач?
static void read_bulk_callback(struct urb *urb)
{
struct usb_skel *dev;
dev = urb->context;
/* sync/async unlink faults aren't errors */
if (urb->status &&
!(urb->status == -ENOENT ||
urb->status == -ECONNRESET ||
urb->status == -ESHUTDOWN)) {
dbg("%s - nonzero write bulk status received: %d",
__FUNCTION__, urb->status);
}else
{
dev->bulk_in_len = urb->actual_length;
}
}
.....
// prepare URB
usb_fill_bulk_urb( urb, dev->udev,
usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
dev->bulk_in_buffer, dev->bulk_in_size, read_bulk_callback, dev );
// send request to device
result = usb_submit_urb( urb, GFP_KERNEL );
if( result == 0 && dev->bulk_in_len != 0 )
if (copy_to_user(buffer, dev->bulk_in_buffer, dev->bulk_in_len)) result = -EFAULT;
else { result = dev->bulk_in_len; dev->bulk_in_len = 0; }