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 Ohc UHC private data
18 @param Offset Offset of the operational reg
20 @retval Value of the register
24 OhciGetOperationalReg (
25 IN USB_OHCI_HC_DEV
*Ohc
,
30 return MmioRead32 (Ohc
->UsbHostControllerBaseAddress
+ Offset
);
35 Set OHCI operational reg value
37 @param Ohc UHC private data
38 @param Offset Offset of the operational reg
39 @param Value Value to set
41 @retval EFI_SUCCESS Value set to the reg
47 OhciSetOperationalReg (
53 MmioWrite32(Ohc
->UsbHostControllerBaseAddress
+ Offset
, *Value
);
58 Get HcRevision reg value
60 @param Ohc UHC private data
62 @retval Value of the register
72 return OhciGetOperationalReg (Ohc
, HC_REVISION
);
79 @param Ohc UHC private data
80 @param Field Field to set
81 @param Value Value to set
83 @retval EFI_SUCCESS Value set
89 IN USB_OHCI_HC_DEV
*Ohc
,
96 *(UINT32
*) &Reset
= OhciGetOperationalReg (Ohc
, USBHOST_OFFSET_UHCHR
);
98 if (Field
& RESET_SYSTEM_BUS
) {
102 if (Field
& RESET_HOST_CONTROLLER
) {
106 if (Field
& RESET_CLOCK_GENERATION
) {
110 if (Field
& RESET_SSE_GLOBAL
) {
114 if (Field
& RESET_PSPL
) {
118 if (Field
& RESET_PCPL
) {
122 if (Field
& RESET_SSEP1
) {
126 if (Field
& RESET_SSEP2
) {
130 if (Field
& RESET_SSEP3
) {
134 OhciSetOperationalReg (Ohc
, USBHOST_OFFSET_UHCHR
, (UINT32
*)&Reset
);
141 Get specific field of HcReset reg value
143 @param Ohc UHC private data
144 @param Field Field to get
146 @retval Value of the field
152 IN USB_OHCI_HC_DEV
*Ohc
,
160 *(UINT32
*) &Reset
= OhciGetOperationalReg (Ohc
, USBHOST_OFFSET_UHCHR
);
164 case RESET_SYSTEM_BUS
:
168 case RESET_HOST_CONTROLLER
:
172 case RESET_CLOCK_GENERATION
:
176 case RESET_SSE_GLOBAL
:
210 Set HcControl reg value
212 @param Ohc UHC private data
213 @param Field Field to set
214 @param Value Value to set
216 @retval EFI_SUCCESS Value set
222 IN USB_OHCI_HC_DEV
*Ohc
,
232 *(UINT32
*) &Control
= OhciGetOperationalReg (Ohc
, HC_CONTROL
);
234 if (Field
& CONTROL_BULK_RATIO
) {
235 Control
.ControlBulkRatio
= Value
;
238 if (Field
& HC_FUNCTIONAL_STATE
) {
239 Control
.FunctionalState
= Value
;
242 if (Field
& PERIODIC_ENABLE
) {
243 Control
.PeriodicEnable
= Value
;
246 if (Field
& CONTROL_ENABLE
) {
247 Control
.ControlEnable
= Value
;
250 if (Field
& ISOCHRONOUS_ENABLE
) {
251 Control
.IsochronousEnable
= Value
;
254 if (Field
& BULK_ENABLE
) {
255 Control
.BulkEnable
= Value
;
258 if (Field
& INTERRUPT_ROUTING
) {
259 Control
.InterruptRouting
= Value
;
262 Status
= OhciSetOperationalReg (Ohc
, HC_CONTROL
, (UINT32
*)&Control
);
270 Get specific field of HcControl reg value
272 @param Ohc UHC private data
273 @param Field Field to get
275 @retval Value of the field
282 IN USB_OHCI_HC_DEV
*Ohc
,
288 *(UINT32
*) &Control
= OhciGetOperationalReg (Ohc
, HC_CONTROL
);
291 case CONTROL_BULK_RATIO
:
292 return Control
.ControlBulkRatio
;
294 case PERIODIC_ENABLE
:
295 return Control
.PeriodicEnable
;
298 return Control
.ControlEnable
;
301 return Control
.BulkEnable
;
303 case ISOCHRONOUS_ENABLE
:
304 return Control
.IsochronousEnable
;
306 case HC_FUNCTIONAL_STATE
:
307 return Control
.FunctionalState
;
309 case INTERRUPT_ROUTING
:
310 return Control
.InterruptRouting
;
321 Set HcCommand reg value
323 @param Ohc UHC private data
324 @param Field Field to set
325 @param Value Value to set
327 @retval EFI_SUCCESS Value set
332 OhciSetHcCommandStatus (
333 IN USB_OHCI_HC_DEV
*Ohc
,
339 HcCOMMAND_STATUS CommandStatus
;
341 ZeroMem (&CommandStatus
, sizeof (HcCOMMAND_STATUS
));
343 if(Field
& HC_RESET
){
344 CommandStatus
.HcReset
= Value
;
347 if(Field
& CONTROL_LIST_FILLED
){
348 CommandStatus
.ControlListFilled
= Value
;
351 if(Field
& BULK_LIST_FILLED
){
352 CommandStatus
.BulkListFilled
= Value
;
355 if(Field
& CHANGE_OWNER_REQUEST
){
356 CommandStatus
.ChangeOwnerRequest
= Value
;
359 if(Field
& SCHEDULE_OVERRUN_COUNT
){
360 CommandStatus
.ScheduleOverrunCount
= Value
;
363 Status
= OhciSetOperationalReg (Ohc
, HC_COMMAND_STATUS
, (UINT32
*)&CommandStatus
);
370 Get specific field of HcCommand reg value
372 @param Ohc UHC private data
373 @param Field Field to get
375 @retval Value of the field
380 OhciGetHcCommandStatus (
381 IN USB_OHCI_HC_DEV
*Ohc
,
385 HcCOMMAND_STATUS CommandStatus
;
387 *(UINT32
*) &CommandStatus
= OhciGetOperationalReg (Ohc
, HC_COMMAND_STATUS
);
391 return CommandStatus
.HcReset
;
393 case CONTROL_LIST_FILLED
:
394 return CommandStatus
.ControlListFilled
;
396 case BULK_LIST_FILLED
:
397 return CommandStatus
.BulkListFilled
;
399 case CHANGE_OWNER_REQUEST
:
400 return CommandStatus
.ChangeOwnerRequest
;
402 case SCHEDULE_OVERRUN_COUNT
:
403 return CommandStatus
.ScheduleOverrunCount
;
414 Clear specific fields of Interrupt Status
416 @param Ohc UHC private data
417 @param Field Field to clear
419 @retval EFI_SUCCESS Fields cleared
424 OhciClearInterruptStatus (
425 IN USB_OHCI_HC_DEV
*Ohc
,
430 HcINTERRUPT_STATUS InterruptStatus
;
432 ZeroMem (&InterruptStatus
, sizeof (HcINTERRUPT_STATUS
));
434 if(Field
& SCHEDULE_OVERRUN
){
435 InterruptStatus
.SchedulingOverrun
= 1;
438 if(Field
& WRITEBACK_DONE_HEAD
){
439 InterruptStatus
.WriteBackDone
= 1;
441 if(Field
& START_OF_FRAME
){
442 InterruptStatus
.Sof
= 1;
445 if(Field
& RESUME_DETECT
){
446 InterruptStatus
.ResumeDetected
= 1;
449 if(Field
& UNRECOVERABLE_ERROR
){
450 InterruptStatus
.UnrecoverableError
= 1;
453 if(Field
& FRAME_NUMBER_OVERFLOW
){
454 InterruptStatus
.FrameNumOverflow
= 1;
457 if(Field
& ROOTHUB_STATUS_CHANGE
){
458 InterruptStatus
.RHStatusChange
= 1;
461 if(Field
& OWNERSHIP_CHANGE
){
462 InterruptStatus
.OwnerChange
= 1;
465 Status
= OhciSetOperationalReg (Ohc
, HC_INTERRUPT_STATUS
, (UINT32
*)&InterruptStatus
);
472 Get fields of HcInterrupt reg value
474 @param Ohc UHC private data
475 @param Field Field to get
477 @retval Value of the field
482 OhciGetHcInterruptStatus (
483 IN USB_OHCI_HC_DEV
*Ohc
,
487 HcINTERRUPT_STATUS InterruptStatus
;
489 *(UINT32
*) &InterruptStatus
= OhciGetOperationalReg (Ohc
, HC_INTERRUPT_STATUS
);
492 case SCHEDULE_OVERRUN
:
493 return InterruptStatus
.SchedulingOverrun
;
496 case WRITEBACK_DONE_HEAD
:
497 return InterruptStatus
.WriteBackDone
;
501 return InterruptStatus
.Sof
;
505 return InterruptStatus
.ResumeDetected
;
508 case UNRECOVERABLE_ERROR
:
509 return InterruptStatus
.UnrecoverableError
;
512 case FRAME_NUMBER_OVERFLOW
:
513 return InterruptStatus
.FrameNumOverflow
;
516 case ROOTHUB_STATUS_CHANGE
:
517 return InterruptStatus
.RHStatusChange
;
520 case OWNERSHIP_CHANGE
:
521 return InterruptStatus
.OwnerChange
;
533 Set Interrupt Control reg value
535 @param Ohc UHC private data
536 @param StatEnable Enable or Disable
537 @param Field Field to set
538 @param Value Value to set
540 @retval EFI_SUCCESS Value set
545 OhciSetInterruptControl (
546 IN USB_OHCI_HC_DEV
*Ohc
,
547 IN BOOLEAN StatEnable
,
553 HcINTERRUPT_CONTROL InterruptState
;
556 ZeroMem (&InterruptState
, sizeof (HcINTERRUPT_CONTROL
));
558 if(Field
& SCHEDULE_OVERRUN
) {
559 InterruptState
.SchedulingOverrunInt
= Value
;
562 if(Field
& WRITEBACK_DONE_HEAD
) {
563 InterruptState
.WriteBackDoneInt
= Value
;
565 if(Field
& START_OF_FRAME
) {
566 InterruptState
.SofInt
= Value
;
569 if(Field
& RESUME_DETECT
) {
570 InterruptState
.ResumeDetectedInt
= Value
;
573 if(Field
& UNRECOVERABLE_ERROR
) {
574 InterruptState
.UnrecoverableErrorInt
= Value
;
577 if(Field
& FRAME_NUMBER_OVERFLOW
) {
578 InterruptState
.FrameNumOverflowInt
= Value
;
581 if(Field
& ROOTHUB_STATUS_CHANGE
) {
582 InterruptState
.RHStatusChangeInt
= Value
;
585 if(Field
& OWNERSHIP_CHANGE
) {
586 InterruptState
.OwnerChangedInt
= Value
;
589 if(Field
& MASTER_INTERRUPT
) {
590 InterruptState
.MasterInterruptEnable
= Value
;
594 Status
= OhciSetOperationalReg (Ohc
, HC_INTERRUPT_ENABLE
, (UINT32
*)&InterruptState
);
596 Status
= OhciSetOperationalReg (Ohc
, HC_INTERRUPT_DISABLE
, (UINT32
*)&InterruptState
);
604 Get field of HcInterruptControl reg value
606 @param Ohc UHC private data
607 @param Field Field to get
609 @retval Value of the field
614 OhciGetHcInterruptControl (
615 IN USB_OHCI_HC_DEV
*Ohc
,
619 HcINTERRUPT_CONTROL InterruptState
;
621 *(UINT32
*) &InterruptState
= OhciGetOperationalReg (Ohc
, HC_INTERRUPT_ENABLE
);
624 case SCHEDULE_OVERRUN
:
625 return InterruptState
.SchedulingOverrunInt
;
628 case WRITEBACK_DONE_HEAD
:
629 return InterruptState
.WriteBackDoneInt
;
633 return InterruptState
.SofInt
;
637 return InterruptState
.ResumeDetectedInt
;
640 case UNRECOVERABLE_ERROR
:
641 return InterruptState
.UnrecoverableErrorInt
;
644 case FRAME_NUMBER_OVERFLOW
:
645 return InterruptState
.FrameNumOverflowInt
;
648 case ROOTHUB_STATUS_CHANGE
:
649 return InterruptState
.RHStatusChangeInt
;
652 case OWNERSHIP_CHANGE
:
653 return InterruptState
.OwnerChangedInt
;
656 case MASTER_INTERRUPT
:
657 return InterruptState
.MasterInterruptEnable
;
669 Set memory pointer of specific type
671 @param Ohc UHC private data
672 @param PointerType Type of the pointer to set
673 @param Value Value to set
675 @retval EFI_SUCCESS Memory pointer set
680 OhciSetMemoryPointer(
681 IN USB_OHCI_HC_DEV
*Ohc
,
682 IN UINTN PointerType
,
689 Status
= OhciSetOperationalReg (Ohc
, PointerType
, (UINT32
*)&Value
);
691 if (EFI_ERROR (Status
)) {
695 Verify
= OhciGetOperationalReg (Ohc
, PointerType
);
697 while (Verify
!= (UINT32
) Value
) {
698 MicroSecondDelay (HC_1_MILLISECOND
);
699 Verify
= OhciGetOperationalReg (Ohc
, PointerType
);
708 Get memory pointer of specific type
710 @param Ohc UHC private data
711 @param PointerType Type of pointer
713 @retval Memory pointer of the specific type
718 OhciGetMemoryPointer (
719 IN USB_OHCI_HC_DEV
*Ohc
,
724 return (VOID
*) OhciGetOperationalReg (Ohc
, PointerType
);
730 Set Frame Interval value
732 @param Ohc UHC private data
733 @param Field Field to set
734 @param Value Value to set
736 @retval EFI_SUCCESS Value set
741 OhciSetFrameInterval (
742 IN USB_OHCI_HC_DEV
*Ohc
,
748 HcFRM_INTERVAL FrameInterval
;
751 *(UINT32
*) &FrameInterval
= OhciGetOperationalReg(Ohc
, HC_FRM_INTERVAL
);
753 if (Field
& FRAME_INTERVAL
) {
754 FrameInterval
.FrmIntervalToggle
= !FrameInterval
.FrmIntervalToggle
;
755 FrameInterval
.FrameInterval
= Value
;
758 if (Field
& FS_LARGEST_DATA_PACKET
) {
759 FrameInterval
.FSMaxDataPacket
= Value
;
762 if (Field
& FRMINT_TOGGLE
) {
763 FrameInterval
.FrmIntervalToggle
= Value
;
766 Status
= OhciSetOperationalReg (
769 (UINT32
*)&FrameInterval
778 Get field of frame interval reg value
780 @param Ohc UHC private data
781 @param Field Field to get
783 @retval Value of the field
788 OhciGetFrameInterval (
789 IN USB_OHCI_HC_DEV
*Ohc
,
793 HcFRM_INTERVAL FrameInterval
;
795 *(UINT32
*) &FrameInterval
= OhciGetOperationalReg (Ohc
, HC_FRM_INTERVAL
);
799 return FrameInterval
.FrameInterval
;
802 case FS_LARGEST_DATA_PACKET
:
803 return FrameInterval
.FSMaxDataPacket
;
807 return FrameInterval
.FrmIntervalToggle
;
819 Set Frame Remaining reg value
821 @param Ohc UHC private data
822 @param Value Value to set
824 @retval EFI_SUCCESS Value set
829 OhciSetFrameRemaining (
830 IN USB_OHCI_HC_DEV
*Ohc
,
835 HcFRAME_REMAINING FrameRemaining
;
838 *(UINT32
*) &FrameRemaining
= OhciGetOperationalReg (Ohc
, HC_FRM_REMAINING
);
840 FrameRemaining
.FrameRemaining
= Value
;
841 FrameRemaining
.FrameRemainingToggle
= !FrameRemaining
.FrameRemainingToggle
;
843 Status
= OhciSetOperationalReg (Ohc
, HC_FRM_REMAINING
, (UINT32
*)&FrameRemaining
);
849 Get value of frame remaining reg
851 @param Ohc UHC private data
852 @param Field Field to get
854 @retval Value of frame remaining reg
858 OhciGetFrameRemaining (
859 IN USB_OHCI_HC_DEV
*Ohc
,
864 HcFRAME_REMAINING FrameRemaining
;
867 *(UINT32
*) &FrameRemaining
= OhciGetOperationalReg (Ohc
, HC_FRM_REMAINING
);
870 case FRAME_REMAINING
:
871 return FrameRemaining
.FrameRemaining
;
874 case FRAME_REMAIN_TOGGLE
:
875 return FrameRemaining
.FrameRemainingToggle
;
887 Set frame number reg value
889 @param Ohc UHC private data
890 @param Value Value to set
892 @retval EFI_SUCCESS Value set
898 IN USB_OHCI_HC_DEV
*Ohc
,
904 Status
= OhciSetOperationalReg (Ohc
, HC_FRM_NUMBER
, &Value
);
911 Get frame number reg value
913 @param Ohc UHC private data
915 @retval Value of frame number reg
921 IN USB_OHCI_HC_DEV
*Ohc
924 return OhciGetOperationalReg(Ohc
, HC_FRM_NUMBER
);
929 Set period start reg value
931 @param Ohc UHC private data
932 @param Value Value to set
934 @retval EFI_SUCCESS Value set
939 OhciSetPeriodicStart (
940 IN USB_OHCI_HC_DEV
*Ohc
,
947 Status
= OhciSetOperationalReg (Ohc
, HC_PERIODIC_START
, &Value
);
955 Get periodic start reg value
957 @param Ohc UHC private data
959 @param Value of periodic start reg
964 OhciGetPeriodicStart (
965 IN USB_OHCI_HC_DEV
*Ohc
968 return OhciGetOperationalReg(Ohc
, HC_PERIODIC_START
);
974 Set Ls Threshold reg value
976 @param Ohc UHC private data
977 @param Value Value to set
979 @retval EFI_SUCCESS Value set
985 IN USB_OHCI_HC_DEV
*Ohc
,
992 Status
= OhciSetOperationalReg (Ohc
, HC_LS_THREASHOLD
, &Value
);
1000 Get Ls Threshold reg value
1002 @param Ohc UHC private data
1004 @retval Value of Ls Threshold reg
1009 OhciGetLsThreshold (
1010 IN USB_OHCI_HC_DEV
*Ohc
1013 return OhciGetOperationalReg(Ohc
, HC_LS_THREASHOLD
);
1018 Set Root Hub Descriptor reg value
1020 @param Ohc UHC private data
1021 @param Field Field to set
1022 @param Value Value to set
1024 @retval EFI_SUCCESS Value set
1028 OhciSetRootHubDescriptor (
1029 IN USB_OHCI_HC_DEV
*Ohc
,
1035 HcRH_DESC_A DescriptorA
;
1036 HcRH_DESC_B DescriptorB
;
1039 if (Field
& (RH_DEV_REMOVABLE
|| RH_PORT_PWR_CTRL_MASK
)) {
1040 *(UINT32
*) &DescriptorB
= OhciGetOperationalReg (Ohc
, HC_RH_DESC_B
);
1042 if(Field
& RH_DEV_REMOVABLE
) {
1043 DescriptorB
.DeviceRemovable
= Value
;
1045 if(Field
& RH_PORT_PWR_CTRL_MASK
) {
1046 DescriptorB
.PortPowerControlMask
= Value
;
1049 Status
= OhciSetOperationalReg (Ohc
, HC_RH_DESC_B
, (UINT32
*)&DescriptorB
);
1054 *(UINT32
*)&DescriptorA
= OhciGetOperationalReg (Ohc
, HC_RH_DESC_A
);
1056 if(Field
& RH_NUM_DS_PORTS
) {
1057 DescriptorA
.NumDownStrmPorts
= Value
;
1059 if(Field
& RH_NO_PSWITCH
) {
1060 DescriptorA
.NoPowerSwitch
= Value
;
1062 if(Field
& RH_PSWITCH_MODE
) {
1063 DescriptorA
.PowerSwitchMode
= Value
;
1065 if(Field
& RH_DEVICE_TYPE
) {
1066 DescriptorA
.DeviceType
= Value
;
1068 if(Field
& RH_OC_PROT_MODE
) {
1069 DescriptorA
.OverCurrentProtMode
= Value
;
1071 if(Field
& RH_NOC_PROT
) {
1072 DescriptorA
.NoOverCurrentProtMode
= Value
;
1074 if(Field
& RH_NO_POTPGT
) {
1075 DescriptorA
.PowerOnToPowerGoodTime
= Value
;
1078 Status
= OhciSetOperationalReg (Ohc
, HC_RH_DESC_A
, (UINT32
*)&DescriptorA
);
1086 Get Root Hub Descriptor reg value
1088 @param Ohc UHC private data
1089 @param Field Field to get
1091 @retval Value of the field
1096 OhciGetRootHubDescriptor (
1097 IN USB_OHCI_HC_DEV
*Ohc
,
1101 HcRH_DESC_A DescriptorA
;
1102 HcRH_DESC_B DescriptorB
;
1105 *(UINT32
*) &DescriptorA
= OhciGetOperationalReg (Ohc
, HC_RH_DESC_A
);
1106 *(UINT32
*) &DescriptorB
= OhciGetOperationalReg (Ohc
, HC_RH_DESC_B
);
1109 case RH_DEV_REMOVABLE
:
1110 return DescriptorB
.DeviceRemovable
;
1113 case RH_PORT_PWR_CTRL_MASK
:
1114 return DescriptorB
.PortPowerControlMask
;
1117 case RH_NUM_DS_PORTS
:
1118 return DescriptorA
.NumDownStrmPorts
;
1122 return DescriptorA
.NoPowerSwitch
;
1125 case RH_PSWITCH_MODE
:
1126 return DescriptorA
.PowerSwitchMode
;
1129 case RH_DEVICE_TYPE
:
1130 return DescriptorA
.DeviceType
;
1133 case RH_OC_PROT_MODE
:
1134 return DescriptorA
.OverCurrentProtMode
;
1138 return DescriptorA
.NoOverCurrentProtMode
;
1142 return DescriptorA
.PowerOnToPowerGoodTime
;
1155 Set Root Hub Status reg value
1157 @param Ohc UHC private data
1158 @param Field Field to set
1160 @retval EFI_SUCCESS Value set
1165 OhciSetRootHubStatus (
1166 IN USB_OHCI_HC_DEV
*Ohc
,
1171 HcRH_STATUS RootHubStatus
;
1174 ZeroMem (&RootHubStatus
, sizeof(HcRH_STATUS
));
1176 if(Field
& RH_LOCAL_PSTAT
){
1177 RootHubStatus
.LocalPowerStat
= 1;
1179 if(Field
& RH_OC_ID
){
1180 RootHubStatus
.OverCurrentIndicator
= 1;
1182 if(Field
& RH_REMOTE_WK_ENABLE
){
1183 RootHubStatus
.DevRemoteWakeupEnable
= 1;
1185 if(Field
& RH_LOCAL_PSTAT_CHANGE
){
1186 RootHubStatus
.LocalPowerStatChange
= 1;
1188 if(Field
& RH_OC_ID_CHANGE
){
1189 RootHubStatus
.OverCurrentIndicatorChange
= 1;
1191 if(Field
& RH_CLR_RMT_WK_ENABLE
){
1192 RootHubStatus
.ClearRemoteWakeupEnable
= 1;
1195 Status
= OhciSetOperationalReg (Ohc
, HC_RH_STATUS
, (UINT32
*)&RootHubStatus
);
1203 Get Root Hub Status reg value
1205 @param Ohc UHC private data
1206 @param Field Field to get
1208 @retval Value of the field
1213 OhciGetRootHubStatus (
1214 IN USB_OHCI_HC_DEV
*Ohc
,
1218 HcRH_STATUS RootHubStatus
;
1221 *(UINT32
*) &RootHubStatus
= OhciGetOperationalReg (Ohc
, HC_RH_STATUS
);
1224 case RH_LOCAL_PSTAT
:
1225 return RootHubStatus
.LocalPowerStat
;
1228 return RootHubStatus
.OverCurrentIndicator
;
1230 case RH_REMOTE_WK_ENABLE
:
1231 return RootHubStatus
.DevRemoteWakeupEnable
;
1233 case RH_LOCAL_PSTAT_CHANGE
:
1234 return RootHubStatus
.LocalPowerStatChange
;
1236 case RH_OC_ID_CHANGE
:
1237 return RootHubStatus
.OverCurrentIndicatorChange
;
1239 case RH_CLR_RMT_WK_ENABLE
:
1240 return RootHubStatus
.ClearRemoteWakeupEnable
;
1252 Set Root Hub Port Status reg value
1254 @param Ohc UHC private data
1255 @param Index Index of the port
1256 @param Field Field to set
1258 @retval EFI_SUCCESS Value set
1263 OhciSetRootHubPortStatus (
1264 IN USB_OHCI_HC_DEV
*Ohc
,
1270 HcRHPORT_STATUS PortStatus
;
1273 ZeroMem (&PortStatus
, sizeof(HcRHPORT_STATUS
));
1275 if (Field
& RH_CLEAR_PORT_ENABLE
) {
1276 PortStatus
.CurrentConnectStat
= 1;
1278 if (Field
& RH_SET_PORT_ENABLE
) {
1279 PortStatus
.EnableStat
= 1;
1281 if (Field
& RH_SET_PORT_SUSPEND
) {
1282 PortStatus
.SuspendStat
= 1;
1284 if (Field
& RH_CLEAR_SUSPEND_STATUS
) {
1285 PortStatus
.OCIndicator
= 1;
1287 if (Field
& RH_SET_PORT_RESET
) {
1288 PortStatus
.ResetStat
= 1;
1290 if (Field
& RH_SET_PORT_POWER
) {
1291 PortStatus
.PowerStat
= 1;
1293 if (Field
& RH_CLEAR_PORT_POWER
) {
1294 PortStatus
.LsDeviceAttached
= 1;
1296 if (Field
& RH_CONNECT_STATUS_CHANGE
) {
1297 PortStatus
.ConnectStatChange
= 1;
1299 if (Field
& RH_PORT_ENABLE_STAT_CHANGE
) {
1300 PortStatus
.EnableStatChange
= 1;
1302 if (Field
& RH_PORT_SUSPEND_STAT_CHANGE
) {
1303 PortStatus
.SuspendStatChange
= 1;
1305 if (Field
& RH_OC_INDICATOR_CHANGE
) {
1306 PortStatus
.OCIndicatorChange
= 1;
1308 if (Field
& RH_PORT_RESET_STAT_CHANGE
) {
1309 PortStatus
.ResetStatChange
= 1;
1312 Status
= OhciSetOperationalReg (Ohc
, HC_RH_PORT_STATUS
+ (Index
* 4), (UINT32
*)&PortStatus
);
1320 Get Root Hub Port Status reg value
1322 @param Ohc UHC private data
1323 @param Index Index of the port
1324 @param Field Field to get
1326 @retval Value of the field and index
1331 OhciReadRootHubPortStatus (
1332 IN USB_OHCI_HC_DEV
*Ohc
,
1337 HcRHPORT_STATUS PortStatus
;
1339 *(UINT32
*) &PortStatus
= OhciGetOperationalReg (
1341 HC_RH_PORT_STATUS
+ (Index
* 4)
1345 case RH_CURR_CONNECT_STAT
:
1346 return PortStatus
.CurrentConnectStat
;
1348 case RH_PORT_ENABLE_STAT
:
1349 return PortStatus
.EnableStat
;
1351 case RH_PORT_SUSPEND_STAT
:
1352 return PortStatus
.SuspendStat
;
1354 case RH_PORT_OC_INDICATOR
:
1355 return PortStatus
.OCIndicator
;
1357 case RH_PORT_RESET_STAT
:
1358 return PortStatus
.ResetStat
;
1360 case RH_PORT_POWER_STAT
:
1361 return PortStatus
.PowerStat
;
1363 case RH_LSDEVICE_ATTACHED
:
1364 return PortStatus
.LsDeviceAttached
;
1366 case RH_CONNECT_STATUS_CHANGE
:
1367 return PortStatus
.ConnectStatChange
;
1369 case RH_PORT_ENABLE_STAT_CHANGE
:
1370 return PortStatus
.EnableStatChange
;
1372 case RH_PORT_SUSPEND_STAT_CHANGE
:
1373 return PortStatus
.SuspendStatChange
;
1375 case RH_OC_INDICATOR_CHANGE
:
1376 return PortStatus
.OCIndicatorChange
;
1378 case RH_PORT_RESET_STAT_CHANGE
:
1379 return PortStatus
.ResetStatChange
;