diff --git a/src/add-ons/kernel/busses/usb/ohci.cpp b/src/add-ons/kernel/busses/usb/ohci.cpp index a2d1a076d9..7f537a2cf4 100644 --- a/src/add-ons/kernel/busses/usb/ohci.cpp +++ b/src/add-ons/kernel/busses/usb/ohci.cpp @@ -249,8 +249,10 @@ OHCI::OHCI(pci_info *info, Stack *stack) // We now own the host controller and the bus has been reset uint32 frameInterval = _ReadReg(OHCI_FRAME_INTERVAL); uint32 intervalValue = OHCI_GET_INTERVAL_VALUE(frameInterval); - _WriteReg(OHCI_COMMAND_STATUS, OHCI_HOST_CONTROLLER_RESET); + // Disable interrupts right before we reset + cpu_status former = disable_interrupts(); + _WriteReg(OHCI_COMMAND_STATUS, OHCI_HOST_CONTROLLER_RESET); for (uint32 i = 0; i < 10; i++) { snooze(10); if (!(_ReadReg(OHCI_COMMAND_STATUS) & OHCI_HOST_CONTROLLER_RESET)) @@ -259,13 +261,12 @@ OHCI::OHCI(pci_info *info, Stack *stack) if (_ReadReg(OHCI_COMMAND_STATUS) & OHCI_HOST_CONTROLLER_RESET) { TRACE_ERROR(("usb_ohci: Error resetting the host controller (timeout)\n")); + restore_interrupts(former); return; } // The controller is now in SUSPEND state, we have 2ms to go OPERATIONAL. - // In order to do so we need to disable interrupts. - - cpu_status former = disable_interrupts(); + // Interrupts are disabled. // Set up host controller register _WriteReg(OHCI_HCCA, (uint32)hccaPhysicalAddress); @@ -437,7 +438,7 @@ OHCI::SubmitTransfer(Transfer *transfer) return _SubmitPeriodicTransfer(transfer); } - TRACE_ERROR(("usb_ohci: tried to submit transfer for unknow pipe" + TRACE_ERROR(("usb_ohci: tried to submit transfer for unknown pipe" " type %lu\n", type)); return B_ERROR; } @@ -460,21 +461,26 @@ OHCI::_SubmitPeriodicTransfer(Transfer *transfer) status_t OHCI::NotifyPipeChange(Pipe *pipe, usb_change change) { - TRACE(("usb_ohci::%s(%p, %d)\n", __FUNCTION__, pipe, (int)change)); - if (InitCheck()) - return B_ERROR; - + TRACE(("usb_ohci: pipe change %d for pipe 0x%08lx\n", change, (uint32)pipe)); switch (change) { - case USB_CHANGE_CREATED: - return _InsertEndpointForPipe(pipe); - case USB_CHANGE_DESTROYED: - // Do something - return B_ERROR; - case USB_CHANGE_PIPE_POLICY_CHANGED: - default: - break; + case USB_CHANGE_CREATED: { + TRACE(("usb_ohci: inserting endpoint\n")); + return _InsertEndpointForPipe(pipe); + } + case USB_CHANGE_DESTROYED: { + TRACE(("usb_ohci: removing endpoint\n")); + return _RemoveEndpointForPipe(pipe); + } + case USB_CHANGE_PIPE_POLICY_CHANGED: { + TRACE(("usb_ohci: pipe policy changing unhandled!\n")); + break; + } + default: { + TRACE_ERROR(("usb_ohci: unknown pipe change!\n")); + return B_ERROR; + } } - return B_ERROR; //We should never go here + return B_OK; } @@ -706,7 +712,7 @@ OHCI::_FreeGeneralDescriptor(ohci_general_descriptor *descriptor) status_t -OHCI::_InsertEndpointForPipe(Pipe *p) +OHCI::_InsertEndpointForPipe(Pipe *pipe) { #if 0 TRACE(("OHCI: Inserting Endpoint for device %u function %u\n", p->DeviceAddress(), p->EndpointAddress())); @@ -800,6 +806,13 @@ OHCI::_InsertEndpointForPipe(Pipe *p) } +status_t +OHCI::_RemoveEndpointForPipe(Pipe *pipe) +{ + return B_ERROR; +} + + inline void OHCI::_WriteReg(uint32 reg, uint32 value) { diff --git a/src/add-ons/kernel/busses/usb/ohci.h b/src/add-ons/kernel/busses/usb/ohci.h index 0a1e8de0d9..a660e4178b 100644 --- a/src/add-ons/kernel/busses/usb/ohci.h +++ b/src/add-ons/kernel/busses/usb/ohci.h @@ -85,14 +85,15 @@ static int32 _FinishThread(void *data); status_t _SubmitAsyncTransfer(Transfer *transfer); status_t _SubmitPeriodicTransfer(Transfer *transfer); - + // Endpoint related methods + status_t _InsertEndpointForPipe(Pipe *pipe); + status_t _RemoveEndpointForPipe(Pipe *pipe); status_t _CreateEndpoint(Pipe *pipe, bool isIsochronous); ohci_endpoint_descriptor *_AllocateEndpoint(); void _FreeEndpoint( ohci_endpoint_descriptor *endpoint); - status_t _InsertEndpointForPipe(Pipe *pipe); // Transfer descriptor related methods ohci_general_descriptor *_CreateGeneralDescriptor();