/** Set value to ED specific field @Param Ed ED to be set @Param Field Field to be set @Param Value Value to set @retval EFI_SUCCESS Value set **/ EFI_STATUS OhciSetEDField ( IN ED_DESCRIPTOR *Ed, IN UINT32 Field, IN UINT32 Value ) { if (Field & ED_FUNC_ADD) { Ed->Word0.FunctionAddress = Value; } if (Field & ED_ENDPT_NUM) { Ed->Word0.EndPointNum = Value; } if (Field & ED_DIR) { Ed->Word0.Direction = Value; } if (Field & ED_SPEED) { Ed->Word0.Speed = Value; } if (Field & ED_SKIP) { Ed->Word0.Skip = Value; } if (Field & ED_FORMAT) { Ed->Word0.Format = Value; } if (Field & ED_MAX_PACKET) { Ed->Word0.MaxPacketSize = Value; } if (Field & ED_PDATA) { Ed->Word0.FreeSpace = Value; } if (Field & ED_ZERO) { Ed->Word2.Zero = Value; } if (Field & ED_TDTAIL_PTR) { Ed->TdTailPointer = Value; } if (Field & ED_HALTED) { Ed->Word2.Halted = Value; } if (Field & ED_DTTOGGLE) { Ed->Word2.ToggleCarry = Value; } if (Field & ED_TDHEAD_PTR) { Ed->Word2.TdHeadPointer = RIGHT_SHIFT_4 (Value); } if (Field & ED_NEXT_EDPTR) { Ed->NextED = Value; } return EFI_SUCCESS; }
/** Create a ED @Param Ohc Device private data @retval ED descriptor pointer **/ ED_DESCRIPTOR * OhciCreateED ( USB_OHCI_HC_DEV *Ohc ) { ED_DESCRIPTOR *Ed; Ed = UsbHcAllocateMem(Ohc->MemPool, sizeof (ED_DESCRIPTOR)); if (Ed == NULL) { return NULL; } Ed->Word0.Skip = 1; Ed->TdTailPointer = NULL; Ed->Word2.TdHeadPointer = RIGHT_SHIFT_4 ((UINT32) NULL); Ed->NextED = NULL; return Ed; }
/** Attach TD list to ED @Param Ed ED which TD list attach on @Param HeadTd Head of the TD list to attach @retval EFI_SUCCESS TD list attached on the ED **/ EFI_STATUS OhciAttachTDListToED ( IN ED_DESCRIPTOR *Ed, IN TD_DESCRIPTOR *HeadTd ) { TD_DESCRIPTOR *TempTd; TempTd = TD_PTR (Ed->Word2.TdHeadPointer); if (TempTd != NULL) { while (TempTd->NextTD != 0) { TempTd = (TD_DESCRIPTOR *)(UINTN)(TempTd->NextTD); } TempTd->NextTD = (UINT32)(UINTN)HeadTd; TempTd->NextTDPointer = (UINT32)(UINTN)HeadTd; } else { Ed->Word2.TdHeadPointer = RIGHT_SHIFT_4 ((UINT32)(UINTN)HeadTd); } return EFI_SUCCESS; }