6 OHCI_REG_RH_DESCRIPTORA
8 OHCI_ReadRhDescriptorA(IN POHCI_EXTENSION OhciExtension
)
10 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
11 OHCI_REG_RH_DESCRIPTORA DescriptorA
;
12 PULONG DescriptorAReg
;
15 OperationalRegs
= OhciExtension
->OperationalRegs
;
16 DescriptorAReg
= (PULONG
)&OperationalRegs
->HcRhDescriptorA
;
18 DPRINT("OHCI_ReadRhDescriptorA: OhciExtension - %p\n", OhciExtension
);
20 for (ix
= 0; ix
< 10; ix
++)
22 DescriptorA
.AsULONG
= READ_REGISTER_ULONG(DescriptorAReg
);
24 if (DescriptorA
.AsULONG
!= 0 &&
25 DescriptorA
.Reserved
== 0 &&
26 DescriptorA
.NumberDownstreamPorts
<= OHCI_MAX_PORT_COUNT
)
31 DPRINT1("OHCI_ReadRhDescriptorA: DescriptorA - %lX, ix - %d\n",
32 DescriptorA
.AsULONG
, ix
);
34 KeStallExecutionProcessor(5);
42 OHCI_RH_GetRootHubData(IN PVOID ohciExtension
,
45 POHCI_EXTENSION OhciExtension
;
46 PUSBPORT_ROOT_HUB_DATA RootHubData
;
47 OHCI_REG_RH_DESCRIPTORA DescriptorA
;
48 UCHAR PowerOnToPowerGoodTime
;
49 USBPORT_HUB_11_CHARACTERISTICS HubCharacteristics
;
51 OhciExtension
= ohciExtension
;
53 DPRINT("OHCI_RH_GetRootHubData: OhciExtension - %p, rootHubData - %p\n",
57 RootHubData
= rootHubData
;
58 DescriptorA
= OHCI_ReadRhDescriptorA(OhciExtension
);
60 RootHubData
->NumberOfPorts
= DescriptorA
.NumberDownstreamPorts
;
62 /* Waiting time (in 2 ms intervals) */
63 PowerOnToPowerGoodTime
= DescriptorA
.PowerOnToPowerGoodTime
;
64 if (PowerOnToPowerGoodTime
<= OHCI_MINIMAL_POTPGT
)
65 PowerOnToPowerGoodTime
= OHCI_MINIMAL_POTPGT
;
66 RootHubData
->PowerOnToPowerGood
= PowerOnToPowerGoodTime
;
68 HubCharacteristics
.AsUSHORT
= 0;
70 if (DescriptorA
.PowerSwitchingMode
)
72 /* Individual port power switching */
73 HubCharacteristics
.PowerControlMode
= 1;
77 /* Ganged power switching */
78 HubCharacteristics
.PowerControlMode
= 0;
81 HubCharacteristics
.NoPowerSwitching
= 0;
83 /* always 0 (OHCI RH is not a compound device) */
84 ASSERT(DescriptorA
.DeviceType
== 0);
85 HubCharacteristics
.PartOfCompoundDevice
= DescriptorA
.DeviceType
;
87 HubCharacteristics
.OverCurrentProtectionMode
= DescriptorA
.OverCurrentProtectionMode
;
88 HubCharacteristics
.NoOverCurrentProtection
= DescriptorA
.NoOverCurrentProtection
;
90 RootHubData
->HubCharacteristics
.Usb11HubCharacteristics
= HubCharacteristics
;
91 RootHubData
->HubControlCurrent
= 0;
96 OHCI_RH_GetStatus(IN PVOID ohciExtension
,
99 DPRINT("OHCI_RH_GetStatus: \n");
100 *Status
= OHCI_RH_STATUS_GOOD
;
101 return MP_STATUS_SUCCESS
;
106 OHCI_RH_GetPortStatus(IN PVOID ohciExtension
,
108 IN PUSB_PORT_STATUS_AND_CHANGE PortStatus
)
110 POHCI_EXTENSION OhciExtension
;
111 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
112 PULONG PortStatusReg
;
113 OHCI_REG_RH_PORT_STATUS OhciPortStatus
;
117 OhciExtension
= ohciExtension
;
119 DPRINT("OHCI_RH_GetPortStatus: OhciExtension - %p, Port - %x, PortStatus - %lX\n",
122 PortStatus
->AsUlong32
);
126 OperationalRegs
= OhciExtension
->OperationalRegs
;
127 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
129 for (ix
= 0; ix
< 10; ix
++)
131 OhciPortStatus
.AsULONG
= READ_REGISTER_ULONG(PortStatusReg
);
133 Reserved
= OhciPortStatus
.Reserved1r
|
134 OhciPortStatus
.Reserved2r
|
135 OhciPortStatus
.Reserved3
;
137 if (OhciPortStatus
.AsULONG
&& !Reserved
)
140 DPRINT("OHCI_RH_GetPortStatus: OhciPortStatus - %X\n", OhciPortStatus
.AsULONG
);
142 KeStallExecutionProcessor(5);
145 PortStatus
->AsUlong32
= OhciPortStatus
.AsULONG
;
147 return MP_STATUS_SUCCESS
;
152 OHCI_RH_GetHubStatus(IN PVOID ohciExtension
,
153 IN PUSB_HUB_STATUS_AND_CHANGE HubStatus
)
155 POHCI_EXTENSION OhciExtension
;
156 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
158 OHCI_REG_RH_STATUS HcRhStatus
;
160 OhciExtension
= ohciExtension
;
162 DPRINT("OHCI_RH_GetHubStatus: ohciExtension - %p, HubStatus - %lX\n",
164 HubStatus
->AsUlong32
);
166 OperationalRegs
= OhciExtension
->OperationalRegs
;
167 RhStatusReg
= (PULONG
)&OperationalRegs
->HcRhStatus
;
169 HcRhStatus
.AsULONG
= READ_REGISTER_ULONG(RhStatusReg
);
171 HubStatus
->HubStatus
.LocalPowerLost
= HcRhStatus
.LocalPowerStatus
;
172 HubStatus
->HubChange
.LocalPowerChange
= HcRhStatus
.LocalPowerStatusChange
;
174 HubStatus
->HubStatus
.OverCurrent
= HcRhStatus
.OverCurrentIndicator
;
175 HubStatus
->HubChange
.OverCurrentChange
= HcRhStatus
.OverCurrentIndicatorChangeR
;
177 return MP_STATUS_SUCCESS
;
182 OHCI_RH_SetFeaturePortReset(IN PVOID ohciExtension
,
185 POHCI_EXTENSION OhciExtension
;
186 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
187 PULONG PortStatusReg
;
188 OHCI_REG_RH_PORT_STATUS PortStatus
;
190 OhciExtension
= ohciExtension
;
192 DPRINT("OHCI_RH_SetFeaturePortReset: OhciExtension - %p, Port - %x\n",
198 OperationalRegs
= OhciExtension
->OperationalRegs
;
199 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
201 PortStatus
.AsULONG
= 0;
202 PortStatus
.SetPortReset
= 1;
204 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
206 return MP_STATUS_SUCCESS
;
211 OHCI_RH_SetFeaturePortPower(IN PVOID ohciExtension
,
214 POHCI_EXTENSION OhciExtension
;
215 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
216 PULONG PortStatusReg
;
217 OHCI_REG_RH_PORT_STATUS PortStatus
;
219 OhciExtension
= ohciExtension
;
221 DPRINT("OHCI_RH_SetFeaturePortPower: OhciExtension - %p, Port - %x\n",
227 OperationalRegs
= OhciExtension
->OperationalRegs
;
228 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
230 PortStatus
.AsULONG
= 0;
231 PortStatus
.SetPortPower
= 1;
233 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
235 return MP_STATUS_SUCCESS
;
240 OHCI_RH_SetFeaturePortEnable(IN PVOID ohciExtension
,
243 POHCI_EXTENSION OhciExtension
;
244 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
245 PULONG PortStatusReg
;
246 OHCI_REG_RH_PORT_STATUS PortStatus
;
248 OhciExtension
= ohciExtension
;
250 DPRINT("OHCI_RH_SetFeaturePortEnable: OhciExtension - %p, Port - %x\n",
256 OperationalRegs
= OhciExtension
->OperationalRegs
;
257 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
259 PortStatus
.AsULONG
= 0;
260 PortStatus
.SetPortEnable
= 1;
262 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
264 return MP_STATUS_SUCCESS
;
269 OHCI_RH_SetFeaturePortSuspend(IN PVOID ohciExtension
,
272 POHCI_EXTENSION OhciExtension
;
273 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
274 PULONG PortStatusReg
;
275 OHCI_REG_RH_PORT_STATUS PortStatus
;
277 OhciExtension
= ohciExtension
;
279 DPRINT("OHCI_RH_SetFeaturePortSuspend: OhciExtension - %p, Port - %x\n",
285 OperationalRegs
= OhciExtension
->OperationalRegs
;
286 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
288 PortStatus
.AsULONG
= 0;
289 PortStatus
.SetPortSuspend
= 1;
291 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
293 return MP_STATUS_SUCCESS
;
298 OHCI_RH_ClearFeaturePortEnable(IN PVOID ohciExtension
,
301 POHCI_EXTENSION OhciExtension
;
302 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
303 PULONG PortStatusReg
;
304 OHCI_REG_RH_PORT_STATUS PortStatus
;
306 OhciExtension
= ohciExtension
;
308 DPRINT("OHCI_RH_ClearFeaturePortEnable: OhciExtension - %p, Port - %x\n",
314 OperationalRegs
= OhciExtension
->OperationalRegs
;
315 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
317 PortStatus
.AsULONG
= 0;
318 PortStatus
.ClearPortEnable
= 1;
320 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
322 return MP_STATUS_SUCCESS
;
327 OHCI_RH_ClearFeaturePortPower(IN PVOID ohciExtension
,
330 POHCI_EXTENSION OhciExtension
;
331 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
332 PULONG PortStatusReg
;
333 OHCI_REG_RH_PORT_STATUS PortStatus
;
335 OhciExtension
= ohciExtension
;
337 DPRINT("OHCI_RH_ClearFeaturePortPower: OhciExtension - %p, Port - %x\n",
343 OperationalRegs
= OhciExtension
->OperationalRegs
;
344 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
346 PortStatus
.AsULONG
= 0;
347 PortStatus
.ClearPortPower
= 1;
349 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
351 return MP_STATUS_SUCCESS
;
356 OHCI_RH_ClearFeaturePortSuspend(IN PVOID ohciExtension
,
359 POHCI_EXTENSION OhciExtension
;
360 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
361 PULONG PortStatusReg
;
362 OHCI_REG_RH_PORT_STATUS PortStatus
;
364 OhciExtension
= ohciExtension
;
366 DPRINT("OHCI_RH_ClearFeaturePortSuspend: OhciExtension - %p, Port - %x\n",
372 OperationalRegs
= OhciExtension
->OperationalRegs
;
373 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
375 PortStatus
.AsULONG
= 0;
376 PortStatus
.ClearSuspendStatus
= 1;
378 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
380 return MP_STATUS_SUCCESS
;
385 OHCI_RH_ClearFeaturePortEnableChange(IN PVOID ohciExtension
,
388 POHCI_EXTENSION OhciExtension
;
389 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
390 PULONG PortStatusReg
;
391 OHCI_REG_RH_PORT_STATUS PortStatus
;
393 OhciExtension
= ohciExtension
;
395 DPRINT("OHCI_RH_ClearFeaturePortEnableChange: ohciExtension - %p, Port - %x\n",
401 OperationalRegs
= OhciExtension
->OperationalRegs
;
402 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
404 PortStatus
.AsULONG
= 0;
405 PortStatus
.PortEnableStatusChange
= 1;
407 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
409 return MP_STATUS_SUCCESS
;
414 OHCI_RH_ClearFeaturePortConnectChange(IN PVOID ohciExtension
,
417 POHCI_EXTENSION OhciExtension
;
418 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
419 PULONG PortStatusReg
;
420 OHCI_REG_RH_PORT_STATUS PortStatus
;
422 OhciExtension
= ohciExtension
;
424 DPRINT("OHCI_RH_ClearFeaturePortConnectChange: OhciExtension - %p, Port - %x\n",
430 OperationalRegs
= OhciExtension
->OperationalRegs
;
431 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
433 PortStatus
.AsULONG
= 0;
434 PortStatus
.ConnectStatusChange
= 1;
436 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
438 return MP_STATUS_SUCCESS
;
443 OHCI_RH_ClearFeaturePortResetChange(IN PVOID ohciExtension
,
446 POHCI_EXTENSION OhciExtension
;
447 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
448 PULONG PortStatusReg
;
449 OHCI_REG_RH_PORT_STATUS PortStatus
;
451 OhciExtension
= ohciExtension
;
453 DPRINT("OHCI_RH_ClearFeaturePortResetChange: OhciExtension - %p, Port - %x\n",
459 OperationalRegs
= OhciExtension
->OperationalRegs
;
460 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
462 PortStatus
.AsULONG
= 0;
463 PortStatus
.PortResetStatusChange
= 1;
465 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
467 return MP_STATUS_SUCCESS
;
472 OHCI_RH_ClearFeaturePortSuspendChange(IN PVOID ohciExtension
,
475 POHCI_EXTENSION OhciExtension
;
476 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
477 PULONG PortStatusReg
;
478 OHCI_REG_RH_PORT_STATUS PortStatus
;
480 OhciExtension
= ohciExtension
;
482 DPRINT("OHCI_RH_ClearFeaturePortSuspendChange: OhciExtension - %p, Port - %x\n",
488 OperationalRegs
= OhciExtension
->OperationalRegs
;
489 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
491 PortStatus
.AsULONG
= 0;
492 PortStatus
.PortSuspendStatusChange
= 1;
494 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
496 return MP_STATUS_SUCCESS
;
501 OHCI_RH_ClearFeaturePortOvercurrentChange(IN PVOID ohciExtension
,
504 POHCI_EXTENSION OhciExtension
;
505 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
506 PULONG PortStatusReg
;
508 OHCI_REG_RH_PORT_STATUS PortStatus
;
509 OHCI_REG_RH_STATUS RhStatus
;
511 OhciExtension
= ohciExtension
;
513 DPRINT("OHCI_RH_ClearFeaturePortOvercurrentChange: OhciExtension - %p, Port - %x\n",
517 OperationalRegs
= OhciExtension
->OperationalRegs
;
521 /* USBPORT_RECIPIENT_PORT */
522 PortStatus
.AsULONG
= 0;
523 PortStatus
.PortOverCurrentIndicatorChange
= 1;
525 PortStatusReg
= (PULONG
)&OperationalRegs
->HcRhPortStatus
[Port
-1];
526 WRITE_REGISTER_ULONG(PortStatusReg
, PortStatus
.AsULONG
);
530 /* USBPORT_RECIPIENT_HUB */
531 RhStatus
.AsULONG
= 0;
532 RhStatus
.OverCurrentIndicatorChangeW
= 1;
534 RhStatusReg
= (PULONG
)&OperationalRegs
->HcRhStatus
;
535 WRITE_REGISTER_ULONG(RhStatusReg
, RhStatus
.AsULONG
);
538 return MP_STATUS_SUCCESS
;
543 OHCI_RH_DisableIrq(IN PVOID ohciExtension
)
545 POHCI_EXTENSION OhciExtension
= ohciExtension
;
546 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
547 PULONG InterruptDisableReg
;
548 OHCI_REG_INTERRUPT_ENABLE_DISABLE InterruptDisable
;
550 DPRINT("OHCI_RH_DisableIrq: OhciExtension - %p\n", OhciExtension
);
552 OperationalRegs
= OhciExtension
->OperationalRegs
;
553 InterruptDisableReg
= (PULONG
)&OperationalRegs
->HcInterruptDisable
;
555 InterruptDisable
.AsULONG
= 0;
556 InterruptDisable
.RootHubStatusChange
= 1;
558 WRITE_REGISTER_ULONG(InterruptDisableReg
, InterruptDisable
.AsULONG
);
563 OHCI_RH_EnableIrq(IN PVOID ohciExtension
)
565 POHCI_EXTENSION OhciExtension
= ohciExtension
;
566 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
567 PULONG InterruptEnableReg
;
568 OHCI_REG_INTERRUPT_ENABLE_DISABLE InterruptEnable
;
570 DPRINT("OHCI_RH_EnableIrq: OhciExtension - %p\n", OhciExtension
);
572 OperationalRegs
= OhciExtension
->OperationalRegs
;
573 InterruptEnableReg
= (PULONG
)&OperationalRegs
->HcInterruptEnable
;
575 InterruptEnable
.AsULONG
= 0;
576 InterruptEnable
.RootHubStatusChange
= 1;
578 WRITE_REGISTER_ULONG(InterruptEnableReg
, InterruptEnable
.AsULONG
);