2 * PROJECT: ReactOS USB EHCI Miniport Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: USBEHCI root hub functions
5 * COPYRIGHT: Copyright 2017-2018 Vadim Galyant <vgal@rambler.ru>
13 #define NDEBUG_EHCI_ROOT_HUB
18 EHCI_RH_ChirpRootPort(IN PVOID ehciExtension
,
21 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
23 EHCI_PORT_STATUS_CONTROL PortSC
;
27 DPRINT_RH("EHCI_RH_ChirpRootPort: Port - %x\n", Port
);
30 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
31 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
32 DPRINT_RH("EHCI_RH_ChirpRootPort: PortSC - %X\n", PortSC
.AsULONG
);
34 PortBit
= 1 << (Port
- 1);
36 if (PortBit
& EhciExtension
->ResetPortBits
)
38 DPRINT_RH("EHCI_RH_ChirpRootPort: Skip port - %x\n", Port
);
39 return MP_STATUS_SUCCESS
;
42 if (PortSC
.PortPower
== 0)
44 DPRINT_RH("EHCI_RH_ChirpRootPort: Skip port - %x\n", Port
);
45 return MP_STATUS_SUCCESS
;
48 if (PortSC
.CurrentConnectStatus
== 0 ||
49 PortSC
.PortEnabledDisabled
== 1 ||
50 PortSC
.PortOwner
== EHCI_PORT_OWNER_COMPANION_CONTROLLER
)
52 DPRINT_RH("EHCI_RH_ChirpRootPort: No port - %x\n", Port
);
53 return MP_STATUS_SUCCESS
;
56 if (PortSC
.LineStatus
== EHCI_LINE_STATUS_K_STATE_LOW_SPEED
&&
57 PortSC
.Suspend
== 0 &&
58 PortSC
.CurrentConnectStatus
== 1)
60 /* Attached device is not a high-speed device.
61 Release ownership of the port to a selected HC.
62 Companion HC owns and controls the port. Section 4.2 */
63 PortSC
.PortOwner
= EHCI_PORT_OWNER_COMPANION_CONTROLLER
;
64 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
66 DPRINT_RH("EHCI_RH_ChirpRootPort: Companion HC port - %x\n", Port
);
67 return MP_STATUS_SUCCESS
;
70 DPRINT("EHCI_RH_ChirpRootPort: EhciExtension - %p, Port - %x\n",
74 PortSC
.PortEnabledDisabled
= 0;
76 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
78 RegPacket
.UsbPortWait(EhciExtension
, 10);
82 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
84 PortSC
.ConnectStatusChange
= 0;
85 PortSC
.PortEnableDisableChange
= 0;
86 PortSC
.OverCurrentChange
= 0;
89 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
91 for (ix
= 0; ix
<= 500; ix
+= 20)
93 KeStallExecutionProcessor(20);
94 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
96 DPRINT_RH("EHCI_RH_ChirpRootPort: Reset port - %x\n", Port
);
98 if (PortSC
.PortReset
== 0)
102 while (PortSC
.PortReset
== 1);
104 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
106 if (PortSC
.PortEnabledDisabled
== 1)
108 PortSC
.ConnectStatusChange
= 0;
109 PortSC
.PortEnabledDisabled
= 0;
110 PortSC
.PortEnableDisableChange
= 0;
111 PortSC
.OverCurrentChange
= 0;
113 RegPacket
.UsbPortWait(EhciExtension
, 10);
115 EhciExtension
->ResetPortBits
|= PortBit
;
117 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
118 DPRINT_RH("EHCI_RH_ChirpRootPort: Disable port - %x\n", Port
);
122 PortSC
.PortOwner
= EHCI_PORT_OWNER_COMPANION_CONTROLLER
;
123 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
124 DPRINT_RH("EHCI_RH_ChirpRootPort: Companion HC port - %x\n", Port
);
127 return MP_STATUS_SUCCESS
;
132 EHCI_RH_GetRootHubData(IN PVOID ehciExtension
,
133 IN PVOID rootHubData
)
135 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
136 PUSBPORT_ROOT_HUB_DATA RootHubData
;
137 USBPORT_HUB_20_CHARACTERISTICS HubCharacteristics
;
139 DPRINT_RH("EHCI_RH_GetRootHubData: EhciExtension - %p, rootHubData - %p\n",
143 RootHubData
= rootHubData
;
145 RootHubData
->NumberOfPorts
= EhciExtension
->NumberOfPorts
;
147 HubCharacteristics
.AsUSHORT
= 0;
149 /* Logical Power Switching Mode */
150 if (EhciExtension
->PortPowerControl
== 1)
152 /* Individual port power switching */
153 HubCharacteristics
.PowerControlMode
= 1;
157 /* Ganged power switching (all ports\92 power at once) */
158 HubCharacteristics
.PowerControlMode
= 0;
161 HubCharacteristics
.NoPowerSwitching
= 0;
163 /* EHCI RH is not part of a compound device */
164 HubCharacteristics
.PartOfCompoundDevice
= 0;
166 /* Global Over-current Protection */
167 HubCharacteristics
.OverCurrentProtectionMode
= 0;
169 RootHubData
->HubCharacteristics
.Usb20HubCharacteristics
= HubCharacteristics
;
171 RootHubData
->PowerOnToPowerGood
= 2; // Time (in 2 ms intervals)
172 RootHubData
->HubControlCurrent
= 0;
177 EHCI_RH_GetStatus(IN PVOID ehciExtension
,
180 DPRINT_RH("EHCI_RH_GetStatus: ... \n");
181 *Status
= USB_GETSTATUS_SELF_POWERED
;
182 return MP_STATUS_SUCCESS
;
187 EHCI_RH_GetPortStatus(IN PVOID ehciExtension
,
189 IN PUSB_PORT_STATUS_AND_CHANGE PortStatus
)
191 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
192 PULONG PortStatusReg
;
193 EHCI_PORT_STATUS_CONTROL PortSC
;
194 USB_PORT_STATUS_AND_CHANGE status
;
199 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
200 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
202 if (PortSC
.CurrentConnectStatus
)
204 DPRINT_RH("EHCI_RH_GetPortStatus: Port - %x, PortSC.AsULONG - %X\n",
209 PortStatus
->AsUlong32
= 0;
211 if (PortSC
.LineStatus
== EHCI_LINE_STATUS_K_STATE_LOW_SPEED
&&
212 PortSC
.PortOwner
!= EHCI_PORT_OWNER_COMPANION_CONTROLLER
&&
213 (PortSC
.PortEnabledDisabled
| PortSC
.Suspend
) && // Enable or Suspend
214 PortSC
.CurrentConnectStatus
== 1) // Device is present
216 DPRINT("EHCI_RH_GetPortStatus: LowSpeed device detected\n");
217 PortSC
.PortOwner
= EHCI_PORT_OWNER_COMPANION_CONTROLLER
; // release ownership
218 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
219 return MP_STATUS_SUCCESS
;
222 status
.AsUlong32
= 0;
224 status
.PortStatus
.Usb20PortStatus
.CurrentConnectStatus
= PortSC
.CurrentConnectStatus
;
225 status
.PortStatus
.Usb20PortStatus
.PortEnabledDisabled
= PortSC
.PortEnabledDisabled
;
226 status
.PortStatus
.Usb20PortStatus
.Suspend
= PortSC
.Suspend
;
227 status
.PortStatus
.Usb20PortStatus
.OverCurrent
= PortSC
.OverCurrentActive
;
228 status
.PortStatus
.Usb20PortStatus
.Reset
= PortSC
.PortReset
;
229 status
.PortStatus
.Usb20PortStatus
.PortPower
= PortSC
.PortPower
;
230 if (PortSC
.PortOwner
== EHCI_PORT_OWNER_COMPANION_CONTROLLER
)
231 status
.PortStatus
.Usb20PortStatus
.Reserved1
= USB20_PORT_STATUS_RESERVED1_OWNED_BY_COMPANION
;
233 status
.PortChange
.Usb20PortChange
.PortEnableDisableChange
= PortSC
.PortEnableDisableChange
;
234 status
.PortChange
.Usb20PortChange
.OverCurrentIndicatorChange
= PortSC
.OverCurrentChange
;
236 PortMaskBits
= 1 << (Port
- 1);
238 if (status
.PortStatus
.Usb20PortStatus
.CurrentConnectStatus
)
239 status
.PortStatus
.Usb20PortStatus
.LowSpeedDeviceAttached
= 0;
241 status
.PortStatus
.Usb20PortStatus
.HighSpeedDeviceAttached
= 1;
243 if (PortSC
.ConnectStatusChange
)
244 EhciExtension
->ConnectPortBits
|= PortMaskBits
;
246 if (EhciExtension
->FinishResetPortBits
& PortMaskBits
)
247 status
.PortChange
.Usb20PortChange
.ResetChange
= 1;
249 if (EhciExtension
->ConnectPortBits
& PortMaskBits
)
250 status
.PortChange
.Usb20PortChange
.ConnectStatusChange
= 1;
252 if (EhciExtension
->SuspendPortBits
& PortMaskBits
)
253 status
.PortChange
.Usb20PortChange
.SuspendChange
= 1;
255 *PortStatus
= status
;
257 if (status
.PortStatus
.Usb20PortStatus
.CurrentConnectStatus
)
259 DPRINT_RH("EHCI_RH_GetPortStatus: Port - %x, status.AsULONG - %X\n",
264 return MP_STATUS_SUCCESS
;
269 EHCI_RH_GetHubStatus(IN PVOID ehciExtension
,
270 IN PUSB_HUB_STATUS_AND_CHANGE HubStatus
)
272 DPRINT_RH("EHCI_RH_GetHubStatus: ... \n");
273 HubStatus
->AsUlong32
= 0;
274 return MP_STATUS_SUCCESS
;
279 EHCI_RH_FinishReset(IN PVOID ehciExtension
,
282 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
283 PULONG PortStatusReg
;
284 EHCI_PORT_STATUS_CONTROL PortSC
;
285 PUSHORT Port
= Context
;
287 DPRINT("EHCI_RH_FinishReset: *Port - %x\n", *Port
);
289 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[*Port
- 1].AsULONG
;
290 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
292 if (PortSC
.AsULONG
!= -1)
294 if (!PortSC
.CurrentConnectStatus
)
295 DPRINT("EHCI_RH_FinishReset: PortSC.AsULONG - %X\n", PortSC
.AsULONG
);
297 if (PortSC
.PortEnabledDisabled
||
298 !PortSC
.CurrentConnectStatus
||
299 PortSC
.ConnectStatusChange
)
301 EhciExtension
->FinishResetPortBits
|= (1 << (*Port
- 1));
302 RegPacket
.UsbPortInvalidateRootHub(EhciExtension
);
306 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
307 PortSC
.PortOwner
= EHCI_PORT_OWNER_COMPANION_CONTROLLER
;
308 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
309 EhciExtension
->FinishResetPortBits
|= (1 << (*Port
- 1));
312 EhciExtension
->ResetPortBits
&= ~(1 << (*Port
- 1));
318 EHCI_RH_PortResetComplete(IN PVOID ehciExtension
,
321 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
322 PULONG PortStatusReg
;
323 EHCI_PORT_STATUS_CONTROL PortSC
;
325 PUSHORT Port
= Context
;
327 DPRINT("EHCI_RH_PortResetComplete: *Port - %x\n", *Port
);
329 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[*Port
- 1].AsULONG
;
333 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
335 PortSC
.ConnectStatusChange
= 0;
336 PortSC
.PortEnableDisableChange
= 0;
337 PortSC
.OverCurrentChange
= 0;
338 PortSC
.PortReset
= 0;
340 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
342 for (ix
= 0; ix
<= 500; ix
+= 20)
344 KeStallExecutionProcessor(20);
345 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
347 DPRINT("EHCI_RH_PortResetComplete: Reset port - %x\n", Port
);
349 if (PortSC
.PortReset
== 0)
353 while (PortSC
.PortReset
== 1 && (PortSC
.AsULONG
!= -1));
355 RegPacket
.UsbPortRequestAsyncCallback(EhciExtension
,
359 EHCI_RH_FinishReset
);
364 EHCI_RH_SetFeaturePortReset(IN PVOID ehciExtension
,
367 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
368 PULONG PortStatusReg
;
369 EHCI_PORT_STATUS_CONTROL PortSC
;
371 DPRINT("EHCI_RH_SetFeaturePortReset: Port - %x\n", Port
);
374 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
376 EhciExtension
->ResetPortBits
|= 1 << (Port
- 1);
378 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
380 PortSC
.ConnectStatusChange
= 0;
381 PortSC
.PortEnabledDisabled
= 0;
382 PortSC
.PortEnableDisableChange
= 0;
383 PortSC
.OverCurrentChange
= 0;
384 PortSC
.PortReset
= 1;
386 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
388 RegPacket
.UsbPortRequestAsyncCallback(EhciExtension
,
392 EHCI_RH_PortResetComplete
);
394 return MP_STATUS_SUCCESS
;
399 EHCI_RH_SetFeaturePortPower(IN PVOID ehciExtension
,
402 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
403 PULONG PortStatusReg
;
404 EHCI_PORT_STATUS_CONTROL PortSC
;
406 DPRINT_RH("EHCI_RH_SetFeaturePortPower: Port - %x\n", Port
);
409 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
411 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
413 PortSC
.ConnectStatusChange
= 0;
414 PortSC
.PortEnableDisableChange
= 0;
415 PortSC
.OverCurrentChange
= 0;
416 PortSC
.PortPower
= 1;
418 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
420 return MP_STATUS_SUCCESS
;
425 EHCI_RH_SetFeaturePortEnable(IN PVOID ehciExtension
,
428 DPRINT_RH("EHCI_RH_SetFeaturePortEnable: Not supported\n");
430 return MP_STATUS_SUCCESS
;
435 EHCI_RH_SetFeaturePortSuspend(IN PVOID ehciExtension
,
438 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
439 PULONG PortStatusReg
;
440 EHCI_PORT_STATUS_CONTROL PortSC
;
442 DPRINT("EHCI_RH_SetFeaturePortSuspend: Port - %x\n", Port
);
445 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
447 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
449 PortSC
.ConnectStatusChange
= 0;
450 PortSC
.PortEnableDisableChange
= 0;
451 PortSC
.OverCurrentChange
= 0;
454 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
455 KeStallExecutionProcessor(125);
457 return MP_STATUS_SUCCESS
;
462 EHCI_RH_ClearFeaturePortEnable(IN PVOID ehciExtension
,
465 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
466 PULONG PortStatusReg
;
467 EHCI_PORT_STATUS_CONTROL PortSC
;
469 DPRINT("EHCI_RH_ClearFeaturePortEnable: Port - %x\n", Port
);
472 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
474 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
476 PortSC
.ConnectStatusChange
= 0;
477 PortSC
.PortEnabledDisabled
= 0;
478 PortSC
.PortEnableDisableChange
= 0;
479 PortSC
.OverCurrentChange
= 0;
481 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
483 return MP_STATUS_SUCCESS
;
488 EHCI_RH_ClearFeaturePortPower(IN PVOID ehciExtension
,
491 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
492 PULONG PortStatusReg
;
493 EHCI_PORT_STATUS_CONTROL PortSC
;
495 DPRINT("EHCI_RH_ClearFeaturePortPower: Port - %x\n", Port
);
498 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
500 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
501 PortSC
.PortPower
= 0;
502 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
504 return MP_STATUS_SUCCESS
;
509 EHCI_RH_PortResumeComplete(IN PVOID ehciExtension
,
512 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
513 PULONG PortStatusReg
;
514 EHCI_PORT_STATUS_CONTROL PortSC
;
515 PUSHORT Port
= Context
;
517 DPRINT("EHCI_RH_PortResumeComplete: *Port - %x\n", *Port
);
520 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[*Port
- 1].AsULONG
;
522 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
524 PortSC
.ConnectStatusChange
= 0;
525 PortSC
.PortEnableDisableChange
= 0;
526 PortSC
.OverCurrentChange
= 0;
527 PortSC
.ForcePortResume
= 0;
530 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
531 READ_REGISTER_ULONG(PortStatusReg
);
533 EhciExtension
->SuspendPortBits
|= 1 << (*Port
- 1);
538 EHCI_RH_ClearFeaturePortSuspend(IN PVOID ehciExtension
,
541 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
542 PULONG PortStatusReg
;
543 EHCI_PORT_STATUS_CONTROL PortSC
;
545 DPRINT("EHCI_RH_ClearFeaturePortSuspend: Port - %x\n", Port
);
548 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
549 EhciExtension
->ResetPortBits
|= 1 << (Port
- 1);
551 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
552 PortSC
.ForcePortResume
= 1;
553 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
555 RegPacket
.UsbPortRequestAsyncCallback(EhciExtension
,
559 EHCI_RH_PortResumeComplete
);
561 return MP_STATUS_SUCCESS
;
566 EHCI_RH_ClearFeaturePortEnableChange(IN PVOID ehciExtension
,
569 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
570 PULONG PortStatusReg
;
571 EHCI_PORT_STATUS_CONTROL PortSC
;
573 DPRINT("EHCI_RH_ClearFeaturePortEnableChange: Port - %p\n", Port
);
576 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
578 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
580 PortSC
.ConnectStatusChange
= 0;
581 PortSC
.OverCurrentChange
= 0;
582 PortSC
.PortEnableDisableChange
= 1;
584 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
586 return MP_STATUS_SUCCESS
;
591 EHCI_RH_ClearFeaturePortConnectChange(IN PVOID ehciExtension
,
594 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
595 PULONG PortStatusReg
;
596 EHCI_PORT_STATUS_CONTROL PortSC
;
598 DPRINT_RH("EHCI_RH_ClearFeaturePortConnectChange: Port - %x\n", Port
);
601 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
603 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
605 if (PortSC
.ConnectStatusChange
)
607 PortSC
.ConnectStatusChange
= 1;
608 PortSC
.PortEnableDisableChange
= 0;
609 PortSC
.OverCurrentChange
= 0;
611 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
614 EhciExtension
->ConnectPortBits
&= ~(1 << (Port
- 1));
616 return MP_STATUS_SUCCESS
;
621 EHCI_RH_ClearFeaturePortResetChange(IN PVOID ehciExtension
,
624 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
626 DPRINT("EHCI_RH_ClearFeaturePortConnectChange: Port - %x\n", Port
);
629 EhciExtension
->FinishResetPortBits
&= ~(1 << (Port
- 1));
630 return MP_STATUS_SUCCESS
;
635 EHCI_RH_ClearFeaturePortSuspendChange(IN PVOID ehciExtension
,
638 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
640 DPRINT("EHCI_RH_ClearFeaturePortSuspendChange: Port - %x\n", Port
);
643 EhciExtension
->SuspendPortBits
&= ~(1 << (Port
- 1));
644 return MP_STATUS_SUCCESS
;
649 EHCI_RH_ClearFeaturePortOvercurrentChange(IN PVOID ehciExtension
,
652 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
653 PULONG PortStatusReg
;
654 EHCI_PORT_STATUS_CONTROL PortSC
;
656 DPRINT_RH("EHCI_RH_ClearFeaturePortOvercurrentChange: Port - %x\n", Port
);
659 PortStatusReg
= &EhciExtension
->OperationalRegs
->PortControl
[Port
- 1].AsULONG
;
661 PortSC
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
663 PortSC
.ConnectStatusChange
= 0;
664 PortSC
.PortEnableDisableChange
= 0;
665 PortSC
.OverCurrentChange
= 1;
667 WRITE_REGISTER_ULONG(PortStatusReg
, PortSC
.AsULONG
);
669 return MP_STATUS_SUCCESS
;
674 EHCI_RH_DisableIrq(IN PVOID ehciExtension
)
676 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
678 EHCI_INTERRUPT_ENABLE IntrSts
;
680 DPRINT_RH("EHCI_RH_DisableIrq: ... \n");
682 IntrStsReg
= &EhciExtension
->OperationalRegs
->HcInterruptEnable
.AsULONG
;
683 IntrSts
.AsULONG
= READ_REGISTER_ULONG(IntrStsReg
);
685 EhciExtension
->InterruptMask
.PortChangeInterrupt
= 0;
686 IntrSts
.PortChangeInterrupt
= 0;
688 if (IntrSts
.Interrupt
)
689 WRITE_REGISTER_ULONG(IntrStsReg
, IntrSts
.AsULONG
);
694 EHCI_RH_EnableIrq(IN PVOID ehciExtension
)
696 PEHCI_EXTENSION EhciExtension
= ehciExtension
;
698 EHCI_INTERRUPT_ENABLE IntrSts
;
700 DPRINT_RH("EHCI_RH_EnableIrq: ... \n");
702 IntrStsReg
= &EhciExtension
->OperationalRegs
->HcInterruptEnable
.AsULONG
;
703 IntrSts
.AsULONG
= READ_REGISTER_ULONG(IntrStsReg
);
705 EhciExtension
->InterruptMask
.PortChangeInterrupt
= 1;
706 IntrSts
.PortChangeInterrupt
= 1;
708 if (IntrSts
.Interrupt
)
709 WRITE_REGISTER_ULONG(IntrStsReg
, IntrSts
.AsULONG
);