* Moved disable_interrupt right before resetting the controller

* Reworked on NotifyPipeChange
* Added _RemoveEndpointForPipe (not implemented)



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22934 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Salvatore Benedetto 2007-11-16 10:11:02 +00:00
parent 05c6416eba
commit e1abd4c8ce
2 changed files with 35 additions and 21 deletions

View File

@ -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)
{

View File

@ -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();