Endpoint->DeviceHandle = DeviceHandle;
Endpoint->LockCounter = -1;
+ Endpoint->TtExtension = DeviceHandle->TtExtension;
+
+ if (DeviceHandle->TtExtension)
+ {
+ ExInterlockedInsertTailList(&DeviceHandle->TtExtension->TtList,
+ &Endpoint->TtLink,
+ &FdoExtension->TtSpinLock);
+ }
+
+ if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
+ {
+ Endpoint->TtEndpoint = (PUSB2_TT_ENDPOINT)((ULONG_PTR)Endpoint +
+ sizeof(USBPORT_ENDPOINT) +
+ Packet->MiniPortEndpointSize);
+ }
+ else
+ {
+ Endpoint->TtEndpoint = NULL;
+ }
+
KeInitializeSpinLock(&Endpoint->EndpointSpinLock);
KeInitializeSpinLock(&Endpoint->StateChangeSpinLock);
EndpointProperties->TotalMaxPacketSize = MaxPacketSize *
(AdditionalTransaction + 1);
+ if (Endpoint->TtExtension)
+ {
+ EndpointProperties->HubAddr = Endpoint->TtExtension->DeviceAddress;
+ }
+ else
+ {
+ EndpointProperties->HubAddr = -1;
+ }
+
+ EndpointProperties->PortNumber = DeviceHandle->PortNumber;
+
switch (EndpointDescriptor->bmAttributes & USB_ENDPOINT_TYPE_MASK)
{
case USB_ENDPOINT_TYPE_CONTROL:
}
}
+ if (Endpoint->TtExtension)
+ {
+ KeAcquireSpinLock(&FdoExtension->TtSpinLock, &OldIrql);
+ RemoveEntryList(&Endpoint->TtLink);
+ KeReleaseSpinLock(&FdoExtension->TtSpinLock, OldIrql);
+ }
+
ExFreePoolWithTag(Endpoint, USB_PORT_TAG);
}
typedef struct _USBPORT_ENDPOINT *PUSBPORT_ENDPOINT;
typedef struct _USB2_HC_EXTENSION *PUSB2_HC_EXTENSION;
+typedef struct _USB2_TT_EXTENSION *PUSB2_TT_EXTENSION;
typedef struct _USB2_TT *PUSB2_TT;
+typedef struct _USB2_TT_ENDPOINT *PUSB2_TT_ENDPOINT;
typedef struct _USBPORT_PIPE_HANDLE {
ULONG Flags;
LIST_ENTRY DeviceHandleLink;
LONG DeviceHandleLock;
ULONG TtCount;
+ PUSB2_TT_EXTENSION TtExtension; // Transaction Translator
LIST_ENTRY TtList;
} USBPORT_DEVICE_HANDLE, *PUSBPORT_DEVICE_HANDLE;
PDEVICE_OBJECT FdoDevice;
PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer;
PUSBPORT_DEVICE_HANDLE DeviceHandle;
+ PUSB2_TT_EXTENSION TtExtension; // Transaction Translator
+ PUSB2_TT_ENDPOINT TtEndpoint;
USBPORT_ENDPOINT_PROPERTIES EndpointProperties;
ULONG EndpointWorker;
ULONG FrameNumber;
LIST_ENTRY FlushLink;
LIST_ENTRY FlushControllerLink;
LIST_ENTRY FlushAbortLink;
+ LIST_ENTRY TtLink;
} USBPORT_ENDPOINT, *PUSBPORT_ENDPOINT;
typedef struct _USBPORT_ISO_BLOCK *PUSBPORT_ISO_BLOCK;
/* Usb 2.0 HC Extension */
PUSB2_HC_EXTENSION Usb2Extension;
ULONG Bandwidth[32];
+ KSPIN_LOCK TtSpinLock;
/* Miniport extension should be aligned on 0x100 */
#if !defined(_M_X64)
- ULONG Padded[1];
+ ULONG Padded[64];
#else
ULONG Padded[0];
#endif
} USBPORT_DEVICE_EXTENSION, *PUSBPORT_DEVICE_EXTENSION;
#if !defined(_M_X64)
-C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x400);
+C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x500);
#else
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x600);
#endif