Adding. When an Endpoint Descriptor is scheduled to either control or bulk, it is done by inserting a HCD_ENDPOINT_DESCRIPTOR into the proper HCD_ED_LIST.Head and then linking the HCD_ENDPOINT_DESCRIPTOR.HcEd into HCD_ED_LIST.PhysicalHead. VOID InsertEDForEndpoint ( IN PHCD_ENDPOINT Endpoint ) { PHCD_DEVICE_DATA DeviceData; PHCD_ED_LIST List; PHCD_ENDPOINT_DESCRIPTOR ED, TailED; DeviceData = Endpoint->DeviceData; List = &DeviceData->EdList[Endpoint->ListIndex]; // // Initialize an endpoint descriptor for this endpoint // ED = AllocateEndpointDescriptor(DeviceData); ED->Endpoint = Endpoint; ED->ListIndex = Endpoint->ListIndex; ED->PhysicalAddress = PhysicalAddressOf(&ED->HcED); ED->HcED.Control = Endpoint->Control; Endpoint->HcdHeadP = AllocateTransferDescriptor(DeviceData); ED->HcED.HeadP = PhysicalAddressOf(&Endpoint->HcdHeadP->HcTD); Endpoint->HcdHeadP->PhysicalAddress = ED->HcED.TailP = ED->HcED.HeadP; Endpoint->HcdED = ED; ED->HcdHeadP->UsbdRequest = NULL; // // Link endpoint descriptor into HCD tracking queue // if (Endpoint->Type != Isochronous || IsListEmpty(&List->Head))) { // // Link ED into head of ED list // InsertHeadList (&List->Head, &ED->Link); ED->HcED.NextED = *List->PhysicalHead; *List->PhysicalHead = ED->PhysicalAddress; } else { // // Link ED into tail of ED list // TailED = CONTAINING_RECORD ( List->Head.Blink, HCD_ENDPOINT_DESCRIPTOR, Link); InsertTailList (&List->Head, &Endpoint->Link); ED->NextED = 0; TailED->NextED = ED->PhysicalAddress; } }
Appears in 2 contracts
Sources: Adopter’s Agreement for Open Host Controller Interface Reciprocal Covenant, Adopter’s Agreement for Open Host Controller Interface Reciprocal Covenant