void AppleUSBUHCI::RHEnablePort(int port, bool enable) { UInt16 value; // USBLog(5, "AppleUSBUHCI[%p]::RHEnablePort %d %d", this, port, enable); port--; // convert 1-based to 0-based. value = ReadPortStatus(port) & kUHCI_PORTSC_MASK; USBLog(3, "AppleUSBUHCI[%p]::RHEnablePort port: %d enable: %d PortSC: 0x%x", this, port+1, enable, value); USBLog(2, "AppleUSBUHCI[%p]::RHEnablePort (CMD:%p STS:%p INTR:%p PORTSC1:%p PORTSC2:%p FRBASEADDR:%p FRNUM:%p, SOFMOD:%p, ConfigCMD:%p)", this, (void*)ioRead16(kUHCI_CMD), (void*)ioRead16(kUHCI_STS), (void*)ioRead16(kUHCI_INTR), (void*)ioRead16(kUHCI_PORTSC1), (void*)ioRead16(kUHCI_PORTSC2), (void*)ioRead32(kUHCI_FRBASEADDR), (void*)ioRead32(kUHCI_FRNUM), (void*)ioRead32(kUHCI_SOFMOD), (void*)_device->configRead16(kIOPCIConfigCommand)); if (enable) { value |= kUHCI_PORTSC_PED; } else { value &= ~kUHCI_PORTSC_PED; } WritePortStatus(port, value); }
//================================================================================================ // // RestartControllerFromReset // //================================================================================================ // IOReturn AppleUSBUHCI::RestartControllerFromReset(void) { USBTrace( kUSBTUHCI, KTPUHCIRestartControllerFromReset, (uintptr_t)this, 0, 0, 0); USBLog(5, "AppleUSBUHCI[%p]::RestartControllerFromReset - _myBusState(%d) CMD(%p) STS(%p) FRBASEADDR(%p) IOPCIConfigCommand(%p)", this, (int)_myBusState, (void*)ioRead16(kUHCI_CMD), (void*)ioRead16(kUHCI_STS), (void*)ioRead32(kUHCI_FRBASEADDR), (void*)_device->configRead16(kIOPCIConfigCommand)); Run(true); // prepare the _saveInterrupts variable for later enabling _saveInterrupts = kUHCI_INTR_TIE | kUHCI_INTR_RIE | kUHCI_INTR_IOCE | kUHCI_INTR_SPIE; USBLog(5, "AppleUSBUHCI[%p]::RestartControllerFromReset - I set _saveInterrupts to (%p)", this, (void*)_saveInterrupts); return kIOReturnSuccess; }
int main(int argc, char **argv) { io_registry_entry_t service; io_connect_t connect; kern_return_t status; service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleACPIPlatformExpert")); assert(service); if (service) { status = IOServiceOpen(service, mach_task_self(), 0, &connect); IOObjectRelease(service); assert(kIOReturnSuccess == status); } uint32_t count = 0; uint32_t segment = 0; uint32_t maxBus = 0; uint32_t bus, device, fn, maxFn; uint32_t vendProd; if (argc > 3) { bus = strtoul(argv[1], NULL, 0); device = strtoul(argv[2], NULL, 0); fn = strtoul(argv[3], NULL, 0); if (argc == 4) { dumpDevice(connect, segment, bus, device, fn, NULL, NULL); count++; } if (argc > 5) { uint32_t offs; uint32_t data; offs = strtoul(argv[4], NULL, 0); data = strtoul(argv[5], NULL, 0); configWrite32(connect, segment, bus, device, fn, offs, data); printf("wrote 0x%08x to [%d, %d, %d]:0x%X\n", data, bus, device, fn, offs); } else if (argc > 4) { uint32_t offs; uint32_t data; offs = strtoul(argv[4], NULL, 0); data = configRead32(connect, segment, bus, device, fn, offs); printf("read 0x%08x from [%d, %d, %d]:0x%X\n", data, bus, device, fn, offs); } } else if (argc > 2) { uint64_t offs; uint32_t data; offs = strtoull(argv[1], NULL, 0); data = strtoul(argv[2], NULL, 0); physWrite32(connect, offs, data); printf("wrote 0x%08x to 0x%llX\n", data, offs); } else if (argc > 1) { uint64_t offs; uint32_t data; offs = strtoull(argv[1], NULL, 0); if (true || (offs > 0x10000ULL)) { data = physRead32(connect, offs); printf("read 0x%08x from mem 0x%llX\n", data, offs); } else { data = ioRead32(connect, offs); printf("read 0x%08x from i/o 0x%llX\n", data, offs); } } else for (bus = 0; bus <= maxBus; bus++) { for (device = 0; device < 32; device++) { maxFn = 0; for (fn = 0; fn <= maxFn; fn++) { vendProd = configRead32(connect, segment, bus, device, fn, kIOPCIConfigVendorID); if ((0xFFFFFFFF == vendProd) || !vendProd) continue; count++; dumpDevice(connect, segment, bus, device, fn, &maxBus, &maxFn); } } } printf("total: %d\n", count); exit(0); }
// Called at software interrupt time void AppleUSBUHCI::HandleInterrupt(void) { UInt16 status; UInt32 intrStatus; bool needReset = false; status = ioRead16(kUHCI_STS); USBTrace_Start( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, 0, 0, 0); if (_hostControllerProcessInterrupt & kUHCI_STS_HCPE) { _hostControllerProcessInterrupt = 0; USBLog(1, "AppleUSBUHCI[%p]::HandleInterrupt - Host controller process error", this); USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, 0, 0, 1 ); needReset = true; } if (_hostSystemErrorInterrupt & kUHCI_STS_HSE) { _hostSystemErrorInterrupt = 0; USBLog(1, "AppleUSBUHCI[%p]::HandleInterrupt - Host controller system error(CMD:%p STS:%p INTR:%p PORTSC1:%p PORTSC2:%p FRBASEADDR:%p ConfigCMD:%p)", this,(void*)ioRead16(kUHCI_CMD), (void*)ioRead16(kUHCI_STS), (void*)ioRead16(kUHCI_INTR), (void*)ioRead16(kUHCI_PORTSC1), (void*)ioRead16(kUHCI_PORTSC2), (void*)ioRead32(kUHCI_FRBASEADDR), (void*)_device->configRead16(kIOPCIConfigCommand)); USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, ioRead16(kUHCI_CMD), 0, 2 ); USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, ioRead16(kUHCI_STS), ioRead16(kUHCI_INTR), ioRead16(kUHCI_PORTSC1), 3 ); USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, ioRead16(kUHCI_PORTSC2), ioRead32(kUHCI_FRBASEADDR), _device->configRead16(kIOPCIConfigCommand), 4 ); needReset = true; } if (_resumeDetectInterrupt & kUHCI_STS_RD) { _resumeDetectInterrupt = 0; USBLog(2, "AppleUSBUHCI[%p]::HandleInterrupt - Host controller resume detected - calling EnsureUsability", this); USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, 0, 0, 6); EnsureUsability(); } if (_usbErrorInterrupt & kUHCI_STS_EI) { _usbErrorInterrupt = 0; USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, 0, 0, 7); USBLog(6, "AppleUSBUHCI[%p]::HandleInterrupt - Host controller error interrupt", this); } if (_usbCompletionInterrupt & kUHCI_STS_INT) { _usbCompletionInterrupt = 0; // USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, 0, 0, 8); // updates hardware interrupt time from shadow vars that are se in the real irq handler UpdateFrameNumberWithTime(); USBLog(7, "AppleUSBUHCI[%p]::HandleInterrupt - Normal interrupt", this); if (_consumerCount != _producerCount) { USBLog(7, "AppleUSBUHCI[%p]::HandleInterrupt - Isoch was handled", this); } } // this code probably doesn't work if (needReset) { IOSleep(1000); USBLog(1, "AppleUSBUHCI[%p]::HandleInterrupt - Resetting controller due to errors detected at interrupt time (0x%x)", this, status); USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, status, needReset, 5 ); Reset(true); Run(true); } if (_myPowerState == kUSBPowerStateOn) { USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, status, 0, 9); ProcessCompletedTransactions(); // Check for root hub status change RHCheckStatus(); } else { USBLog(2, "AppleUSBUHCI[%p]::HandleInterrupt - deferring further processing until we are running again", this); USBTrace( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, 0, 0, 10); } USBTrace_End( kUSBTUHCIInterrupts, kTPUHCIInterruptsHandleInterrupt, (uintptr_t)this, 0, 0, 0); }