Skip to content

Commit 641d277

Browse files
committed
[USBEHCI][USBPORT]
- misc bugfixes
1 parent c30b6a9 commit 641d277

4 files changed

Lines changed: 164 additions & 52 deletions

File tree

drivers/usb/usbehci/usbehci.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2796,7 +2796,7 @@ EHCI_SubmitIsoTransfer(IN PVOID ehciExtension,
27962796
ITD->HwTD.NextLink = LinkPointer;
27972797

27982798
/* setup frame link */
2799-
LinkPointer.AsULONG = ITD->PhysicalAddress;
2799+
LinkPointer.Address = (ITD->PhysicalAddress >> 5);
28002800
LinkPointer.Type = EHCI_LINK_TYPE_iTD;
28012801
LinkPointer.Terminate = 0;
28022802
LinkPointer.Reserved = 0;
@@ -2825,6 +2825,7 @@ EHCI_SubmitIsoTransfer(IN PVOID ehciExtension,
28252825
CurrentFrame++;
28262826
ITDCount++;
28272827
}
2828+
ASSERT(EhciTransfer->ActiveITD == NULL);
28282829
EhciTransfer->ActiveITD = FirstITD;
28292830
EhciEndpoint->FrameCount += ITDCount;
28302831
EhciTransfer->PendingTDs += ITDCount;
@@ -4424,6 +4425,8 @@ EHCI_ProcessCompletedITD(IN PEHCI_EXTENSION EhciExtension,
44244425

44254426
/* Mark iTD as free */
44264427
ITD->TdFlags &= ~EHCI_HCD_ITD_FLAG_ALLOCATED;
4428+
ITD->NextHcdTD = NULL;
4429+
ITD->EhciTransfer = NULL;
44274430
EhciEndpoint->RemainITDs++;
44284431

44294432
/* Update per-iTD count */
@@ -4463,42 +4466,47 @@ EHCI_UnlinkITDFromFrameList(IN PEHCI_EXTENSION EhciExtension,
44634466

44644467
HcResourcesVA = EhciExtension->HcResourcesVA;
44654468
FrameIndex = Frame % EHCI_FRAME_LIST_MAX_ENTRIES;
4466-
TargetPhysicalAddress = ITD->PhysicalAddress;
4469+
ASSERT(FrameIndex == ITD->ScheduledFrame);
4470+
TargetPhysicalAddress = (ITD->PhysicalAddress >> 5);
44674471

44684472
DPRINT_EHCI("EHCI_UnlinkITDFromFrameList: Unlinking iTD %p from frame %d\n", ITD, FrameIndex);
44694473

44704474
/* Search and unlink from frame list - simplified version */
44714475
CurrentLink.AsULONG = HcResourcesVA->PeriodicFrameList[FrameIndex];
44724476

4473-
if ((CurrentLink.AsULONG & LINK_POINTER_MASK) == TargetPhysicalAddress &&
4477+
if (CurrentLink.Address == TargetPhysicalAddress &&
44744478
CurrentLink.Type == EHCI_LINK_TYPE_iTD)
44754479
{
44764480
/* Found the iTD at the head of the frame list */
44774481
HcResourcesVA->PeriodicFrameList[FrameIndex] = ITD->HwTD.NextLink.AsULONG;
44784482
DPRINT_EHCI("EHCI_UnlinkITDFromFrameList: Unlinked iTD from frame %d head\n", FrameIndex);
4479-
EhciTransfer->ActiveITD = EhciTransfer->ActiveITD->NextHcdTD;
44804483
}
4481-
else
4484+
PrevITD = NULL;
4485+
CurrentITD = EhciTransfer->ActiveITD;
4486+
do
44824487
{
4483-
PrevITD = EhciTransfer->ActiveITD;
4484-
CurrentITD = PrevITD->NextHcdTD;
4485-
do
4488+
ASSERT(CurrentITD->EhciTransfer == EhciTransfer);
4489+
if (CurrentITD == ITD)
44864490
{
4487-
if (CurrentITD == ITD)
4491+
/* unlink */
4492+
if (PrevITD)
44884493
{
4489-
/* unlink */
44904494
PrevITD->NextHcdTD = CurrentITD->NextHcdTD;
4491-
PrevITD->HwTD.NextLink = CurrentITD->HwTD.NextLink;
4492-
break;
44934495
}
4494-
PrevITD = CurrentITD;
4495-
if (CurrentITD)
4496+
else
44964497
{
4497-
CurrentITD = CurrentITD->NextHcdTD;
4498+
EhciTransfer->ActiveITD = CurrentITD->NextHcdTD;
44984499
}
4499-
} while (CurrentITD != NULL);
4500-
}
4500+
break;
4501+
}
4502+
PrevITD = CurrentITD;
4503+
CurrentITD = CurrentITD->NextHcdTD;
4504+
} while (CurrentITD != NULL);
4505+
4506+
ASSERT(CurrentITD == ITD);
45014507
RtlClearBits(&EhciExtension->IsoBitmap, ITD->ScheduledFrame, 1);
4508+
ITD->NextHcdTD = NULL;
4509+
ITD->EhciTransfer = NULL;
45024510
}
45034511

45044512
BOOLEAN

drivers/usb/usbport/iso.c

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ USBPORT_InitializeIsoTransfer(PDEVICE_OBJECT FdoDevice,
6060
ULONG TotalPackets, Idx;
6161
ULONG Period;
6262
BOOLEAN IsHighSpeed;
63-
PUSBPORT_DEVICE_EXTENSION FdoExtension;
64-
PUSBPORT_REGISTRATION_PACKET Packet;
63+
//PUSBPORT_DEVICE_EXTENSION FdoExtension;
64+
//PUSBPORT_REGISTRATION_PACKET Packet;
6565

6666
DPRINT("USBPORT_InitializeIsoTransfer: FdoDevice - %p, Urb - %p Irp - %p\n", FdoDevice, Urb, Transfer->Irp);
6767

@@ -99,15 +99,15 @@ USBPORT_InitializeIsoTransfer(PDEVICE_OBJECT FdoDevice,
9999

100100
IsoBlock->TotalPackets = TotalPackets;
101101
IsoBlock->MappedBuffer = (PVOID)SgTable->MappedSystemVa;
102-
102+
#if 0
103103
if (Urb->TransferFlags & USBD_START_ISO_TRANSFER_ASAP)
104104
{
105105
FdoExtension = FdoDevice->DeviceExtension;
106106
Packet = &FdoExtension->MiniPortInterface->Packet;
107107
Urb->StartFrame = (Packet->Get32BitFrameNumber(FdoExtension->MiniPortExt) + 64) & 0xFFFFFFF0;
108108
DPRINT("Urb StartFrame %u\n", Urb->StartFrame);
109109
}
110-
110+
#endif
111111
/*
112112
* Walk each URB packet descriptor, compute its actual byte length
113113
* from the offset array, resolve the physical scatter/gather mapping,
@@ -131,8 +131,9 @@ USBPORT_InitializeIsoTransfer(PDEVICE_OBJECT FdoDevice,
131131
PktBytes = Urb->TransferBufferLength - UrbPkt->Offset;
132132

133133
if (PktBytes > MaxPkt)
134+
{
134135
PktBytes = MaxPkt;
135-
136+
}
136137
UrbPkt->Status = USBD_STATUS_NOT_ACCESSED;
137138

138139
/* Fill in the miniport packet data */
@@ -221,8 +222,8 @@ USBPORT_CompleteIsoTransfer(IN PVOID MiniPortExtension,
221222
PUSBPORT_ENDPOINT Endpoint;
222223
PUSBPORT_TRANSFER Transfer;
223224
struct _URB_ISOCH_TRANSFER *IsoUrb;
224-
USBD_ISO_PACKET_DESCRIPTOR *PacketDescriptor;
225-
ULONG i;
225+
USBD_ISO_PACKET_DESCRIPTOR *PacketDescriptor, * NextPacketDescriptor;
226+
ULONG i, PacketLength;
226227
ULONG CompletedLength = 0;
227228
ULONG RemainingLength = TransferLength;
228229

@@ -262,10 +263,22 @@ USBPORT_CompleteIsoTransfer(IN PVOID MiniPortExtension,
262263
{
263264
PacketDescriptor = &IsoUrb->IsoPacket[i];
264265

265-
if (RemainingLength >= Endpoint->EndpointProperties.MaxPacketSize)
266+
if (i + 1 < IsoUrb->NumberOfPackets)
267+
{
268+
NextPacketDescriptor = &IsoUrb->IsoPacket[i+1];
269+
PacketLength = NextPacketDescriptor->Offset - PacketDescriptor->Offset;
270+
}
271+
else
272+
{
273+
/* last packet */
274+
PacketLength = IsoUrb->TransferBufferLength - PacketDescriptor->Offset;
275+
}
276+
277+
278+
if (RemainingLength >= PacketLength)
266279
{
267280
PacketDescriptor->Status = USBD_STATUS_SUCCESS;
268-
PacketDescriptor->Length = Endpoint->EndpointProperties.MaxPacketSize;
281+
PacketDescriptor->Length = PacketLength;
269282
CompletedLength += PacketDescriptor->Length;
270283
RemainingLength -= PacketDescriptor->Length;
271284
}

drivers/usb/usbport/queue.c

Lines changed: 86 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,15 @@ USBPORT_CancelPendingTransferIrp(IN PDEVICE_OBJECT DeviceObject,
492492
Irp);
493493

494494
Urb = URB_FROM_IRP(Irp);
495-
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
495+
496+
if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
497+
{
498+
Transfer = Urb->UrbIsochronousTransfer.hca.Reserved8[0];
499+
}
500+
else
501+
{
502+
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
503+
}
496504
Endpoint = Transfer->Endpoint;
497505

498506
FdoDevice = Endpoint->FdoDevice;
@@ -559,7 +567,15 @@ USBPORT_CancelActiveTransferIrp(IN PDEVICE_OBJECT DeviceObject,
559567
}
560568

561569
Urb = URB_FROM_IRP(irp);
562-
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
570+
571+
if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
572+
{
573+
Transfer = Urb->UrbIsochronousTransfer.hca.Reserved8[0];
574+
}
575+
else
576+
{
577+
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
578+
}
563579
Endpoint = Transfer->Endpoint;
564580

565581
DPRINT_CORE("USBPORT_CancelActiveTransferIrp: irp - %p, Urb - %p, Transfer - %p\n",
@@ -977,7 +993,16 @@ USBPORT_QueuePendingUrbToEndpoint(IN PUSBPORT_ENDPOINT Endpoint,
977993
Endpoint,
978994
Urb);
979995

980-
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
996+
if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
997+
{
998+
Transfer = Urb->UrbIsochronousTransfer.hca.Reserved8[0];
999+
}
1000+
else
1001+
{
1002+
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
1003+
}
1004+
1005+
9811006
//FIXME USBPORT_ResetEndpointIdle();
9821007
InsertTailList(&Endpoint->PendingTransferList, &Transfer->TransferLink);
9831008
Urb->UrbHeader.Status = USBD_STATUS_PENDING;
@@ -998,7 +1023,16 @@ USBPORT_QueueActiveUrbToEndpoint(IN PUSBPORT_ENDPOINT Endpoint,
9981023
Endpoint,
9991024
Urb);
10001025

1001-
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
1026+
1027+
if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
1028+
{
1029+
Transfer = Urb->UrbIsochronousTransfer.hca.Reserved8[0];
1030+
}
1031+
else
1032+
{
1033+
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
1034+
}
1035+
10021036
FdoDevice = Endpoint->FdoDevice;
10031037
FdoExtension = FdoDevice->DeviceExtension;
10041038

@@ -1058,7 +1092,16 @@ USBPORT_QueuePendingTransferIrp(IN PIRP Irp)
10581092

10591093
Urb = URB_FROM_IRP(Irp);
10601094

1061-
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
1095+
1096+
if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
1097+
{
1098+
Transfer = Urb->UrbIsochronousTransfer.hca.Reserved8[0];
1099+
}
1100+
else
1101+
{
1102+
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
1103+
}
1104+
10621105
Endpoint = Transfer->Endpoint;
10631106

10641107
FdoDevice = Endpoint->FdoDevice;
@@ -1095,26 +1138,55 @@ USBPORT_QueueTransferUrb(IN PURB Urb)
10951138
if (Urb->UrbControlTransfer.TransferFlags & USBD_DEFAULT_PIPE_TRANSFER)
10961139
Urb->UrbHeader.Function = URB_FUNCTION_CONTROL_TRANSFER;
10971140

1098-
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
1141+
1142+
if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
1143+
{
1144+
Transfer = Urb->UrbIsochronousTransfer.hca.Reserved8[0];
1145+
}
1146+
else
1147+
{
1148+
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
1149+
}
1150+
10991151
Parameters = &Transfer->TransferParameters;
11001152

11011153
Endpoint = Transfer->Endpoint;
11021154
Endpoint->Flags &= ~ENDPOINT_FLAG_QUEUENE_EMPTY;
11031155

1104-
Parameters->TransferBufferLength = Urb->UrbControlTransfer.TransferBufferLength;
1105-
Parameters->TransferFlags = Urb->UrbControlTransfer.TransferFlags;
1106-
1107-
Transfer->TransferBufferMDL = Urb->UrbControlTransfer.TransferBufferMDL;
1108-
1109-
if (Urb->UrbControlTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN)
1156+
if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
11101157
{
1111-
Transfer->Direction = USBPORT_DMA_DIRECTION_FROM_DEVICE;
1158+
Parameters->TransferBufferLength = Urb->UrbIsochronousTransfer.TransferBufferLength;
1159+
Parameters->TransferFlags = Urb->UrbIsochronousTransfer.TransferFlags;
1160+
Transfer->TransferBufferMDL = Urb->UrbIsochronousTransfer.TransferBufferMDL;
1161+
if (Urb->UrbIsochronousTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN)
1162+
{
1163+
Transfer->Direction = USBPORT_DMA_DIRECTION_FROM_DEVICE;
1164+
}
1165+
else
1166+
{
1167+
Transfer->Direction = USBPORT_DMA_DIRECTION_TO_DEVICE;
1168+
}
11121169
}
11131170
else
11141171
{
1115-
Transfer->Direction = USBPORT_DMA_DIRECTION_TO_DEVICE;
1172+
Parameters->TransferBufferLength = Urb->UrbControlTransfer.TransferBufferLength;
1173+
Parameters->TransferFlags = Urb->UrbControlTransfer.TransferFlags;
1174+
1175+
Transfer->TransferBufferMDL = Urb->UrbControlTransfer.TransferBufferMDL;
1176+
1177+
if (Urb->UrbControlTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN)
1178+
{
1179+
Transfer->Direction = USBPORT_DMA_DIRECTION_FROM_DEVICE;
1180+
}
1181+
else
1182+
{
1183+
Transfer->Direction = USBPORT_DMA_DIRECTION_TO_DEVICE;
1184+
}
1185+
1186+
Urb->UrbControlTransfer.TransferBufferLength = 0;
11161187
}
11171188

1189+
11181190
if (Endpoint->EndpointProperties.TransferType == USBPORT_TRANSFER_TYPE_CONTROL)
11191191
{
11201192
RtlCopyMemory(&Parameters->SetupPacket,
@@ -1125,8 +1197,6 @@ USBPORT_QueueTransferUrb(IN PURB Urb)
11251197
DPRINT_URB("... URB TransferBufferLength - %x\n",
11261198
Urb->UrbControlTransfer.TransferBufferLength);
11271199

1128-
Urb->UrbControlTransfer.TransferBufferLength = 0;
1129-
11301200
Irp = Transfer->Irp;
11311201

11321202
if (Irp)

0 commit comments

Comments
 (0)