HELP!!! Виснет Usbhub.sys
От: XorNeT  
Дата: 11.03.05 11:36
Оценка:
Мой драйвер находится в ЮСБ стеке над usbhub/usbd. Щбщение производится с помощью нехитрой ф-ции от Walter Oney -SendAwaitUrb();

Суть которой за вычетом некоторых проверок и деталей

NTSTATUS SendAwaitUrb(PDEVICE_OBJECT fdo, PURB urb)
{                            
    PAGED_CODE();
    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

    KEVENT event;
    KeInitializeEvent(&event, NotificationEvent, FALSE);

    IO_STATUS_BLOCK iostatus;
    PIRP IntIrp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
        pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE, &event, &iostatus);

    PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(IntIrp);
    stack->Parameters.Others.Argument1 = (PVOID) urb;
    NTSTATUS status = IoCallDriver(pdx->LowerDeviceObject, IntIrp);
    if (status == STATUS_PENDING)
        {
            KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
                            KdPrint(("Bus driver completes URB\n"));
            status = iostatus.Status;
            
        }
    return status;
}


Собственно проблема: во время запрашивания данных с помощью URB_BULK_OR_INTERRUPT_TRANSFER в произвольном месте (данные читаются/пишутся постоянно а глюкнуть может как на 100й транзакции так и на 4000й а может и не глюкнуть) как правило когда размер данных максимален в моем случае 4к KeWaitforSingleObject() не возвращается т.е драйвер шины Урб не комплитит. Кто знает как помочь горю.
Re: HELP!!! Виснет Usbhub.sys
От: Sergei I. Gorelkin Россия  
Дата: 11.03.05 13:37
Оценка:
Здравствуйте, XorNeT, Вы писали:

<skipped>

Ну как тут помочь... По идее нужно ждать event не бесконечно, а ограниченное время, по истечении которого отменять запрос, освобождать связанные с ним ресурсы и возвращать ошибку. А после этого — когда не нужно перезагружаться после каждого сбоя — уже разбираться, почему происходит таймаут. Может быть, железка при интенсивной передаче не успевает вовремя принять in-token или вернуть статус...
Re: HELP!!! Виснет Usbhub.sys
От: randomNick Латвия  
Дата: 21.03.05 14:21
Оценка:
Здравствуйте, XorNeT, Вы писали:

XNT>Мой драйвер находится в ЮСБ стеке над usbhub/usbd. Щбщение производится с помощью нехитрой ф-ции от Walter Oney -SendAwaitUrb();



XNT>Собственно проблема: во время запрашивания данных с помощью URB_BULK_OR_INTERRUPT_TRANSFER в произвольном месте (данные читаются/пишутся постоянно а глюкнуть может как на 100й транзакции так и на 4000й а может и не глюкнуть) как правило когда размер данных максимален в моем случае 4к KeWaitforSingleObject() не возвращается т.е драйвер шины Урб не комплитит. Кто знает как помочь горю.


Два возможные причины —
1 данные посылаются слишком быстро, USB устройство не успевает принять следующий пакет Также устройство может посылает данные в тот момент, когда PC драивер не имеет ожидающего запроса на чтение
2 если посылается блок длиной кратой 64 байта (полный пакет) и он не завершается пакетом нулевой длины, тоже могут быть проблемы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.