6 #define NDEBUG_USBPORT_URB
11 USBPORT_HandleGetConfiguration(IN PURB Urb
)
13 PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
15 DPRINT_URB("USBPORT_HandleGetConfiguration: Urb - %p\n", Urb
);
17 SetupPacket
= (PUSB_DEFAULT_PIPE_SETUP_PACKET
)
18 &Urb
->UrbControlGetConfigurationRequest
.Reserved1
;
20 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_DEVICE_TO_HOST
;
21 SetupPacket
->bRequest
= USB_REQUEST_GET_CONFIGURATION
;
22 SetupPacket
->wValue
.W
= 0;
23 SetupPacket
->wIndex
.W
= 0;
24 SetupPacket
->wLength
= Urb
->UrbControlGetConfigurationRequest
.TransferBufferLength
;
26 Urb
->UrbControlGetConfigurationRequest
.Reserved0
|= USBD_TRANSFER_DIRECTION_IN
; // 1;
27 Urb
->UrbControlGetConfigurationRequest
.Reserved0
|= USBD_SHORT_TRANSFER_OK
; // 2
29 USBPORT_DumpingSetupPacket(SetupPacket
);
31 USBPORT_QueueTransferUrb(Urb
);
33 return STATUS_PENDING
;
38 USBPORT_HandleGetCurrentFrame(IN PDEVICE_OBJECT FdoDevice
,
42 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
43 PUSBPORT_REGISTRATION_PACKET Packet
;
47 FdoExtension
= FdoDevice
->DeviceExtension
;
48 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
50 KeAcquireSpinLock(&FdoExtension
->MiniportSpinLock
, &OldIrql
);
51 FrameNumber
= Packet
->Get32BitFrameNumber(FdoExtension
->MiniPortExt
);
52 KeReleaseSpinLock(&FdoExtension
->MiniportSpinLock
, OldIrql
);
54 Urb
->UrbGetCurrentFrameNumber
.FrameNumber
= FrameNumber
;
56 DPRINT_URB("USBPORT_HandleGetCurrentFrame: FrameNumber - %p\n",
59 return USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_SUCCESS
);
64 USBPORT_AbortPipe(IN PDEVICE_OBJECT FdoDevice
,
68 PUSBPORT_ENDPOINT Endpoint
;
69 PUSBPORT_PIPE_HANDLE PipeHandle
;
70 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
73 DPRINT_URB("USBPORT_AbortPipe: ... \n");
75 PipeHandle
= Urb
->UrbPipeRequest
.PipeHandle
;
76 DeviceHandle
= Urb
->UrbHeader
.UsbdDeviceHandle
;
78 if (USBPORT_ValidatePipeHandle(DeviceHandle
, PipeHandle
))
80 if (!(PipeHandle
->Flags
& PIPE_HANDLE_FLAG_NULL_PACKET_SIZE
))
82 Endpoint
= PipeHandle
->Endpoint
;
84 Status
= STATUS_PENDING
;
86 Irp
->IoStatus
.Status
= Status
;
87 IoMarkIrpPending(Irp
);
89 USBPORT_AbortEndpoint(FdoDevice
, Endpoint
, Irp
);
94 Status
= USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_SUCCESS
);
98 Status
= USBPORT_USBDStatusToNtStatus(Urb
,
99 USBD_STATUS_INVALID_PIPE_HANDLE
);
107 USBPORT_ResetPipe(IN PDEVICE_OBJECT FdoDevice
,
111 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
112 PUSBPORT_REGISTRATION_PACKET Packet
;
113 PUSBPORT_PIPE_HANDLE PipeHandle
;
114 PUSBPORT_ENDPOINT Endpoint
;
117 DPRINT_URB("USBPORT_ResetPipe: ... \n");
119 FdoExtension
= FdoDevice
->DeviceExtension
;
120 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
122 PipeHandle
= Urb
->UrbPipeRequest
.PipeHandle
;
124 if (!USBPORT_ValidatePipeHandle((PUSBPORT_DEVICE_HANDLE
)Urb
->UrbHeader
.UsbdDeviceHandle
,
127 return USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_INVALID_PIPE_HANDLE
);
130 Endpoint
= PipeHandle
->Endpoint
;
132 KeAcquireSpinLock(&Endpoint
->EndpointSpinLock
, &Endpoint
->EndpointOldIrql
);
134 if (IsListEmpty(&Endpoint
->TransferList
))
136 if (Urb
->UrbHeader
.UsbdFlags
& USBD_FLAG_NOT_ISO_TRANSFER
)
138 KeAcquireSpinLockAtDpcLevel(&FdoExtension
->MiniportSpinLock
);
140 Packet
->SetEndpointDataToggle(FdoExtension
->MiniPortExt
,
144 KeReleaseSpinLockFromDpcLevel(&FdoExtension
->MiniportSpinLock
);
147 Status
= USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_SUCCESS
);
151 Status
= USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_ERROR_BUSY
);
154 Endpoint
->Flags
|= ENDPOINT_FLAG_QUEUENE_EMPTY
;
156 KeAcquireSpinLockAtDpcLevel(&FdoExtension
->MiniportSpinLock
);
158 Packet
->SetEndpointStatus(FdoExtension
->MiniPortExt
,
160 USBPORT_ENDPOINT_RUN
);
162 KeReleaseSpinLockFromDpcLevel(&FdoExtension
->MiniportSpinLock
);
163 KeReleaseSpinLock(&Endpoint
->EndpointSpinLock
, Endpoint
->EndpointOldIrql
);
170 USBPORT_ClearStall(IN PDEVICE_OBJECT FdoDevice
,
174 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
175 PUSBPORT_PIPE_HANDLE PipeHandle
;
176 USBD_STATUS USBDStatus
;
177 PUSBPORT_ENDPOINT Endpoint
;
179 USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
181 DPRINT_URB("USBPORT_ClearStall: ... \n");
183 PipeHandle
= Urb
->UrbPipeRequest
.PipeHandle
;
184 DeviceHandle
= Urb
->UrbHeader
.UsbdDeviceHandle
;
186 if (!USBPORT_ValidatePipeHandle(DeviceHandle
, PipeHandle
))
188 return USBPORT_USBDStatusToNtStatus(Urb
,
189 USBD_STATUS_INVALID_PIPE_HANDLE
);
192 Endpoint
= PipeHandle
->Endpoint
;
194 RtlZeroMemory(&SetupPacket
, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET
));
196 SetupPacket
.bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
197 SetupPacket
.bRequest
= USB_REQUEST_CLEAR_FEATURE
;
198 SetupPacket
.wValue
.W
= 0;
199 SetupPacket
.wIndex
.W
= Endpoint
->EndpointProperties
.EndpointAddress
;
200 SetupPacket
.wLength
= 0;
202 USBPORT_SendSetupPacket(DeviceHandle
,
210 Status
= USBPORT_USBDStatusToNtStatus(Urb
, USBDStatus
);
217 USBPORT_SyncResetPipeAndClearStall(IN PDEVICE_OBJECT FdoDevice
,
221 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
222 PUSBPORT_PIPE_HANDLE PipeHandle
;
223 PUSBPORT_ENDPOINT Endpoint
;
227 DPRINT_URB("USBPORT_SyncResetPipeAndClearStall: ... \n");
229 ASSERT(Urb
->UrbHeader
.UsbdDeviceHandle
);
230 ASSERT(Urb
->UrbHeader
.Length
== sizeof(struct _URB_PIPE_REQUEST
));
231 ASSERT(Urb
->UrbPipeRequest
.PipeHandle
);
233 DeviceHandle
= Urb
->UrbHeader
.UsbdDeviceHandle
;
234 PipeHandle
= Urb
->UrbPipeRequest
.PipeHandle
;
236 if (!USBPORT_ValidatePipeHandle(DeviceHandle
, PipeHandle
))
238 return USBPORT_USBDStatusToNtStatus(Urb
,
239 USBD_STATUS_INVALID_PIPE_HANDLE
);
242 if (PipeHandle
->Flags
& PIPE_HANDLE_FLAG_NULL_PACKET_SIZE
)
244 return USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_SUCCESS
);
247 Endpoint
= PipeHandle
->Endpoint
;
248 InterlockedIncrement(&DeviceHandle
->DeviceHandleLock
);
250 if (Endpoint
->EndpointProperties
.TransferType
!= USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
252 Urb
->UrbHeader
.UsbdFlags
|= USBD_FLAG_NOT_ISO_TRANSFER
;
253 Status
= USBPORT_ClearStall(FdoDevice
, Irp
, Urb
);
257 Status
= USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_SUCCESS
);
260 if (NT_SUCCESS(Status
))
262 Status
= USBPORT_ResetPipe(FdoDevice
, Irp
, Urb
);
264 if (Endpoint
->EndpointProperties
.TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
268 KeAcquireSpinLock(&Endpoint
->EndpointSpinLock
,
269 &Endpoint
->EndpointOldIrql
);
271 EndpointState
= USBPORT_GetEndpointState(Endpoint
);
273 if (EndpointState
== USBPORT_ENDPOINT_PAUSED
&&
274 IsListEmpty(&Endpoint
->TransferList
))
276 USBPORT_SetEndpointState(Endpoint
,
277 USBPORT_ENDPOINT_ACTIVE
);
280 KeReleaseSpinLock(&Endpoint
->EndpointSpinLock
,
281 Endpoint
->EndpointOldIrql
);
283 if (EndpointState
== USBPORT_ENDPOINT_ACTIVE
)
288 USBPORT_Wait(FdoDevice
, 1);
293 InterlockedDecrement(&DeviceHandle
->DeviceHandleLock
);
300 USBPORT_HandleSetOrClearFeature(IN PURB Urb
)
302 PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
304 DPRINT_URB("USBPORT_HandleSetOrClearFeature: Urb - %p\n", Urb
);
306 SetupPacket
= (PUSB_DEFAULT_PIPE_SETUP_PACKET
)
307 &Urb
->UrbControlFeatureRequest
.Reserved0
;
309 SetupPacket
->wLength
= 0;
310 Urb
->UrbControlFeatureRequest
.Reserved3
= 0; // TransferBufferLength
312 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_HOST_TO_DEVICE
;
314 switch (Urb
->UrbHeader
.Function
)
316 case URB_FUNCTION_SET_FEATURE_TO_DEVICE
:
317 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n");
318 SetupPacket
->bRequest
= USB_REQUEST_SET_FEATURE
;
319 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_DEVICE
;
322 case URB_FUNCTION_SET_FEATURE_TO_INTERFACE
:
323 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE\n");
324 SetupPacket
->bRequest
= USB_REQUEST_SET_FEATURE
;
325 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_INTERFACE
;
328 case URB_FUNCTION_SET_FEATURE_TO_ENDPOINT
:
329 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE\n");
330 SetupPacket
->bRequest
= USB_REQUEST_SET_FEATURE
;
331 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
334 case URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE
:
335 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT\n");
336 SetupPacket
->bRequest
= USB_REQUEST_CLEAR_FEATURE
;
337 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_DEVICE
;
340 case URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE
:
341 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT\n");
342 SetupPacket
->bRequest
= USB_REQUEST_CLEAR_FEATURE
;
343 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_INTERFACE
;
346 case URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT
:
347 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE\n");
348 SetupPacket
->bRequest
= USB_REQUEST_CLEAR_FEATURE
;
349 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
352 case URB_FUNCTION_CLEAR_FEATURE_TO_OTHER
:
353 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE\n");
354 SetupPacket
->bRequest
= USB_REQUEST_CLEAR_FEATURE
;
355 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_OTHER
;
358 case URB_FUNCTION_SET_FEATURE_TO_OTHER
:
359 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE\n");
360 SetupPacket
->bRequest
= USB_REQUEST_SET_FEATURE
;
361 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_OTHER
;
365 Urb
->UrbControlFeatureRequest
.Reserved2
&= ~USBD_TRANSFER_DIRECTION_IN
;
366 Urb
->UrbControlFeatureRequest
.Reserved2
|= USBD_SHORT_TRANSFER_OK
;
368 USBPORT_DumpingSetupPacket(SetupPacket
);
370 USBPORT_QueueTransferUrb(Urb
);
372 return STATUS_PENDING
;
377 USBPORT_HandleDataTransfers(IN PURB Urb
)
379 PUSBPORT_ENDPOINT Endpoint
;
381 DPRINT_URB("USBPORT_HandleDataTransfers: Urb - %p\n", Urb
);
383 Endpoint
= ((PUSBPORT_PIPE_HANDLE
)
384 (Urb
->UrbBulkOrInterruptTransfer
.PipeHandle
))->Endpoint
;
386 if (Endpoint
->EndpointProperties
.TransferType
!= USBPORT_TRANSFER_TYPE_CONTROL
)
388 if (Endpoint
->EndpointProperties
.Direction
)
390 Urb
->UrbBulkOrInterruptTransfer
.TransferFlags
|= USBD_TRANSFER_DIRECTION_IN
;
394 Urb
->UrbBulkOrInterruptTransfer
.TransferFlags
&= ~USBD_TRANSFER_DIRECTION_IN
;
398 USBPORT_QueueTransferUrb(Urb
);
400 return STATUS_PENDING
;
405 USBPORT_HandleGetStatus(IN PIRP Irp
,
408 PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
411 SetupPacket
= (PUSB_DEFAULT_PIPE_SETUP_PACKET
)
412 &Urb
->UrbControlDescriptorRequest
.Reserved1
;
414 SetupPacket
->bmRequestType
.B
= 0;
415 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_DEVICE_TO_HOST
;
416 SetupPacket
->bRequest
= USB_REQUEST_GET_STATUS
;
417 SetupPacket
->wLength
= Urb
->UrbControlDescriptorRequest
.TransferBufferLength
;
418 SetupPacket
->wValue
.W
= 0;
420 switch (Urb
->UrbHeader
.Function
)
422 case URB_FUNCTION_GET_STATUS_FROM_DEVICE
:
423 DPRINT_URB("USBPORT_HandleGetStatus: URB_FUNCTION_GET_STATUS_FROM_DEVICE\n");
424 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_DEVICE
;
427 case URB_FUNCTION_GET_STATUS_FROM_INTERFACE
:
428 DPRINT_URB("USBPORT_HandleGetStatus: URB_FUNCTION_GET_STATUS_FROM_INTERFACE\n");
429 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_INTERFACE
;
432 case URB_FUNCTION_GET_STATUS_FROM_ENDPOINT
:
433 DPRINT_URB("USBPORT_HandleGetStatus: URB_FUNCTION_GET_STATUS_FROM_ENDPOINT\n");
434 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
437 case URB_FUNCTION_GET_STATUS_FROM_OTHER
:
438 DPRINT_URB("USBPORT_HandleGetStatus: URB_FUNCTION_GET_STATUS_FROM_OTHER\n");
439 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_OTHER
;
443 if (SetupPacket
->wLength
== 2)
445 Urb
->UrbControlTransfer
.TransferFlags
|= USBD_SHORT_TRANSFER_OK
;
447 if (SetupPacket
->bmRequestType
.Dir
)
448 Urb
->UrbControlTransfer
.TransferFlags
|= USBD_TRANSFER_DIRECTION_IN
;
450 Urb
->UrbControlTransfer
.TransferFlags
&= ~USBD_TRANSFER_DIRECTION_IN
;
452 //USBPORT_DumpingSetupPacket(SetupPacket);
454 USBPORT_QueueTransferUrb(Urb
);
456 Status
= STATUS_PENDING
;
460 Status
= USBPORT_USBDStatusToNtStatus(Urb
,
461 USBD_STATUS_INVALID_PARAMETER
);
463 DPRINT1("USBPORT_HandleGetStatus: Bad wLength\n");
464 USBPORT_DumpingSetupPacket(SetupPacket
);
472 USBPORT_HandleVendorOrClass(IN PIRP Irp
,
475 PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
478 Specifies a value, from 4 to 31 inclusive,
479 that becomes part of the request type code in the USB-defined setup packet.
480 This value is defined by USB for a class request or the vendor for a vendor request.
483 SetupPacket
= (PUSB_DEFAULT_PIPE_SETUP_PACKET
)
484 &Urb
->UrbControlDescriptorRequest
.Reserved1
;
486 SetupPacket
->bmRequestType
.Dir
= USBD_TRANSFER_DIRECTION_FLAG
487 (Urb
->UrbControlTransfer
.TransferFlags
);
489 SetupPacket
->wLength
= Urb
->UrbControlDescriptorRequest
.TransferBufferLength
;
491 Urb
->UrbControlTransfer
.TransferFlags
|= USBD_SHORT_TRANSFER_OK
;
493 switch (Urb
->UrbHeader
.Function
)
495 case URB_FUNCTION_VENDOR_DEVICE
:
496 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_VENDOR_DEVICE\n");
497 SetupPacket
->bmRequestType
.Type
= BMREQUEST_VENDOR
;
498 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_DEVICE
;
501 case URB_FUNCTION_VENDOR_INTERFACE
:
502 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_VENDOR_INTERFACE\n");
503 SetupPacket
->bmRequestType
.Type
= BMREQUEST_VENDOR
;
504 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_INTERFACE
;
507 case URB_FUNCTION_VENDOR_ENDPOINT
:
508 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_VENDOR_ENDPOINT\n");
509 SetupPacket
->bmRequestType
.Type
= BMREQUEST_VENDOR
;
510 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
513 case URB_FUNCTION_CLASS_DEVICE
:
514 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_CLASS_DEVICE\n");
515 SetupPacket
->bmRequestType
.Type
= BMREQUEST_CLASS
;
516 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_DEVICE
;
519 case URB_FUNCTION_CLASS_INTERFACE
:
520 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_CLASS_INTERFACE\n");
521 SetupPacket
->bmRequestType
.Type
= BMREQUEST_CLASS
;
522 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_INTERFACE
;
525 case URB_FUNCTION_CLASS_ENDPOINT
:
526 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_CLASS_ENDPOINT\n");
527 SetupPacket
->bmRequestType
.Type
= BMREQUEST_CLASS
;
528 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
531 case URB_FUNCTION_CLASS_OTHER
:
532 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_CLASS_OTHER\n");
533 SetupPacket
->bmRequestType
.Type
= BMREQUEST_CLASS
;
534 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_OTHER
;
537 case URB_FUNCTION_VENDOR_OTHER
:
538 DPRINT_URB("USBPORT_HandleVendorOrClass: URB_FUNCTION_VENDOR_OTHER\n");
539 SetupPacket
->bmRequestType
.Type
= BMREQUEST_VENDOR
;
540 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_OTHER
;
544 USBPORT_DumpingSetupPacket(SetupPacket
);
546 USBPORT_QueueTransferUrb(Urb
);
548 return STATUS_PENDING
;
553 USBPORT_HandleGetSetDescriptor(IN PIRP Irp
,
556 PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
558 SetupPacket
= (PUSB_DEFAULT_PIPE_SETUP_PACKET
)
559 &Urb
->UrbControlDescriptorRequest
.Reserved1
;
561 SetupPacket
->wLength
= Urb
->UrbControlDescriptorRequest
.TransferBufferLength
;
562 SetupPacket
->bmRequestType
.B
= 0; // Clear bmRequestType
563 SetupPacket
->bmRequestType
.Type
= BMREQUEST_STANDARD
;
565 switch (Urb
->UrbHeader
.Function
)
567 case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
:
568 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n");
569 SetupPacket
->bRequest
= USB_REQUEST_GET_DESCRIPTOR
;
570 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_DEVICE_TO_HOST
;
571 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_DEVICE
;
574 case URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE
:
575 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE\n");
576 SetupPacket
->bRequest
= USB_REQUEST_SET_DESCRIPTOR
;
577 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_HOST_TO_DEVICE
;
578 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_DEVICE
;
581 case URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT
:
582 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT\n");
583 SetupPacket
->bRequest
= USB_REQUEST_GET_DESCRIPTOR
;
584 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_DEVICE_TO_HOST
;
585 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
588 case URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT
:
589 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT\n");
590 SetupPacket
->bRequest
= USB_REQUEST_SET_DESCRIPTOR
;
591 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_HOST_TO_DEVICE
;
592 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_ENDPOINT
;
595 case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE
:
596 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE\n");
597 SetupPacket
->bRequest
= USB_REQUEST_GET_DESCRIPTOR
;
598 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_DEVICE_TO_HOST
;
599 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_INTERFACE
;
602 case URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE
:
603 DPRINT_URB("USBPORT_HandleGetSetDescriptor: URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE\n");
604 SetupPacket
->bRequest
= USB_REQUEST_SET_DESCRIPTOR
;
605 SetupPacket
->bmRequestType
.Dir
= BMREQUEST_HOST_TO_DEVICE
;
606 SetupPacket
->bmRequestType
.Recipient
= BMREQUEST_TO_INTERFACE
;
610 Urb
->UrbControlTransfer
.TransferFlags
|= USBD_SHORT_TRANSFER_OK
;
612 if (SetupPacket
->bmRequestType
.Dir
)
613 Urb
->UrbControlTransfer
.TransferFlags
|= USBD_TRANSFER_DIRECTION_IN
;
615 Urb
->UrbControlTransfer
.TransferFlags
&= ~USBD_TRANSFER_DIRECTION_IN
;
617 USBPORT_DumpingSetupPacket(SetupPacket
);
619 USBPORT_QueueTransferUrb(Urb
);
621 return STATUS_PENDING
;
626 USBPORT_ValidateTransferParametersURB(IN PURB Urb
)
628 struct _URB_CONTROL_TRANSFER
*UrbRequest
;
631 DPRINT_URB("USBPORT_ValidateTransferParametersURB: Urb - %p\n", Urb
);
633 UrbRequest
= &Urb
->UrbControlTransfer
;
635 if (UrbRequest
->TransferBuffer
== NULL
&&
636 UrbRequest
->TransferBufferMDL
== NULL
&&
637 UrbRequest
->TransferBufferLength
> 0)
639 DPRINT1("USBPORT_ValidateTransferParametersURB: Not valid parameter\n");
640 USBPORT_DumpingURB(Urb
);
641 return STATUS_INVALID_PARAMETER
;
644 if ((UrbRequest
->TransferBuffer
!= NULL
) &&
645 (UrbRequest
->TransferBufferMDL
!= NULL
) &&
646 UrbRequest
->TransferBufferLength
== 0)
648 DPRINT1("USBPORT_ValidateTransferParametersURB: Not valid parameter\n");
649 USBPORT_DumpingURB(Urb
);
650 return STATUS_INVALID_PARAMETER
;
653 if (UrbRequest
->TransferBuffer
!= NULL
&&
654 UrbRequest
->TransferBufferMDL
== NULL
&&
655 UrbRequest
->TransferBufferLength
!= 0)
657 DPRINT_URB("USBPORT_ValidateTransferParametersURB: TransferBuffer - %p, TransferBufferLength - %x\n",
658 UrbRequest
->TransferBuffer
,
659 UrbRequest
->TransferBufferLength
);
661 Mdl
= IoAllocateMdl(UrbRequest
->TransferBuffer
,
662 UrbRequest
->TransferBufferLength
,
669 DPRINT1("USBPORT_ValidateTransferParametersURB: Not allocated Mdl\n");
670 return STATUS_INSUFFICIENT_RESOURCES
;
673 MmBuildMdlForNonPagedPool(Mdl
);
675 UrbRequest
->TransferBufferMDL
= Mdl
;
676 Urb
->UrbHeader
.UsbdFlags
|= USBD_FLAG_ALLOCATED_MDL
;
678 DPRINT_URB("USBPORT_ValidateTransferParametersURB: Mdl - %p\n", Mdl
);
681 return STATUS_SUCCESS
;
686 USBPORT_ValidateURB(IN PDEVICE_OBJECT FdoDevice
,
689 IN BOOLEAN IsControlTransfer
,
690 IN BOOLEAN IsNullTransfer
)
692 struct _URB_CONTROL_TRANSFER
*UrbRequest
;
693 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
695 USBD_STATUS USBDStatus
;
697 UrbRequest
= &Urb
->UrbControlTransfer
;
699 if (UrbRequest
->UrbLink
)
701 Status
= USBPORT_USBDStatusToNtStatus(Urb
,
702 USBD_STATUS_INVALID_PARAMETER
);
704 DPRINT1("USBPORT_ValidateURB: Not valid parameter\n");
706 USBPORT_DumpingURB(Urb
);
710 DeviceHandle
= Urb
->UrbHeader
.UsbdDeviceHandle
;
712 if (IsControlTransfer
)
714 UrbRequest
->TransferFlags
|= USBD_DEFAULT_PIPE_TRANSFER
;
715 UrbRequest
->PipeHandle
= &DeviceHandle
->PipeHandle
;
718 if (UrbRequest
->TransferFlags
& USBD_DEFAULT_PIPE_TRANSFER
)
720 if (UrbRequest
->TransferBufferLength
> 0x1000)
722 Status
= USBPORT_USBDStatusToNtStatus(Urb
,
723 USBD_STATUS_INVALID_PARAMETER
);
725 DPRINT1("USBPORT_ValidateURB: Not valid parameter\n");
727 USBPORT_DumpingURB(Urb
);
731 if (Urb
->UrbHeader
.Function
== URB_FUNCTION_CONTROL_TRANSFER
)
733 UrbRequest
->PipeHandle
= &DeviceHandle
->PipeHandle
;
737 if (!USBPORT_ValidatePipeHandle(DeviceHandle
, UrbRequest
->PipeHandle
))
739 Status
= USBPORT_USBDStatusToNtStatus(Urb
,
740 USBD_STATUS_INVALID_PIPE_HANDLE
);
742 DPRINT1("USBPORT_ValidateURB: Not valid pipe handle\n");
744 USBPORT_DumpingURB(Urb
);
748 UrbRequest
->hca
.Reserved8
[0] = NULL
; // Transfer
752 UrbRequest
->TransferBuffer
= 0;
753 UrbRequest
->TransferBufferMDL
= NULL
;
754 UrbRequest
->TransferBufferLength
= 0;
758 Status
= USBPORT_ValidateTransferParametersURB(Urb
);
760 if (!NT_SUCCESS(Status
))
766 USBDStatus
= USBPORT_AllocateTransfer(FdoDevice
,
772 Status
= USBPORT_USBDStatusToNtStatus(Urb
, USBDStatus
);
774 if (!NT_SUCCESS(Status
))
776 DPRINT1("USBPORT_ValidateURB: Not allocated transfer\n");
784 USBPORT_HandleSubmitURB(IN PDEVICE_OBJECT PdoDevice
,
788 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
789 PDEVICE_OBJECT FdoDevice
;
790 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
792 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
793 NTSTATUS Status
= STATUS_NOT_IMPLEMENTED
;
797 PdoExtension
= PdoDevice
->DeviceExtension
;
798 FdoDevice
= PdoExtension
->FdoDevice
;
799 FdoExtension
= FdoDevice
->DeviceExtension
;
801 Urb
->UrbHeader
.Status
= USBD_STATUS_SUCCESS
;
802 Urb
->UrbHeader
.UsbdFlags
= 0;
804 Function
= Urb
->UrbHeader
.Function
;
806 if (Function
> URB_FUNCTION_MAX
)
808 Status
= USBPORT_USBDStatusToNtStatus(Urb
,
809 USBD_STATUS_INVALID_URB_FUNCTION
);
811 DPRINT1("USBPORT_HandleSubmitURB: Unknown URB function - %x !!!\n",
817 if (FdoExtension
->TimerFlags
& USBPORT_TMFLAG_RH_SUSPENDED
)
819 DPRINT1("USBPORT_HandleSubmitURB: Bad Request\n");
821 USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_DEVICE_GONE
);
823 Irp
->IoStatus
.Status
= STATUS_PENDING
;
824 IoMarkIrpPending(Irp
);
825 IoCsqInsertIrp(&FdoExtension
->BadRequestIoCsq
, Irp
, NULL
);
827 return STATUS_PENDING
;
830 DeviceHandle
= Urb
->UrbHeader
.UsbdDeviceHandle
;
834 DeviceHandle
= &PdoExtension
->DeviceHandle
;
835 Urb
->UrbHeader
.UsbdDeviceHandle
= DeviceHandle
;
838 if (!USBPORT_ValidateDeviceHandle(PdoExtension
->FdoDevice
,
841 DPRINT1("USBPORT_HandleSubmitURB: Not valid device handle\n");
843 Irp
->IoStatus
.Status
= STATUS_PENDING
;
844 IoMarkIrpPending(Irp
);
845 IoCsqInsertIrp(&FdoExtension
->BadRequestIoCsq
, Irp
, NULL
);
847 return STATUS_PENDING
;
850 InterlockedIncrement(&DeviceHandle
->DeviceHandleLock
);
852 DPRINT_URB("USBPORT_HandleSubmitURB: Function - 0x%02X, DeviceHandle - %p\n",
854 Urb
->UrbHeader
.UsbdDeviceHandle
);
858 case URB_FUNCTION_ISOCH_TRANSFER
:
859 DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_ISOCH_TRANSFER UNIMPLEMENTED. FIXME. \n");
862 case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
:
863 case URB_FUNCTION_CONTROL_TRANSFER
:
864 Status
= USBPORT_ValidateURB(FdoDevice
, Irp
, Urb
, FALSE
, FALSE
);
866 if (!NT_SUCCESS(Status
))
868 DPRINT1("USBPORT_HandleSubmitURB: Not valid URB\n");
872 Status
= USBPORT_HandleDataTransfers(Urb
);
875 case URB_FUNCTION_VENDOR_DEVICE
:
876 case URB_FUNCTION_VENDOR_INTERFACE
:
877 case URB_FUNCTION_VENDOR_ENDPOINT
:
878 case URB_FUNCTION_CLASS_DEVICE
:
879 case URB_FUNCTION_CLASS_INTERFACE
:
880 case URB_FUNCTION_CLASS_ENDPOINT
:
881 case URB_FUNCTION_CLASS_OTHER
:
882 case URB_FUNCTION_VENDOR_OTHER
:
883 Status
= USBPORT_ValidateURB(FdoDevice
, Irp
, Urb
, TRUE
, FALSE
);
885 if (!NT_SUCCESS(Status
))
887 DPRINT1("USBPORT_HandleSubmitURB: Not valid URB\n");
891 Status
= USBPORT_HandleVendorOrClass(Irp
, Urb
);
894 case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
:
895 case URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE
:
896 case URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT
:
897 case URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT
:
898 case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE
:
899 case URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE
:
900 Status
= USBPORT_ValidateURB(FdoDevice
, Irp
, Urb
, TRUE
, FALSE
);
902 if (!NT_SUCCESS(Status
))
904 DPRINT1("USBPORT_HandleSubmitURB: Not valid URB\n");
908 Status
= USBPORT_HandleGetSetDescriptor(Irp
, Urb
);
911 case URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR
:
912 DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR (0x2A) NOT_SUPPORTED\n");
913 return USBPORT_USBDStatusToNtStatus(Urb
,
914 USBD_STATUS_INVALID_URB_FUNCTION
);
916 case URB_FUNCTION_GET_STATUS_FROM_DEVICE
:
917 case URB_FUNCTION_GET_STATUS_FROM_INTERFACE
:
918 case URB_FUNCTION_GET_STATUS_FROM_ENDPOINT
:
919 case URB_FUNCTION_GET_STATUS_FROM_OTHER
:
920 Status
= USBPORT_ValidateURB(FdoDevice
, Irp
, Urb
, TRUE
, FALSE
);
922 if (!NT_SUCCESS(Status
))
924 DPRINT1("USBPORT_HandleSubmitURB: Not valid URB\n");
928 Status
= USBPORT_HandleGetStatus(Irp
, Urb
);
931 case URB_FUNCTION_SELECT_CONFIGURATION
:
932 Status
= USBPORT_HandleSelectConfiguration(PdoExtension
->FdoDevice
,
937 case URB_FUNCTION_SELECT_INTERFACE
:
938 Status
= USBPORT_HandleSelectInterface(PdoExtension
->FdoDevice
,
943 case URB_FUNCTION_GET_CONFIGURATION
:
944 Status
= USBPORT_ValidateURB(FdoDevice
, Irp
, Urb
, TRUE
, FALSE
);
946 if (!NT_SUCCESS(Status
))
948 DPRINT1("USBPORT_HandleSubmitURB: Not valid URB\n");
952 Status
= USBPORT_HandleGetConfiguration(Urb
);
955 case URB_FUNCTION_GET_INTERFACE
:
956 DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_GET_INTERFACE (0x27) NOT_SUPPORTED\n");
957 return USBPORT_USBDStatusToNtStatus(Urb
,
958 USBD_STATUS_INVALID_URB_FUNCTION
);
960 case URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
:
961 Status
= USBPORT_SyncResetPipeAndClearStall(PdoExtension
->FdoDevice
,
966 case URB_FUNCTION_SYNC_RESET_PIPE
:
967 Status
= USBPORT_ResetPipe(PdoExtension
->FdoDevice
,
972 case URB_FUNCTION_SYNC_CLEAR_STALL
:
973 Status
= USBPORT_ClearStall(PdoExtension
->FdoDevice
,
978 case URB_FUNCTION_ABORT_PIPE
:
979 Status
= USBPORT_AbortPipe(PdoExtension
->FdoDevice
,
984 case URB_FUNCTION_SET_FEATURE_TO_DEVICE
:
985 case URB_FUNCTION_SET_FEATURE_TO_INTERFACE
:
986 case URB_FUNCTION_SET_FEATURE_TO_ENDPOINT
:
987 case URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE
:
988 case URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT
:
989 case URB_FUNCTION_CLEAR_FEATURE_TO_OTHER
:
990 case URB_FUNCTION_SET_FEATURE_TO_OTHER
:
991 Status
= USBPORT_ValidateURB(FdoDevice
, Irp
, Urb
, TRUE
, TRUE
);
993 if (!NT_SUCCESS(Status
))
995 DPRINT1("USBPORT_HandleSubmitURB: Not valid URB\n");
999 Status
= USBPORT_HandleSetOrClearFeature(Urb
);
1002 case URB_FUNCTION_GET_CURRENT_FRAME_NUMBER
:
1003 Status
= USBPORT_HandleGetCurrentFrame(PdoExtension
->FdoDevice
,
1008 case URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL
:
1009 DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL (0x03) NOT_SUPPORTED\n");
1010 return USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_NOT_SUPPORTED
);
1012 case URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL
:
1013 DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL (0x04) NOT_SUPPORTED\n");
1014 return USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_NOT_SUPPORTED
);
1016 case URB_FUNCTION_GET_FRAME_LENGTH
:
1017 DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_GET_FRAME_LENGTH (0x05) NOT_SUPPORTED\n");
1018 return USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_NOT_SUPPORTED
);
1020 case URB_FUNCTION_SET_FRAME_LENGTH
:
1021 DPRINT1("USBPORT_HandleSubmitURB: URB_FUNCTION_SET_FRAME_LENGTH (0x06) NOT_SUPPORTED\n");
1022 return USBPORT_USBDStatusToNtStatus(Urb
, USBD_STATUS_NOT_SUPPORTED
);
1025 DPRINT1("USBPORT_HandleSubmitURB: Unknown URB Function - %x\n",
1027 //URB_FUNCTION_RESERVED_0X0016
1028 //URB_FUNCTION_RESERVE_0X001D
1029 //URB_FUNCTION_RESERVE_0X002B
1030 //URB_FUNCTION_RESERVE_0X002C
1031 //URB_FUNCTION_RESERVE_0X002D
1032 //URB_FUNCTION_RESERVE_0X002E
1033 //URB_FUNCTION_RESERVE_0X002F
1037 if (Status
== STATUS_PENDING
)
1042 if (Urb
->UrbHeader
.UsbdFlags
& USBD_FLAG_ALLOCATED_TRANSFER
)
1044 PUSBPORT_TRANSFER Transfer
;
1046 Transfer
= Urb
->UrbControlTransfer
.hca
.Reserved8
[0];
1047 Urb
->UrbControlTransfer
.hca
.Reserved8
[0] = NULL
;
1048 Urb
->UrbHeader
.UsbdFlags
|= ~USBD_FLAG_ALLOCATED_TRANSFER
;
1049 ExFreePoolWithTag(Transfer
, USB_PORT_TAG
);
1054 InterlockedDecrement(&DeviceHandle
->DeviceHandleLock
);
1057 Irp
->IoStatus
.Status
= Status
;
1058 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);