From: Stanislav Petrenko on
The problem was in firmware. Due to USB DFU spec the second reset should not
bring device back into Run-Time mode. It is too early and device is not yet
in the state that allows that. The firmware is fixed accordingly.

Your answer saved my time because I burdened firmware developers instead of
changing the code. So now I just ignore that two reset packets are actually
sent through the bus.

:-)

--
Thanks, Stanislav.


"Doron Holan [MS]" wrote:

> what was the problem?
>
> --
> Please do not send e-mail directly to this alias. this alias is for
> newsgroup purposes only.
> This posting is provided "AS IS" with no warranties, and confers no rights.
>
>
> "Stanislav Petrenko" <StanislavPetrenko(a)discussions.microsoft.com> wrote in
> message news:5D002FE2-D10F-43D3-9A47-4A1732684D67(a)microsoft.com...
> > The issue is solved. Thanks a lot.
> >
> > :-)
> >
> > --
> > Thanks, Stanislav.
> >
> >
> > "Stanislav Petrenko" wrote:
> >
> >> Hi Doron,
> >>
> >> Thanks for reply.
> >>
> >> The behavior is observed on the Windows XP SP1. I see it on both USB 1.1
> >> and
> >> 2.0.
> >> In the USB trace I see
> >> Suspend
> >> Reset
> >> Get Descriptor
> >> Reset
> >> Set Address
> >> Get Descriptor
> >> Get Descriptor
> >> and so on...
> >>
> >> The time between two reset packets is small, less than 100 milliseconds.
> >> So
> >> if DFU DETACH request is accepted and DFU mode is activated, the second
> >> reset
> >> puts device back into Run-Time mode.
> >>
> >> ---
> >>
> >> The code for device reset is actually very simple and I am sure it is
> >> called
> >> just once.
> >>
> >> VOID
> >> EventIoDeviceControl(
> >> IN WDFQUEUE Queue,
> >> IN WDFREQUEST Request,
> >> IN size_t OutputBufferLength,
> >> IN size_t InputBufferLength,
> >> IN ULONG IoControlCode
> >> )
> >> {
> >> WDFDEVICE device = WdfIoQueueGetDevice(Queue);
> >> PDEVICE_CONTEXT pDeviceContext = GetDeviceContext(device);
> >> size_t bytesTransferred = 0;
> >> NTSTATUS status;
> >> WDF_USB_CONTROL_SETUP_PACKET controlSetupPacket;
> >>
> >> UNREFERENCED_PARAMETER(InputBufferLength);
> >> UNREFERENCED_PARAMETER(OutputBufferLength);
> >>
> >> switch(IoControlCode)
> >> {
> >> case IOCTL_USBXDFU_RESET:
> >> {
> >> KdPrint(("IOCTL_USBXDFU_RESET\n"));
> >>
> >> status = WdfUsbTargetDeviceCyclePortSynchronously(
> >> pDeviceContext->UsbDevice
> >> );
> >> if (!NT_SUCCESS(status))
> >> {
> >> KdPrint(("RESET failed.\n"));
> >> break;
> >> }
> >> }
> >> break;
> >> default:
> >> status = STATUS_INVALID_DEVICE_REQUEST;
> >> break;
> >> }
> >>
> >> WdfRequestCompleteWithInformation(
> >> Request,
> >> status,
> >> bytesTransferred
> >> );
> >> }
> >>
> >> --
> >> Thanks, Stanislav.
> >>
> >>
> >>
> >>
> >> "Doron Holan [MS]" wrote:
> >>
> >> > If a reset is being sent twice, it has nothing to do with KMDF. It
> >> > would
> >> > have
> >> > to be in the usb core. WdfUsbTargetDeviceResetPortSynchronously just
> >> > sends
> >> > a
> >> > IOCTL_INTERNAL_USB_RESET_PORT, WdfUsbTargetDeviceCyclePortSynchronously
> >> > just
> >> > sends a IOCTL_INTERNAL_USB_CYCLE_PORT. Both of these functions just
> >> > send
> >> > the
> >> > IRP once.
> >> >
> >> > What OS and what host controller are you seeing this on? Are you sure
> >> > that
> >> > you
> >> > are not calling WdfUsbTargetDeviceResetPort/CyclePortSynchronously
> >> > twice in
> >> > 2
> >> > different threads? In which callback(s) are you making the call to
> >> > these
> >> > DDIs?
> >> >
> >> > d
> >> >
> >> > --
> >> > Please do not send e-mail directly to this alias. this alias is for
> >> > newsgroup purposes only.
> >> > This posting is provided "AS IS" with no warranties, and confers no
> >> > rights.
> >> >
> >> >
> >> > "Stanislav Petrenko" <StanislavPetrenko(a)discussions.microsoft.com>
> >> > wrote in
> >> > message news:9410B811-AFAE-4EEB-A772-92F68CC0C300(a)microsoft.com...
> >> > > Hi All.
> >> > >
> >> > > I am using wdf to make a usb dfu driver. Trying to reset USB device
> >> > > through
> >> > > the call of WdfUsbTargetDeviceResetPortSynchronously or
> >> > > WdfUsbTargetDeviceCyclePortSynchronously I see in the trace that both
> >> > > of
> >> > > them
> >> > > reset device twice. That behavior prevents dfu from proper work.
> >> > >
> >> > > Is it made intentionally? Or am I wrong? How to reset device just
> >> > > single
> >> > > time using wdf?
> >> > >
> >> > > --
> >> > > Thanks, Stanislav.
> >> >
> >> >
> >> >
>
>
>