2 The OHCI register operation routines.
4 Copyright (c) 2013-2015 Intel Corporation.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
15 Get OHCI operational reg value
17 @param PciIo PciIo protocol instance
18 @param Offset Offset of the operational reg
20 @retval Value of the register
24 OhciGetOperationalReg (
25 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
31 PciIo
->Mem
.Read(PciIo
, EfiPciIoWidthUint32
, OHC_BAR_INDEX
, Offset
, 1, &Value
);
37 Set OHCI operational reg value
39 @param PciIo PCI Bus Io protocol instance
40 @param Offset Offset of the operational reg
41 @param Value Value to set
43 @retval EFI_SUCCESS Value set to the reg
49 OhciSetOperationalReg (
50 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
57 Status
= PciIo
->Mem
.Write(PciIo
, EfiPciIoWidthUint32
, OHC_BAR_INDEX
, Offset
, 1, Value
);
63 Get HcRevision reg value
65 @param PciIo PCI Bus Io protocol instance
67 @retval Value of the register
74 IN EFI_PCI_IO_PROTOCOL
*PciIo
77 return OhciGetOperationalReg (PciIo
, HC_REVISION
);
83 @param Ohc UHC private data
84 @param Field Field to set
85 @param Value Value to set
87 @retval EFI_SUCCESS Value set
93 IN USB_OHCI_HC_DEV
*Ohc
,
100 *(UINT32
*) &Reset
= OhciGetOperationalReg (Ohc
->PciIo
, USBHOST_OFFSET_UHCHR
);
102 if (Field
& RESET_SYSTEM_BUS
) {
106 if (Field
& RESET_HOST_CONTROLLER
) {
110 if (Field
& RESET_CLOCK_GENERATION
) {
114 if (Field
& RESET_SSE_GLOBAL
) {
118 if (Field
& RESET_PSPL
) {
122 if (Field
& RESET_PCPL
) {
126 if (Field
& RESET_SSEP1
) {
130 if (Field
& RESET_SSEP2
) {
134 if (Field
& RESET_SSEP3
) {
138 OhciSetOperationalReg (Ohc
->PciIo
, USBHOST_OFFSET_UHCHR
, &Reset
);
145 Get specific field of HcReset reg value
147 @param Ohc UHC private data
148 @param Field Field to get
150 @retval Value of the field
156 IN USB_OHCI_HC_DEV
*Ohc
,
164 *(UINT32
*) &Reset
= OhciGetOperationalReg (Ohc
->PciIo
, USBHOST_OFFSET_UHCHR
);
168 case RESET_SYSTEM_BUS
:
172 case RESET_HOST_CONTROLLER
:
176 case RESET_CLOCK_GENERATION
:
180 case RESET_SSE_GLOBAL
:
214 Set HcControl reg value
216 @param Ohc UHC private data
217 @param Field Field to set
218 @param Value Value to set
220 @retval EFI_SUCCESS Value set
226 IN USB_OHCI_HC_DEV
*Ohc
,
236 *(UINT32
*) &Control
= OhciGetOperationalReg (Ohc
->PciIo
, HC_CONTROL
);
238 if (Field
& CONTROL_BULK_RATIO
) {
239 Control
.ControlBulkRatio
= Value
;
242 if (Field
& HC_FUNCTIONAL_STATE
) {
243 Control
.FunctionalState
= Value
;
246 if (Field
& PERIODIC_ENABLE
) {
247 Control
.PeriodicEnable
= Value
;
250 if (Field
& CONTROL_ENABLE
) {
251 Control
.ControlEnable
= Value
;
254 if (Field
& ISOCHRONOUS_ENABLE
) {
255 Control
.IsochronousEnable
= Value
;
258 if (Field
& BULK_ENABLE
) {
259 Control
.BulkEnable
= Value
;
262 if (Field
& INTERRUPT_ROUTING
) {
263 Control
.InterruptRouting
= Value
;
266 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_CONTROL
, &Control
);
274 Get specific field of HcControl reg value
276 @param Ohc UHC private data
277 @param Field Field to get
279 @retval Value of the field
286 IN USB_OHCI_HC_DEV
*Ohc
,
292 *(UINT32
*) &Control
= OhciGetOperationalReg (Ohc
->PciIo
, HC_CONTROL
);
295 case CONTROL_BULK_RATIO
:
296 return Control
.ControlBulkRatio
;
298 case PERIODIC_ENABLE
:
299 return Control
.PeriodicEnable
;
302 return Control
.ControlEnable
;
305 return Control
.BulkEnable
;
307 case ISOCHRONOUS_ENABLE
:
308 return Control
.IsochronousEnable
;
310 case HC_FUNCTIONAL_STATE
:
311 return Control
.FunctionalState
;
313 case INTERRUPT_ROUTING
:
314 return Control
.InterruptRouting
;
325 Set HcCommand reg value
327 @param Ohc UHC private data
328 @param Field Field to set
329 @param Value Value to set
331 @retval EFI_SUCCESS Value set
336 OhciSetHcCommandStatus (
337 IN USB_OHCI_HC_DEV
*Ohc
,
343 HcCOMMAND_STATUS CommandStatus
;
345 ZeroMem (&CommandStatus
, sizeof (HcCOMMAND_STATUS
));
347 if(Field
& HC_RESET
){
348 CommandStatus
.HcReset
= Value
;
351 if(Field
& CONTROL_LIST_FILLED
){
352 CommandStatus
.ControlListFilled
= Value
;
355 if(Field
& BULK_LIST_FILLED
){
356 CommandStatus
.BulkListFilled
= Value
;
359 if(Field
& CHANGE_OWNER_REQUEST
){
360 CommandStatus
.ChangeOwnerRequest
= Value
;
363 if(Field
& SCHEDULE_OVERRUN_COUNT
){
364 CommandStatus
.ScheduleOverrunCount
= Value
;
367 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_COMMAND_STATUS
, &CommandStatus
);
374 Get specific field of HcCommand reg value
376 @param Ohc UHC private data
377 @param Field Field to get
379 @retval Value of the field
384 OhciGetHcCommandStatus (
385 IN USB_OHCI_HC_DEV
*Ohc
,
389 HcCOMMAND_STATUS CommandStatus
;
391 *(UINT32
*) &CommandStatus
= OhciGetOperationalReg (Ohc
->PciIo
, HC_COMMAND_STATUS
);
395 return CommandStatus
.HcReset
;
397 case CONTROL_LIST_FILLED
:
398 return CommandStatus
.ControlListFilled
;
400 case BULK_LIST_FILLED
:
401 return CommandStatus
.BulkListFilled
;
403 case CHANGE_OWNER_REQUEST
:
404 return CommandStatus
.ChangeOwnerRequest
;
406 case SCHEDULE_OVERRUN_COUNT
:
407 return CommandStatus
.ScheduleOverrunCount
;
418 Clear specific fields of Interrupt Status
420 @param Ohc UHC private data
421 @param Field Field to clear
423 @retval EFI_SUCCESS Fields cleared
428 OhciClearInterruptStatus (
429 IN USB_OHCI_HC_DEV
*Ohc
,
434 HcINTERRUPT_STATUS InterruptStatus
;
436 ZeroMem (&InterruptStatus
, sizeof (HcINTERRUPT_STATUS
));
438 if(Field
& SCHEDULE_OVERRUN
){
439 InterruptStatus
.SchedulingOverrun
= 1;
442 if(Field
& WRITEBACK_DONE_HEAD
){
443 InterruptStatus
.WriteBackDone
= 1;
445 if(Field
& START_OF_FRAME
){
446 InterruptStatus
.Sof
= 1;
449 if(Field
& RESUME_DETECT
){
450 InterruptStatus
.ResumeDetected
= 1;
453 if(Field
& UNRECOVERABLE_ERROR
){
454 InterruptStatus
.UnrecoverableError
= 1;
457 if(Field
& FRAME_NUMBER_OVERFLOW
){
458 InterruptStatus
.FrameNumOverflow
= 1;
461 if(Field
& ROOTHUB_STATUS_CHANGE
){
462 InterruptStatus
.RHStatusChange
= 1;
465 if(Field
& OWNERSHIP_CHANGE
){
466 InterruptStatus
.OwnerChange
= 1;
469 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_STATUS
, &InterruptStatus
);
476 Get fields of HcInterrupt reg value
478 @param Ohc UHC private data
479 @param Field Field to get
481 @retval Value of the field
486 OhciGetHcInterruptStatus (
487 IN USB_OHCI_HC_DEV
*Ohc
,
491 HcINTERRUPT_STATUS InterruptStatus
;
493 *(UINT32
*) &InterruptStatus
= OhciGetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_STATUS
);
496 case SCHEDULE_OVERRUN
:
497 return InterruptStatus
.SchedulingOverrun
;
500 case WRITEBACK_DONE_HEAD
:
501 return InterruptStatus
.WriteBackDone
;
505 return InterruptStatus
.Sof
;
509 return InterruptStatus
.ResumeDetected
;
512 case UNRECOVERABLE_ERROR
:
513 return InterruptStatus
.UnrecoverableError
;
516 case FRAME_NUMBER_OVERFLOW
:
517 return InterruptStatus
.FrameNumOverflow
;
520 case ROOTHUB_STATUS_CHANGE
:
521 return InterruptStatus
.RHStatusChange
;
524 case OWNERSHIP_CHANGE
:
525 return InterruptStatus
.OwnerChange
;
537 Set Interrupt Control reg value
539 @param Ohc UHC private data
540 @param StatEnable Enable or Disable
541 @param Field Field to set
542 @param Value Value to set
544 @retval EFI_SUCCESS Value set
549 OhciSetInterruptControl (
550 IN USB_OHCI_HC_DEV
*Ohc
,
551 IN BOOLEAN StatEnable
,
557 HcINTERRUPT_CONTROL InterruptState
;
560 ZeroMem (&InterruptState
, sizeof (HcINTERRUPT_CONTROL
));
562 if(Field
& SCHEDULE_OVERRUN
) {
563 InterruptState
.SchedulingOverrunInt
= Value
;
566 if(Field
& WRITEBACK_DONE_HEAD
) {
567 InterruptState
.WriteBackDoneInt
= Value
;
569 if(Field
& START_OF_FRAME
) {
570 InterruptState
.SofInt
= Value
;
573 if(Field
& RESUME_DETECT
) {
574 InterruptState
.ResumeDetectedInt
= Value
;
577 if(Field
& UNRECOVERABLE_ERROR
) {
578 InterruptState
.UnrecoverableErrorInt
= Value
;
581 if(Field
& FRAME_NUMBER_OVERFLOW
) {
582 InterruptState
.FrameNumOverflowInt
= Value
;
585 if(Field
& ROOTHUB_STATUS_CHANGE
) {
586 InterruptState
.RHStatusChangeInt
= Value
;
589 if(Field
& OWNERSHIP_CHANGE
) {
590 InterruptState
.OwnerChangedInt
= Value
;
593 if(Field
& MASTER_INTERRUPT
) {
594 InterruptState
.MasterInterruptEnable
= Value
;
598 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_ENABLE
, &InterruptState
);
600 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_DISABLE
, &InterruptState
);
608 Get field of HcInterruptControl reg value
610 @param Ohc UHC private data
611 @param Field Field to get
613 @retval Value of the field
618 OhciGetHcInterruptControl (
619 IN USB_OHCI_HC_DEV
*Ohc
,
623 HcINTERRUPT_CONTROL InterruptState
;
625 *(UINT32
*) &InterruptState
= OhciGetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_ENABLE
);
628 case SCHEDULE_OVERRUN
:
629 return InterruptState
.SchedulingOverrunInt
;
632 case WRITEBACK_DONE_HEAD
:
633 return InterruptState
.WriteBackDoneInt
;
637 return InterruptState
.SofInt
;
641 return InterruptState
.ResumeDetectedInt
;
644 case UNRECOVERABLE_ERROR
:
645 return InterruptState
.UnrecoverableErrorInt
;
648 case FRAME_NUMBER_OVERFLOW
:
649 return InterruptState
.FrameNumOverflowInt
;
652 case ROOTHUB_STATUS_CHANGE
:
653 return InterruptState
.RHStatusChangeInt
;
656 case OWNERSHIP_CHANGE
:
657 return InterruptState
.OwnerChangedInt
;
660 case MASTER_INTERRUPT
:
661 return InterruptState
.MasterInterruptEnable
;
673 Set memory pointer of specific type
675 @param Ohc UHC private data
676 @param PointerType Type of the pointer to set
677 @param Value Value to set
679 @retval EFI_SUCCESS Memory pointer set
684 OhciSetMemoryPointer(
685 IN USB_OHCI_HC_DEV
*Ohc
,
686 IN UINT32 PointerType
,
693 Status
= OhciSetOperationalReg (Ohc
->PciIo
, PointerType
, &Value
);
695 if (EFI_ERROR (Status
)) {
699 Verify
= OhciGetOperationalReg (Ohc
->PciIo
, PointerType
);
701 while (Verify
!= (UINT32
)(UINTN
) Value
) {
703 Verify
= OhciGetOperationalReg (Ohc
->PciIo
, PointerType
);
712 Get memory pointer of specific type
714 @param Ohc UHC private data
715 @param PointerType Type of pointer
717 @retval Memory pointer of the specific type
722 OhciGetMemoryPointer (
723 IN USB_OHCI_HC_DEV
*Ohc
,
724 IN UINT32 PointerType
728 return (VOID
*)(UINTN
) OhciGetOperationalReg (Ohc
->PciIo
, PointerType
);
734 Set Frame Interval value
736 @param Ohc UHC private data
737 @param Field Field to set
738 @param Value Value to set
740 @retval EFI_SUCCESS Value set
745 OhciSetFrameInterval (
746 IN USB_OHCI_HC_DEV
*Ohc
,
752 HcFRM_INTERVAL FrameInterval
;
755 *(UINT32
*) &FrameInterval
= OhciGetOperationalReg(Ohc
->PciIo
, HC_FRM_INTERVAL
);
757 if (Field
& FRAME_INTERVAL
) {
758 FrameInterval
.FrmIntervalToggle
= !FrameInterval
.FrmIntervalToggle
;
759 FrameInterval
.FrameInterval
= Value
;
762 if (Field
& FS_LARGEST_DATA_PACKET
) {
763 FrameInterval
.FSMaxDataPacket
= Value
;
766 if (Field
& FRMINT_TOGGLE
) {
767 FrameInterval
.FrmIntervalToggle
= Value
;
770 Status
= OhciSetOperationalReg (
782 Get field of frame interval reg value
784 @param Ohc UHC private data
785 @param Field Field to get
787 @retval Value of the field
792 OhciGetFrameInterval (
793 IN USB_OHCI_HC_DEV
*Ohc
,
797 HcFRM_INTERVAL FrameInterval
;
799 *(UINT32
*) &FrameInterval
= OhciGetOperationalReg (Ohc
->PciIo
, HC_FRM_INTERVAL
);
803 return FrameInterval
.FrameInterval
;
806 case FS_LARGEST_DATA_PACKET
:
807 return FrameInterval
.FSMaxDataPacket
;
811 return FrameInterval
.FrmIntervalToggle
;
823 Set Frame Remaining reg value
825 @param Ohc UHC private data
826 @param Value Value to set
828 @retval EFI_SUCCESS Value set
833 OhciSetFrameRemaining (
834 IN USB_OHCI_HC_DEV
*Ohc
,
839 HcFRAME_REMAINING FrameRemaining
;
842 *(UINT32
*) &FrameRemaining
= OhciGetOperationalReg (Ohc
->PciIo
, HC_FRM_REMAINING
);
844 FrameRemaining
.FrameRemaining
= Value
;
845 FrameRemaining
.FrameRemainingToggle
= !FrameRemaining
.FrameRemainingToggle
;
847 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_FRM_REMAINING
, &FrameRemaining
);
853 Get value of frame remaining reg
855 @param Ohc UHC private data
856 @param Field Field to get
858 @retval Value of frame remaining reg
862 OhciGetFrameRemaining (
863 IN USB_OHCI_HC_DEV
*Ohc
,
868 HcFRAME_REMAINING FrameRemaining
;
871 *(UINT32
*) &FrameRemaining
= OhciGetOperationalReg (Ohc
->PciIo
, HC_FRM_REMAINING
);
874 case FRAME_REMAINING
:
875 return FrameRemaining
.FrameRemaining
;
878 case FRAME_REMAIN_TOGGLE
:
879 return FrameRemaining
.FrameRemainingToggle
;
891 Set frame number reg value
893 @param Ohc UHC private data
894 @param Value Value to set
896 @retval EFI_SUCCESS Value set
902 IN USB_OHCI_HC_DEV
*Ohc
,
908 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_FRM_NUMBER
, &Value
);
915 Get frame number reg value
917 @param Ohc UHC private data
919 @retval Value of frame number reg
925 IN USB_OHCI_HC_DEV
*Ohc
928 return OhciGetOperationalReg(Ohc
->PciIo
, HC_FRM_NUMBER
);
933 Set period start reg value
935 @param Ohc UHC private data
936 @param Value Value to set
938 @retval EFI_SUCCESS Value set
943 OhciSetPeriodicStart (
944 IN USB_OHCI_HC_DEV
*Ohc
,
951 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_PERIODIC_START
, &Value
);
959 Get periodic start reg value
961 @param Ohc UHC private data
963 @param Value of periodic start reg
968 OhciGetPeriodicStart (
969 IN USB_OHCI_HC_DEV
*Ohc
972 return OhciGetOperationalReg(Ohc
->PciIo
, HC_PERIODIC_START
);
978 Set Ls Threshold reg value
980 @param Ohc UHC private data
981 @param Value Value to set
983 @retval EFI_SUCCESS Value set
989 IN USB_OHCI_HC_DEV
*Ohc
,
996 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_LS_THREASHOLD
, &Value
);
1004 Get Ls Threshold reg value
1006 @param Ohc UHC private data
1008 @retval Value of Ls Threshold reg
1013 OhciGetLsThreshold (
1014 IN USB_OHCI_HC_DEV
*Ohc
1017 return OhciGetOperationalReg(Ohc
->PciIo
, HC_LS_THREASHOLD
);
1022 Set Root Hub Descriptor reg value
1024 @param Ohc UHC private data
1025 @param Field Field to set
1026 @param Value Value to set
1028 @retval EFI_SUCCESS Value set
1032 OhciSetRootHubDescriptor (
1033 IN USB_OHCI_HC_DEV
*Ohc
,
1039 HcRH_DESC_A DescriptorA
;
1040 HcRH_DESC_B DescriptorB
;
1043 if (Field
& (RH_DEV_REMOVABLE
| RH_PORT_PWR_CTRL_MASK
)) {
1044 *(UINT32
*) &DescriptorB
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_B
);
1046 if(Field
& RH_DEV_REMOVABLE
) {
1047 DescriptorB
.DeviceRemovable
= Value
;
1049 if(Field
& RH_PORT_PWR_CTRL_MASK
) {
1050 DescriptorB
.PortPowerControlMask
= Value
;
1053 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_B
, &DescriptorB
);
1058 *(UINT32
*)&DescriptorA
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_A
);
1060 if(Field
& RH_NUM_DS_PORTS
) {
1061 DescriptorA
.NumDownStrmPorts
= Value
;
1063 if(Field
& RH_NO_PSWITCH
) {
1064 DescriptorA
.NoPowerSwitch
= Value
;
1066 if(Field
& RH_PSWITCH_MODE
) {
1067 DescriptorA
.PowerSwitchMode
= Value
;
1069 if(Field
& RH_DEVICE_TYPE
) {
1070 DescriptorA
.DeviceType
= Value
;
1072 if(Field
& RH_OC_PROT_MODE
) {
1073 DescriptorA
.OverCurrentProtMode
= Value
;
1075 if(Field
& RH_NOC_PROT
) {
1076 DescriptorA
.NoOverCurrentProtMode
= Value
;
1078 if(Field
& RH_NO_POTPGT
) {
1079 DescriptorA
.PowerOnToPowerGoodTime
= Value
;
1082 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_A
, &DescriptorA
);
1090 Get Root Hub Descriptor reg value
1092 @param Ohc UHC private data
1093 @param Field Field to get
1095 @retval Value of the field
1100 OhciGetRootHubDescriptor (
1101 IN USB_OHCI_HC_DEV
*Ohc
,
1105 HcRH_DESC_A DescriptorA
;
1106 HcRH_DESC_B DescriptorB
;
1109 *(UINT32
*) &DescriptorA
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_A
);
1110 *(UINT32
*) &DescriptorB
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_B
);
1113 case RH_DEV_REMOVABLE
:
1114 return DescriptorB
.DeviceRemovable
;
1117 case RH_PORT_PWR_CTRL_MASK
:
1118 return DescriptorB
.PortPowerControlMask
;
1121 case RH_NUM_DS_PORTS
:
1122 return DescriptorA
.NumDownStrmPorts
;
1126 return DescriptorA
.NoPowerSwitch
;
1129 case RH_PSWITCH_MODE
:
1130 return DescriptorA
.PowerSwitchMode
;
1133 case RH_DEVICE_TYPE
:
1134 return DescriptorA
.DeviceType
;
1137 case RH_OC_PROT_MODE
:
1138 return DescriptorA
.OverCurrentProtMode
;
1142 return DescriptorA
.NoOverCurrentProtMode
;
1146 return DescriptorA
.PowerOnToPowerGoodTime
;
1159 Set Root Hub Status reg value
1161 @param Ohc UHC private data
1162 @param Field Field to set
1164 @retval EFI_SUCCESS Value set
1169 OhciSetRootHubStatus (
1170 IN USB_OHCI_HC_DEV
*Ohc
,
1175 HcRH_STATUS RootHubStatus
;
1178 ZeroMem (&RootHubStatus
, sizeof(HcRH_STATUS
));
1180 if(Field
& RH_LOCAL_PSTAT
){
1181 RootHubStatus
.LocalPowerStat
= 1;
1183 if(Field
& RH_OC_ID
){
1184 RootHubStatus
.OverCurrentIndicator
= 1;
1186 if(Field
& RH_REMOTE_WK_ENABLE
){
1187 RootHubStatus
.DevRemoteWakeupEnable
= 1;
1189 if(Field
& RH_LOCAL_PSTAT_CHANGE
){
1190 RootHubStatus
.LocalPowerStatChange
= 1;
1192 if(Field
& RH_OC_ID_CHANGE
){
1193 RootHubStatus
.OverCurrentIndicatorChange
= 1;
1195 if(Field
& RH_CLR_RMT_WK_ENABLE
){
1196 RootHubStatus
.ClearRemoteWakeupEnable
= 1;
1199 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_STATUS
, &RootHubStatus
);
1207 Get Root Hub Status reg value
1209 @param Ohc UHC private data
1210 @param Field Field to get
1212 @retval Value of the field
1217 OhciGetRootHubStatus (
1218 IN USB_OHCI_HC_DEV
*Ohc
,
1222 HcRH_STATUS RootHubStatus
;
1225 *(UINT32
*) &RootHubStatus
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_STATUS
);
1228 case RH_LOCAL_PSTAT
:
1229 return RootHubStatus
.LocalPowerStat
;
1232 return RootHubStatus
.OverCurrentIndicator
;
1234 case RH_REMOTE_WK_ENABLE
:
1235 return RootHubStatus
.DevRemoteWakeupEnable
;
1237 case RH_LOCAL_PSTAT_CHANGE
:
1238 return RootHubStatus
.LocalPowerStatChange
;
1240 case RH_OC_ID_CHANGE
:
1241 return RootHubStatus
.OverCurrentIndicatorChange
;
1243 case RH_CLR_RMT_WK_ENABLE
:
1244 return RootHubStatus
.ClearRemoteWakeupEnable
;
1256 Set Root Hub Port Status reg value
1258 @param Ohc UHC private data
1259 @param Index Index of the port
1260 @param Field Field to set
1262 @retval EFI_SUCCESS Value set
1267 OhciSetRootHubPortStatus (
1268 IN USB_OHCI_HC_DEV
*Ohc
,
1274 HcRHPORT_STATUS PortStatus
;
1277 ZeroMem (&PortStatus
, sizeof(HcRHPORT_STATUS
));
1279 if (Field
& RH_CLEAR_PORT_ENABLE
) {
1280 PortStatus
.CurrentConnectStat
= 1;
1282 if (Field
& RH_SET_PORT_ENABLE
) {
1283 PortStatus
.EnableStat
= 1;
1285 if (Field
& RH_SET_PORT_SUSPEND
) {
1286 PortStatus
.SuspendStat
= 1;
1288 if (Field
& RH_CLEAR_SUSPEND_STATUS
) {
1289 PortStatus
.OCIndicator
= 1;
1291 if (Field
& RH_SET_PORT_RESET
) {
1292 PortStatus
.ResetStat
= 1;
1294 if (Field
& RH_SET_PORT_POWER
) {
1295 PortStatus
.PowerStat
= 1;
1297 if (Field
& RH_CLEAR_PORT_POWER
) {
1298 PortStatus
.LsDeviceAttached
= 1;
1300 if (Field
& RH_CONNECT_STATUS_CHANGE
) {
1301 PortStatus
.ConnectStatChange
= 1;
1303 if (Field
& RH_PORT_ENABLE_STAT_CHANGE
) {
1304 PortStatus
.EnableStatChange
= 1;
1306 if (Field
& RH_PORT_SUSPEND_STAT_CHANGE
) {
1307 PortStatus
.SuspendStatChange
= 1;
1309 if (Field
& RH_OC_INDICATOR_CHANGE
) {
1310 PortStatus
.OCIndicatorChange
= 1;
1312 if (Field
& RH_PORT_RESET_STAT_CHANGE
) {
1313 PortStatus
.ResetStatChange
= 1;
1316 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_PORT_STATUS
+ (Index
* 4), &PortStatus
);
1324 Get Root Hub Port Status reg value
1326 @param Ohc UHC private data
1327 @param Index Index of the port
1328 @param Field Field to get
1330 @retval Value of the field and index
1335 OhciReadRootHubPortStatus (
1336 IN USB_OHCI_HC_DEV
*Ohc
,
1341 HcRHPORT_STATUS PortStatus
;
1343 *(UINT32
*) &PortStatus
= OhciGetOperationalReg (
1345 HC_RH_PORT_STATUS
+ (Index
* 4)
1349 case RH_CURR_CONNECT_STAT
:
1350 return PortStatus
.CurrentConnectStat
;
1352 case RH_PORT_ENABLE_STAT
:
1353 return PortStatus
.EnableStat
;
1355 case RH_PORT_SUSPEND_STAT
:
1356 return PortStatus
.SuspendStat
;
1358 case RH_PORT_OC_INDICATOR
:
1359 return PortStatus
.OCIndicator
;
1361 case RH_PORT_RESET_STAT
:
1362 return PortStatus
.ResetStat
;
1364 case RH_PORT_POWER_STAT
:
1365 return PortStatus
.PowerStat
;
1367 case RH_LSDEVICE_ATTACHED
:
1368 return PortStatus
.LsDeviceAttached
;
1370 case RH_CONNECT_STATUS_CHANGE
:
1371 return PortStatus
.ConnectStatChange
;
1373 case RH_PORT_ENABLE_STAT_CHANGE
:
1374 return PortStatus
.EnableStatChange
;
1376 case RH_PORT_SUSPEND_STAT_CHANGE
:
1377 return PortStatus
.SuspendStatChange
;
1379 case RH_OC_INDICATOR_CHANGE
:
1380 return PortStatus
.OCIndicatorChange
;
1382 case RH_PORT_RESET_STAT_CHANGE
:
1383 return PortStatus
.ResetStatChange
;