2 The OHCI register operation routines.
4 Copyright (c) 2013-2015 Intel Corporation.
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21 Get OHCI operational reg value
23 @param PciIo PciIo protocol instance
24 @param Offset Offset of the operational reg
26 @retval Value of the register
30 OhciGetOperationalReg (
31 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
38 Status
= PciIo
->Mem
.Read(PciIo
, EfiPciIoWidthUint32
, OHC_BAR_INDEX
, Offset
, 1, &Value
);
44 Set OHCI operational reg value
46 @param PciIo PCI Bus Io protocol instance
47 @param Offset Offset of the operational reg
48 @param Value Value to set
50 @retval EFI_SUCCESS Value set to the reg
56 OhciSetOperationalReg (
57 IN EFI_PCI_IO_PROTOCOL
*PciIo
,
64 Status
= PciIo
->Mem
.Write(PciIo
, EfiPciIoWidthUint32
, OHC_BAR_INDEX
, Offset
, 1, Value
);
70 Get HcRevision reg value
72 @param PciIo PCI Bus Io protocol instance
74 @retval Value of the register
81 IN EFI_PCI_IO_PROTOCOL
*PciIo
84 return OhciGetOperationalReg (PciIo
, HC_REVISION
);
90 @param Ohc UHC private data
91 @param Field Field to set
92 @param Value Value to set
94 @retval EFI_SUCCESS Value set
100 IN USB_OHCI_HC_DEV
*Ohc
,
108 Status
= EFI_SUCCESS
;
109 *(UINT32
*) &Reset
= OhciGetOperationalReg (Ohc
->PciIo
, USBHOST_OFFSET_UHCHR
);
111 if (Field
& RESET_SYSTEM_BUS
) {
115 if (Field
& RESET_HOST_CONTROLLER
) {
119 if (Field
& RESET_CLOCK_GENERATION
) {
123 if (Field
& RESET_SSE_GLOBAL
) {
127 if (Field
& RESET_PSPL
) {
131 if (Field
& RESET_PCPL
) {
135 if (Field
& RESET_SSEP1
) {
139 if (Field
& RESET_SSEP2
) {
143 if (Field
& RESET_SSEP3
) {
147 OhciSetOperationalReg (Ohc
->PciIo
, USBHOST_OFFSET_UHCHR
, &Reset
);
154 Get specific field of HcReset reg value
156 @param Ohc UHC private data
157 @param Field Field to get
159 @retval Value of the field
165 IN USB_OHCI_HC_DEV
*Ohc
,
173 *(UINT32
*) &Reset
= OhciGetOperationalReg (Ohc
->PciIo
, USBHOST_OFFSET_UHCHR
);
177 case RESET_SYSTEM_BUS
:
181 case RESET_HOST_CONTROLLER
:
185 case RESET_CLOCK_GENERATION
:
189 case RESET_SSE_GLOBAL
:
223 Set HcControl reg value
225 @param Ohc UHC private data
226 @param Field Field to set
227 @param Value Value to set
229 @retval EFI_SUCCESS Value set
235 IN USB_OHCI_HC_DEV
*Ohc
,
245 *(UINT32
*) &Control
= OhciGetOperationalReg (Ohc
->PciIo
, HC_CONTROL
);
247 if (Field
& CONTROL_BULK_RATIO
) {
248 Control
.ControlBulkRatio
= Value
;
251 if (Field
& HC_FUNCTIONAL_STATE
) {
252 Control
.FunctionalState
= Value
;
255 if (Field
& PERIODIC_ENABLE
) {
256 Control
.PeriodicEnable
= Value
;
259 if (Field
& CONTROL_ENABLE
) {
260 Control
.ControlEnable
= Value
;
263 if (Field
& ISOCHRONOUS_ENABLE
) {
264 Control
.IsochronousEnable
= Value
;
267 if (Field
& BULK_ENABLE
) {
268 Control
.BulkEnable
= Value
;
271 if (Field
& INTERRUPT_ROUTING
) {
272 Control
.InterruptRouting
= Value
;
275 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_CONTROL
, &Control
);
283 Get specific field of HcControl reg value
285 @param Ohc UHC private data
286 @param Field Field to get
288 @retval Value of the field
295 IN USB_OHCI_HC_DEV
*Ohc
,
301 *(UINT32
*) &Control
= OhciGetOperationalReg (Ohc
->PciIo
, HC_CONTROL
);
304 case CONTROL_BULK_RATIO
:
305 return Control
.ControlBulkRatio
;
307 case PERIODIC_ENABLE
:
308 return Control
.PeriodicEnable
;
311 return Control
.ControlEnable
;
314 return Control
.BulkEnable
;
316 case ISOCHRONOUS_ENABLE
:
317 return Control
.IsochronousEnable
;
319 case HC_FUNCTIONAL_STATE
:
320 return Control
.FunctionalState
;
322 case INTERRUPT_ROUTING
:
323 return Control
.InterruptRouting
;
334 Set HcCommand reg value
336 @param Ohc UHC private data
337 @param Field Field to set
338 @param Value Value to set
340 @retval EFI_SUCCESS Value set
345 OhciSetHcCommandStatus (
346 IN USB_OHCI_HC_DEV
*Ohc
,
352 HcCOMMAND_STATUS CommandStatus
;
354 ZeroMem (&CommandStatus
, sizeof (HcCOMMAND_STATUS
));
356 if(Field
& HC_RESET
){
357 CommandStatus
.HcReset
= Value
;
360 if(Field
& CONTROL_LIST_FILLED
){
361 CommandStatus
.ControlListFilled
= Value
;
364 if(Field
& BULK_LIST_FILLED
){
365 CommandStatus
.BulkListFilled
= Value
;
368 if(Field
& CHANGE_OWNER_REQUEST
){
369 CommandStatus
.ChangeOwnerRequest
= Value
;
372 if(Field
& SCHEDULE_OVERRUN_COUNT
){
373 CommandStatus
.ScheduleOverrunCount
= Value
;
376 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_COMMAND_STATUS
, &CommandStatus
);
383 Get specific field of HcCommand reg value
385 @param Ohc UHC private data
386 @param Field Field to get
388 @retval Value of the field
393 OhciGetHcCommandStatus (
394 IN USB_OHCI_HC_DEV
*Ohc
,
398 HcCOMMAND_STATUS CommandStatus
;
400 *(UINT32
*) &CommandStatus
= OhciGetOperationalReg (Ohc
->PciIo
, HC_COMMAND_STATUS
);
404 return CommandStatus
.HcReset
;
406 case CONTROL_LIST_FILLED
:
407 return CommandStatus
.ControlListFilled
;
409 case BULK_LIST_FILLED
:
410 return CommandStatus
.BulkListFilled
;
412 case CHANGE_OWNER_REQUEST
:
413 return CommandStatus
.ChangeOwnerRequest
;
415 case SCHEDULE_OVERRUN_COUNT
:
416 return CommandStatus
.ScheduleOverrunCount
;
427 Clear specific fields of Interrupt Status
429 @param Ohc UHC private data
430 @param Field Field to clear
432 @retval EFI_SUCCESS Fields cleared
437 OhciClearInterruptStatus (
438 IN USB_OHCI_HC_DEV
*Ohc
,
443 HcINTERRUPT_STATUS InterruptStatus
;
445 ZeroMem (&InterruptStatus
, sizeof (HcINTERRUPT_STATUS
));
447 if(Field
& SCHEDULE_OVERRUN
){
448 InterruptStatus
.SchedulingOverrun
= 1;
451 if(Field
& WRITEBACK_DONE_HEAD
){
452 InterruptStatus
.WriteBackDone
= 1;
454 if(Field
& START_OF_FRAME
){
455 InterruptStatus
.Sof
= 1;
458 if(Field
& RESUME_DETECT
){
459 InterruptStatus
.ResumeDetected
= 1;
462 if(Field
& UNRECOVERABLE_ERROR
){
463 InterruptStatus
.UnrecoverableError
= 1;
466 if(Field
& FRAME_NUMBER_OVERFLOW
){
467 InterruptStatus
.FrameNumOverflow
= 1;
470 if(Field
& ROOTHUB_STATUS_CHANGE
){
471 InterruptStatus
.RHStatusChange
= 1;
474 if(Field
& OWNERSHIP_CHANGE
){
475 InterruptStatus
.OwnerChange
= 1;
478 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_STATUS
, &InterruptStatus
);
485 Get fields of HcInterrupt reg value
487 @param Ohc UHC private data
488 @param Field Field to get
490 @retval Value of the field
495 OhciGetHcInterruptStatus (
496 IN USB_OHCI_HC_DEV
*Ohc
,
500 HcINTERRUPT_STATUS InterruptStatus
;
502 *(UINT32
*) &InterruptStatus
= OhciGetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_STATUS
);
505 case SCHEDULE_OVERRUN
:
506 return InterruptStatus
.SchedulingOverrun
;
509 case WRITEBACK_DONE_HEAD
:
510 return InterruptStatus
.WriteBackDone
;
514 return InterruptStatus
.Sof
;
518 return InterruptStatus
.ResumeDetected
;
521 case UNRECOVERABLE_ERROR
:
522 return InterruptStatus
.UnrecoverableError
;
525 case FRAME_NUMBER_OVERFLOW
:
526 return InterruptStatus
.FrameNumOverflow
;
529 case ROOTHUB_STATUS_CHANGE
:
530 return InterruptStatus
.RHStatusChange
;
533 case OWNERSHIP_CHANGE
:
534 return InterruptStatus
.OwnerChange
;
546 Set Interrupt Control reg value
548 @param Ohc UHC private data
549 @param StatEnable Enable or Disable
550 @param Field Field to set
551 @param Value Value to set
553 @retval EFI_SUCCESS Value set
558 OhciSetInterruptControl (
559 IN USB_OHCI_HC_DEV
*Ohc
,
560 IN BOOLEAN StatEnable
,
566 HcINTERRUPT_CONTROL InterruptState
;
569 ZeroMem (&InterruptState
, sizeof (HcINTERRUPT_CONTROL
));
571 if(Field
& SCHEDULE_OVERRUN
) {
572 InterruptState
.SchedulingOverrunInt
= Value
;
575 if(Field
& WRITEBACK_DONE_HEAD
) {
576 InterruptState
.WriteBackDoneInt
= Value
;
578 if(Field
& START_OF_FRAME
) {
579 InterruptState
.SofInt
= Value
;
582 if(Field
& RESUME_DETECT
) {
583 InterruptState
.ResumeDetectedInt
= Value
;
586 if(Field
& UNRECOVERABLE_ERROR
) {
587 InterruptState
.UnrecoverableErrorInt
= Value
;
590 if(Field
& FRAME_NUMBER_OVERFLOW
) {
591 InterruptState
.FrameNumOverflowInt
= Value
;
594 if(Field
& ROOTHUB_STATUS_CHANGE
) {
595 InterruptState
.RHStatusChangeInt
= Value
;
598 if(Field
& OWNERSHIP_CHANGE
) {
599 InterruptState
.OwnerChangedInt
= Value
;
602 if(Field
& MASTER_INTERRUPT
) {
603 InterruptState
.MasterInterruptEnable
= Value
;
607 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_ENABLE
, &InterruptState
);
609 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_DISABLE
, &InterruptState
);
617 Get field of HcInterruptControl reg value
619 @param Ohc UHC private data
620 @param Field Field to get
622 @retval Value of the field
627 OhciGetHcInterruptControl (
628 IN USB_OHCI_HC_DEV
*Ohc
,
632 HcINTERRUPT_CONTROL InterruptState
;
634 *(UINT32
*) &InterruptState
= OhciGetOperationalReg (Ohc
->PciIo
, HC_INTERRUPT_ENABLE
);
637 case SCHEDULE_OVERRUN
:
638 return InterruptState
.SchedulingOverrunInt
;
641 case WRITEBACK_DONE_HEAD
:
642 return InterruptState
.WriteBackDoneInt
;
646 return InterruptState
.SofInt
;
650 return InterruptState
.ResumeDetectedInt
;
653 case UNRECOVERABLE_ERROR
:
654 return InterruptState
.UnrecoverableErrorInt
;
657 case FRAME_NUMBER_OVERFLOW
:
658 return InterruptState
.FrameNumOverflowInt
;
661 case ROOTHUB_STATUS_CHANGE
:
662 return InterruptState
.RHStatusChangeInt
;
665 case OWNERSHIP_CHANGE
:
666 return InterruptState
.OwnerChangedInt
;
669 case MASTER_INTERRUPT
:
670 return InterruptState
.MasterInterruptEnable
;
682 Set memory pointer of specific type
684 @param Ohc UHC private data
685 @param PointerType Type of the pointer to set
686 @param Value Value to set
688 @retval EFI_SUCCESS Memory pointer set
693 OhciSetMemoryPointer(
694 IN USB_OHCI_HC_DEV
*Ohc
,
695 IN UINT32 PointerType
,
702 Status
= OhciSetOperationalReg (Ohc
->PciIo
, PointerType
, &Value
);
704 if (EFI_ERROR (Status
)) {
708 Verify
= OhciGetOperationalReg (Ohc
->PciIo
, PointerType
);
710 while (Verify
!= (UINT32
)(UINTN
) Value
) {
712 Verify
= OhciGetOperationalReg (Ohc
->PciIo
, PointerType
);
721 Get memory pointer of specific type
723 @param Ohc UHC private data
724 @param PointerType Type of pointer
726 @retval Memory pointer of the specific type
731 OhciGetMemoryPointer (
732 IN USB_OHCI_HC_DEV
*Ohc
,
733 IN UINT32 PointerType
737 return (VOID
*)(UINTN
) OhciGetOperationalReg (Ohc
->PciIo
, PointerType
);
743 Set Frame Interval value
745 @param Ohc UHC private data
746 @param Field Field to set
747 @param Value Value to set
749 @retval EFI_SUCCESS Value set
754 OhciSetFrameInterval (
755 IN USB_OHCI_HC_DEV
*Ohc
,
761 HcFRM_INTERVAL FrameInterval
;
764 *(UINT32
*) &FrameInterval
= OhciGetOperationalReg(Ohc
->PciIo
, HC_FRM_INTERVAL
);
766 if (Field
& FRAME_INTERVAL
) {
767 FrameInterval
.FrmIntervalToggle
= !FrameInterval
.FrmIntervalToggle
;
768 FrameInterval
.FrameInterval
= Value
;
771 if (Field
& FS_LARGEST_DATA_PACKET
) {
772 FrameInterval
.FSMaxDataPacket
= Value
;
775 if (Field
& FRMINT_TOGGLE
) {
776 FrameInterval
.FrmIntervalToggle
= Value
;
779 Status
= OhciSetOperationalReg (
791 Get field of frame interval reg value
793 @param Ohc UHC private data
794 @param Field Field to get
796 @retval Value of the field
801 OhciGetFrameInterval (
802 IN USB_OHCI_HC_DEV
*Ohc
,
806 HcFRM_INTERVAL FrameInterval
;
808 *(UINT32
*) &FrameInterval
= OhciGetOperationalReg (Ohc
->PciIo
, HC_FRM_INTERVAL
);
812 return FrameInterval
.FrameInterval
;
815 case FS_LARGEST_DATA_PACKET
:
816 return FrameInterval
.FSMaxDataPacket
;
820 return FrameInterval
.FrmIntervalToggle
;
832 Set Frame Remaining reg value
834 @param Ohc UHC private data
835 @param Value Value to set
837 @retval EFI_SUCCESS Value set
842 OhciSetFrameRemaining (
843 IN USB_OHCI_HC_DEV
*Ohc
,
848 HcFRAME_REMAINING FrameRemaining
;
851 *(UINT32
*) &FrameRemaining
= OhciGetOperationalReg (Ohc
->PciIo
, HC_FRM_REMAINING
);
853 FrameRemaining
.FrameRemaining
= Value
;
854 FrameRemaining
.FrameRemainingToggle
= !FrameRemaining
.FrameRemainingToggle
;
856 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_FRM_REMAINING
, &FrameRemaining
);
862 Get value of frame remaining reg
864 @param Ohc UHC private data
865 @param Field Field to get
867 @retval Value of frame remaining reg
871 OhciGetFrameRemaining (
872 IN USB_OHCI_HC_DEV
*Ohc
,
877 HcFRAME_REMAINING FrameRemaining
;
880 *(UINT32
*) &FrameRemaining
= OhciGetOperationalReg (Ohc
->PciIo
, HC_FRM_REMAINING
);
883 case FRAME_REMAINING
:
884 return FrameRemaining
.FrameRemaining
;
887 case FRAME_REMAIN_TOGGLE
:
888 return FrameRemaining
.FrameRemainingToggle
;
900 Set frame number reg value
902 @param Ohc UHC private data
903 @param Value Value to set
905 @retval EFI_SUCCESS Value set
911 IN USB_OHCI_HC_DEV
*Ohc
,
917 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_FRM_NUMBER
, &Value
);
924 Get frame number reg value
926 @param Ohc UHC private data
928 @retval Value of frame number reg
934 IN USB_OHCI_HC_DEV
*Ohc
937 return OhciGetOperationalReg(Ohc
->PciIo
, HC_FRM_NUMBER
);
942 Set period start reg value
944 @param Ohc UHC private data
945 @param Value Value to set
947 @retval EFI_SUCCESS Value set
952 OhciSetPeriodicStart (
953 IN USB_OHCI_HC_DEV
*Ohc
,
960 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_PERIODIC_START
, &Value
);
968 Get periodic start reg value
970 @param Ohc UHC private data
972 @param Value of periodic start reg
977 OhciGetPeriodicStart (
978 IN USB_OHCI_HC_DEV
*Ohc
981 return OhciGetOperationalReg(Ohc
->PciIo
, HC_PERIODIC_START
);
987 Set Ls Threshold reg value
989 @param Ohc UHC private data
990 @param Value Value to set
992 @retval EFI_SUCCESS Value set
998 IN USB_OHCI_HC_DEV
*Ohc
,
1005 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_LS_THREASHOLD
, &Value
);
1013 Get Ls Threshold reg value
1015 @param Ohc UHC private data
1017 @retval Value of Ls Threshold reg
1022 OhciGetLsThreshold (
1023 IN USB_OHCI_HC_DEV
*Ohc
1026 return OhciGetOperationalReg(Ohc
->PciIo
, HC_LS_THREASHOLD
);
1031 Set Root Hub Descriptor reg value
1033 @param Ohc UHC private data
1034 @param Field Field to set
1035 @param Value Value to set
1037 @retval EFI_SUCCESS Value set
1041 OhciSetRootHubDescriptor (
1042 IN USB_OHCI_HC_DEV
*Ohc
,
1048 HcRH_DESC_A DescriptorA
;
1049 HcRH_DESC_B DescriptorB
;
1052 if (Field
& (RH_DEV_REMOVABLE
| RH_PORT_PWR_CTRL_MASK
)) {
1053 *(UINT32
*) &DescriptorB
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_B
);
1055 if(Field
& RH_DEV_REMOVABLE
) {
1056 DescriptorB
.DeviceRemovable
= Value
;
1058 if(Field
& RH_PORT_PWR_CTRL_MASK
) {
1059 DescriptorB
.PortPowerControlMask
= Value
;
1062 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_B
, &DescriptorB
);
1067 *(UINT32
*)&DescriptorA
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_A
);
1069 if(Field
& RH_NUM_DS_PORTS
) {
1070 DescriptorA
.NumDownStrmPorts
= Value
;
1072 if(Field
& RH_NO_PSWITCH
) {
1073 DescriptorA
.NoPowerSwitch
= Value
;
1075 if(Field
& RH_PSWITCH_MODE
) {
1076 DescriptorA
.PowerSwitchMode
= Value
;
1078 if(Field
& RH_DEVICE_TYPE
) {
1079 DescriptorA
.DeviceType
= Value
;
1081 if(Field
& RH_OC_PROT_MODE
) {
1082 DescriptorA
.OverCurrentProtMode
= Value
;
1084 if(Field
& RH_NOC_PROT
) {
1085 DescriptorA
.NoOverCurrentProtMode
= Value
;
1087 if(Field
& RH_NO_POTPGT
) {
1088 DescriptorA
.PowerOnToPowerGoodTime
= Value
;
1091 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_A
, &DescriptorA
);
1099 Get Root Hub Descriptor reg value
1101 @param Ohc UHC private data
1102 @param Field Field to get
1104 @retval Value of the field
1109 OhciGetRootHubDescriptor (
1110 IN USB_OHCI_HC_DEV
*Ohc
,
1114 HcRH_DESC_A DescriptorA
;
1115 HcRH_DESC_B DescriptorB
;
1118 *(UINT32
*) &DescriptorA
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_A
);
1119 *(UINT32
*) &DescriptorB
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_DESC_B
);
1122 case RH_DEV_REMOVABLE
:
1123 return DescriptorB
.DeviceRemovable
;
1126 case RH_PORT_PWR_CTRL_MASK
:
1127 return DescriptorB
.PortPowerControlMask
;
1130 case RH_NUM_DS_PORTS
:
1131 return DescriptorA
.NumDownStrmPorts
;
1135 return DescriptorA
.NoPowerSwitch
;
1138 case RH_PSWITCH_MODE
:
1139 return DescriptorA
.PowerSwitchMode
;
1142 case RH_DEVICE_TYPE
:
1143 return DescriptorA
.DeviceType
;
1146 case RH_OC_PROT_MODE
:
1147 return DescriptorA
.OverCurrentProtMode
;
1151 return DescriptorA
.NoOverCurrentProtMode
;
1155 return DescriptorA
.PowerOnToPowerGoodTime
;
1168 Set Root Hub Status reg value
1170 @param Ohc UHC private data
1171 @param Field Field to set
1173 @retval EFI_SUCCESS Value set
1178 OhciSetRootHubStatus (
1179 IN USB_OHCI_HC_DEV
*Ohc
,
1184 HcRH_STATUS RootHubStatus
;
1187 ZeroMem (&RootHubStatus
, sizeof(HcRH_STATUS
));
1189 if(Field
& RH_LOCAL_PSTAT
){
1190 RootHubStatus
.LocalPowerStat
= 1;
1192 if(Field
& RH_OC_ID
){
1193 RootHubStatus
.OverCurrentIndicator
= 1;
1195 if(Field
& RH_REMOTE_WK_ENABLE
){
1196 RootHubStatus
.DevRemoteWakeupEnable
= 1;
1198 if(Field
& RH_LOCAL_PSTAT_CHANGE
){
1199 RootHubStatus
.LocalPowerStatChange
= 1;
1201 if(Field
& RH_OC_ID_CHANGE
){
1202 RootHubStatus
.OverCurrentIndicatorChange
= 1;
1204 if(Field
& RH_CLR_RMT_WK_ENABLE
){
1205 RootHubStatus
.ClearRemoteWakeupEnable
= 1;
1208 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_STATUS
, &RootHubStatus
);
1216 Get Root Hub Status reg value
1218 @param Ohc UHC private data
1219 @param Field Field to get
1221 @retval Value of the field
1226 OhciGetRootHubStatus (
1227 IN USB_OHCI_HC_DEV
*Ohc
,
1231 HcRH_STATUS RootHubStatus
;
1234 *(UINT32
*) &RootHubStatus
= OhciGetOperationalReg (Ohc
->PciIo
, HC_RH_STATUS
);
1237 case RH_LOCAL_PSTAT
:
1238 return RootHubStatus
.LocalPowerStat
;
1241 return RootHubStatus
.OverCurrentIndicator
;
1243 case RH_REMOTE_WK_ENABLE
:
1244 return RootHubStatus
.DevRemoteWakeupEnable
;
1246 case RH_LOCAL_PSTAT_CHANGE
:
1247 return RootHubStatus
.LocalPowerStatChange
;
1249 case RH_OC_ID_CHANGE
:
1250 return RootHubStatus
.OverCurrentIndicatorChange
;
1252 case RH_CLR_RMT_WK_ENABLE
:
1253 return RootHubStatus
.ClearRemoteWakeupEnable
;
1265 Set Root Hub Port Status reg value
1267 @param Ohc UHC private data
1268 @param Index Index of the port
1269 @param Field Field to set
1271 @retval EFI_SUCCESS Value set
1276 OhciSetRootHubPortStatus (
1277 IN USB_OHCI_HC_DEV
*Ohc
,
1283 HcRHPORT_STATUS PortStatus
;
1286 ZeroMem (&PortStatus
, sizeof(HcRHPORT_STATUS
));
1288 if (Field
& RH_CLEAR_PORT_ENABLE
) {
1289 PortStatus
.CurrentConnectStat
= 1;
1291 if (Field
& RH_SET_PORT_ENABLE
) {
1292 PortStatus
.EnableStat
= 1;
1294 if (Field
& RH_SET_PORT_SUSPEND
) {
1295 PortStatus
.SuspendStat
= 1;
1297 if (Field
& RH_CLEAR_SUSPEND_STATUS
) {
1298 PortStatus
.OCIndicator
= 1;
1300 if (Field
& RH_SET_PORT_RESET
) {
1301 PortStatus
.ResetStat
= 1;
1303 if (Field
& RH_SET_PORT_POWER
) {
1304 PortStatus
.PowerStat
= 1;
1306 if (Field
& RH_CLEAR_PORT_POWER
) {
1307 PortStatus
.LsDeviceAttached
= 1;
1309 if (Field
& RH_CONNECT_STATUS_CHANGE
) {
1310 PortStatus
.ConnectStatChange
= 1;
1312 if (Field
& RH_PORT_ENABLE_STAT_CHANGE
) {
1313 PortStatus
.EnableStatChange
= 1;
1315 if (Field
& RH_PORT_SUSPEND_STAT_CHANGE
) {
1316 PortStatus
.SuspendStatChange
= 1;
1318 if (Field
& RH_OC_INDICATOR_CHANGE
) {
1319 PortStatus
.OCIndicatorChange
= 1;
1321 if (Field
& RH_PORT_RESET_STAT_CHANGE
) {
1322 PortStatus
.ResetStatChange
= 1;
1325 Status
= OhciSetOperationalReg (Ohc
->PciIo
, HC_RH_PORT_STATUS
+ (Index
* 4), &PortStatus
);
1333 Get Root Hub Port Status reg value
1335 @param Ohc UHC private data
1336 @param Index Index of the port
1337 @param Field Field to get
1339 @retval Value of the field and index
1344 OhciReadRootHubPortStatus (
1345 IN USB_OHCI_HC_DEV
*Ohc
,
1350 HcRHPORT_STATUS PortStatus
;
1352 *(UINT32
*) &PortStatus
= OhciGetOperationalReg (
1354 HC_RH_PORT_STATUS
+ (Index
* 4)
1358 case RH_CURR_CONNECT_STAT
:
1359 return PortStatus
.CurrentConnectStat
;
1361 case RH_PORT_ENABLE_STAT
:
1362 return PortStatus
.EnableStat
;
1364 case RH_PORT_SUSPEND_STAT
:
1365 return PortStatus
.SuspendStat
;
1367 case RH_PORT_OC_INDICATOR
:
1368 return PortStatus
.OCIndicator
;
1370 case RH_PORT_RESET_STAT
:
1371 return PortStatus
.ResetStat
;
1373 case RH_PORT_POWER_STAT
:
1374 return PortStatus
.PowerStat
;
1376 case RH_LSDEVICE_ATTACHED
:
1377 return PortStatus
.LsDeviceAttached
;
1379 case RH_CONNECT_STATUS_CHANGE
:
1380 return PortStatus
.ConnectStatChange
;
1382 case RH_PORT_ENABLE_STAT_CHANGE
:
1383 return PortStatus
.EnableStatChange
;
1385 case RH_PORT_SUSPEND_STAT_CHANGE
:
1386 return PortStatus
.SuspendStatChange
;
1388 case RH_OC_INDICATOR_CHANGE
:
1389 return PortStatus
.OCIndicatorChange
;
1391 case RH_PORT_RESET_STAT_CHANGE
:
1392 return PortStatus
.ResetStatChange
;