https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5e15ba48b9ea8460a0929e4c2092c3137b1d811d

commit 5e15ba48b9ea8460a0929e4c2092c3137b1d811d
Author:     Vadim Galyant <v...@rambler.ru>
AuthorDate: Wed Nov 29 03:30:46 2017 +0900
Commit:     Amine Khaldi <amine.kha...@reactos.org>
CommitDate: Sun Jan 21 19:35:41 2018 +0100

    [USBPORT] Add support for transaction translators in USBPORT_RemoveDevice().
---
 drivers/usb/usbport/device.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/drivers/usb/usbport/device.c b/drivers/usb/usbport/device.c
index 7ba54f594e..ec6dbc33b3 100644
--- a/drivers/usb/usbport/device.c
+++ b/drivers/usb/usbport/device.c
@@ -1564,6 +1564,9 @@ USBPORT_RemoveDevice(IN PDEVICE_OBJECT FdoDevice,
                      IN ULONG Flags)
 {
     PUSBPORT_DEVICE_EXTENSION FdoExtension;
+    PUSB2_TT_EXTENSION TtExtension;
+    ULONG ix;
+    KIRQL OldIrql;
 
     DPRINT("USBPORT_RemoveDevice: DeviceHandle - %p, Flags - %x\n",
            DeviceHandle,
@@ -1623,6 +1626,37 @@ USBPORT_RemoveDevice(IN PDEVICE_OBJECT FdoDevice,
         USBPORT_FreeUsbAddress(FdoDevice, DeviceHandle->DeviceAddress);
     }
 
+    DPRINT("USBPORT_RemoveDevice: DeviceHandle->TtList.Flink - %p\n", 
DeviceHandle->TtList.Flink);
+
+    while (!IsListEmpty(&DeviceHandle->TtList))
+    {
+        TtExtension = CONTAINING_RECORD(DeviceHandle->TtList.Flink,
+                                        USB2_TT_EXTENSION,
+                                        Link);
+
+        RemoveHeadList(&DeviceHandle->TtList);
+
+        DPRINT("USBPORT_RemoveDevice: TtExtension - %p\n", TtExtension);
+
+        KeAcquireSpinLock(&FdoExtension->TtSpinLock, &OldIrql);
+
+        TtExtension->Flags |= USB2_TT_EXTENSION_FLAG_DELETED;
+
+        if (IsListEmpty(&TtExtension->EndpointList))
+        {
+            USBPORT_UpdateAllocatedBwTt(TtExtension);
+
+            for (ix = 0; ix < USB2_FRAMES; ix++)
+            {
+                FdoExtension->Bandwidth[ix] += TtExtension->MaxBandwidth;
+            }
+
+            ExFreePool(TtExtension);
+        }
+
+        KeReleaseSpinLock(&FdoExtension->TtSpinLock, OldIrql);
+    }
+
     KeReleaseSemaphore(&FdoExtension->DeviceSemaphore,
                        LOW_REALTIME_PRIORITY,
                        1,

Reply via email to