Sync with trunk r63786.
[reactos.git] / lib / drivers / libusb / hub_controller.cpp
index 763fd5c..0a1be71 100644 (file)
@@ -13,7 +13,7 @@
 #define NDEBUG
 #include <debug.h>
 
-VOID StatusChangeEndpointCallBack(
+VOID NTAPI StatusChangeEndpointCallBack(
     PVOID Context);
 
 class CHubController : public IHubController,
@@ -48,6 +48,7 @@ public:
     virtual NTSTATUS HandlePnp(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
     virtual NTSTATUS HandlePower(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
     virtual NTSTATUS HandleDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
+    virtual NTSTATUS HandleSystemControl(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
 
     // local functions
     NTSTATUS HandleQueryInterface(PIO_STACK_LOCATION IoStack);
@@ -77,7 +78,7 @@ public:
     NTSTATUS HandleSyncResetAndClearStall(IN OUT PIRP Irp, PURB Urb);
     NTSTATUS HandleAbortPipe(IN OUT PIRP Irp, PURB Urb);
 
-    friend VOID StatusChangeEndpointCallBack(PVOID Context);
+    friend VOID NTAPI StatusChangeEndpointCallBack(PVOID Context);
 
     // constructor / destructor
     CHubController(IUnknown *OuterUnknown){}
@@ -110,7 +111,7 @@ protected:
 
 
     //Internal Functions
-    BOOLEAN QueryStatusChageEndpoint(PIRP Irp);
+    BOOLEAN QueryStatusChangeEndpoint(PIRP Irp);
 };
 
 typedef struct
@@ -285,7 +286,7 @@ CHubController::Initialize(
 // Queries the ports to see if there has been a device connected or removed.
 //
 BOOLEAN
-CHubController::QueryStatusChageEndpoint(
+CHubController::QueryStatusChangeEndpoint(
     PIRP Irp)
 {
     ULONG PortCount, PortId;
@@ -759,10 +760,23 @@ CHubController::HandlePower(
     IN PDEVICE_OBJECT DeviceObject,
     IN OUT PIRP Irp)
 {
-    UNIMPLEMENTED
-    Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    Status = Irp->IoStatus.Status;
+    PoStartNextPowerIrp(Irp);
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return STATUS_NOT_IMPLEMENTED;
+    return Status;
+}
+
+//-----------------------------------------------------------------------------------------
+NTSTATUS
+CHubController::HandleSystemControl(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN OUT PIRP Irp)
+{
+    NTSTATUS Status;
+    Status = Irp->IoStatus.Status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return Status;
 }
 
 //-----------------------------------------------------------------------------------------
@@ -832,9 +846,11 @@ CHubController::HandleBulkOrInterruptTransfer(
     if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this)  || Urb->UrbHeader.UsbdDeviceHandle == NULL)
     {
         ASSERT(m_PendingSCEIrp == NULL);
-        if (QueryStatusChageEndpoint(Irp))
+        if (QueryStatusChangeEndpoint(Irp))
         {
-            StatusChangeEndpointCallBack(this);
+            //
+            // We've seen a change already, so return immediately
+            //
             return STATUS_SUCCESS;
         }
 
@@ -1097,7 +1113,7 @@ CHubController::HandleSelectConfiguration(
         // select configuration
         //
         Status = UsbDevice->SelectConfiguration(Urb->UrbSelectConfiguration.ConfigurationDescriptor, &Urb->UrbSelectConfiguration.Interface, &Urb->UrbSelectConfiguration.ConfigurationHandle);
-        if (NT_SUCCESS(Status)) 
+        if (NT_SUCCESS(Status))
         {
             // successfully configured device
             Urb->UrbSelectConfiguration.Hdr.Status = USBD_STATUS_SUCCESS;
@@ -1576,7 +1592,7 @@ CHubController::HandleGetDescriptor(
                 Length = BufferLength > sizeof(USB_CONFIGURATION_DESCRIPTOR) ?
                     sizeof(USB_CONFIGURATION_DESCRIPTOR) : BufferLength;
                 RtlCopyMemory(Buffer, &ROOTHUB2_CONFIGURATION_DESCRIPTOR, Length);
-                
+
                 //
                 // Check if we still have some space left
                 //
@@ -1600,7 +1616,7 @@ CHubController::HandleGetDescriptor(
                 Length = BufferLength > sizeof(USB_INTERFACE_DESCRIPTOR) ?
                     sizeof(USB_INTERFACE_DESCRIPTOR) : BufferLength;
                 RtlCopyMemory(Buffer, &ROOTHUB2_INTERFACE_DESCRIPTOR, Length);
-                
+
                 //
                 // Check if we still have some space left
                 //
@@ -1617,8 +1633,8 @@ CHubController::HandleGetDescriptor(
                 //
                 Buffer += Length;
                 BufferLength -= Length;
-                
-                
+
+
                 //
                 // copy end point descriptor template
                 //
@@ -1651,7 +1667,7 @@ CHubController::HandleGetDescriptor(
                 // get device
                 //
                 UsbDevice = PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle);
-                
+
                 //
                 // Allocate temporary buffer
                 //
@@ -1667,14 +1683,14 @@ CHubController::HandleGetDescriptor(
                 // perform work in IUSBDevice
                 //
                 UsbDevice->GetConfigurationDescriptors((PUSB_CONFIGURATION_DESCRIPTOR)Buffer, BufferLength, &Length);
-                
+
                 //
                 // Copy what we can
                 //
-                Length = Urb->UrbControlDescriptorRequest.TransferBufferLength > Length ? 
+                Length = Urb->UrbControlDescriptorRequest.TransferBufferLength > Length ?
                     Length : Urb->UrbControlDescriptorRequest.TransferBufferLength;
                 RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, Buffer, Length);
-                
+
                 //
                 // Free temporary buffer
                 //
@@ -3967,7 +3983,7 @@ CreateHubController(
     return STATUS_SUCCESS;
 }
 
-VOID StatusChangeEndpointCallBack(PVOID Context)
+VOID NTAPI StatusChangeEndpointCallBack(PVOID Context)
 {
     CHubController* This;
     PIRP Irp;
@@ -3983,7 +3999,7 @@ VOID StatusChangeEndpointCallBack(PVOID Context)
     }
 
     This->m_PendingSCEIrp = NULL;
-    This->QueryStatusChageEndpoint(Irp);
+    This->QueryStatusChangeEndpoint(Irp);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;