Author: vmikayelyan
Date: Fri Aug 19 16:38:11 2016
New Revision: 72387

URL: http://svn.reactos.org/svn/reactos?rev=72387&view=rev
Log:
usb: hub: FDO: Handle surprise removal, fail stop request.

Modified:
    branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c

Modified: branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c?rev=72387&r1=72386&r2=72387&view=diff
==============================================================================
--- branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c     [iso-8859-1] (original)
+++ branches/GSoC_2016/USB/drivers/usb/usbhub/fdo.c     [iso-8859-1] Fri Aug 19 
16:38:11 2016
@@ -2030,7 +2030,9 @@
 {
     PIO_STACK_LOCATION Stack;
     NTSTATUS Status = STATUS_SUCCESS;
+    PDEVICE_OBJECT ChildDeviceObject;
     PHUB_DEVICE_EXTENSION HubDeviceExtension;
+    PHUB_CHILDDEVICE_EXTENSION ChildDeviceExtension;
 
     HubDeviceExtension = (PHUB_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
 
@@ -2098,10 +2100,49 @@
             }
             break;
         }
+        case IRP_MN_QUERY_STOP_DEVICE:
+        {
+            //
+            // We should fail this request, because we're not handling
+            // IRP_MN_STOP_DEVICE for now.We'll receive this IRP ONLY when
+            // PnP manager rebalances resources.
+            //
+            Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            return STATUS_NOT_SUPPORTED;
+        }
         case IRP_MN_QUERY_REMOVE_DEVICE:
-        case IRP_MN_QUERY_STOP_DEVICE:
-        {
-            DPRINT("IRP_MN_QUERY_STOP_DEVICE\n");
+        {
+            // No action is required from FDO because it have nothing to free.
+            DPRINT("IRP_MN_QUERY_REMOVE_DEVICE\n");
+
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+            break;
+        }
+        case IRP_MN_SURPRISE_REMOVAL:
+        {
+            //
+            // We'll receive this IRP on HUB unexpected removal, or on USB
+            // controller removal from PCI port. Here we should "let know" all
+            // our children that their parent is removed and on next removal
+            // they also can be removed.
+            //
+
+            KeAcquireGuardedMutex(&HubDeviceExtension->HubMutexLock);
+
+            for (int i = 0; i < USB_MAXCHILDREN; i++)
+            {
+                ChildDeviceObject = HubDeviceExtension->ChildDeviceObject[i];
+                if (ChildDeviceObject)
+                {
+                    ChildDeviceExtension = 
(PHUB_CHILDDEVICE_EXTENSION)ChildDeviceObject->DeviceObjectExtension;
+                    ChildDeviceExtension->ParentDeviceObject = NULL;
+                }
+            }
+
+            KeReleaseGuardedMutex(&HubDeviceExtension->HubMutexLock);
+
+            // This IRP can't be failed
             Irp->IoStatus.Status = STATUS_SUCCESS;
             break;
         }


Reply via email to