diff --git a/src/add-ons/kernel/busses/usb/ohci.cpp b/src/add-ons/kernel/busses/usb/ohci.cpp index da7b0d7d58..a2d1a076d9 100644 --- a/src/add-ons/kernel/busses/usb/ohci.cpp +++ b/src/add-ons/kernel/busses/usb/ohci.cpp @@ -66,7 +66,6 @@ OHCI::OHCI(pci_info *info, Stack *stack) fPCIInfo(info), fStack(stack), fRegisterArea(-1), - fSpinLock(0), fHccaArea(-1), fDummyControl(NULL), fDummyBulk(NULL), @@ -264,10 +263,9 @@ OHCI::OHCI(pci_info *info, Stack *stack) } // The controller is now in SUSPEND state, we have 2ms to go OPERATIONAL. - // In order to do so we need a spinlock + // In order to do so we need to disable interrupts. cpu_status former = disable_interrupts(); - acquire_spinlock(&fSpinLock); // Set up host controller register _WriteReg(OHCI_HCCA, (uint32)hccaPhysicalAddress); @@ -286,7 +284,6 @@ OHCI::OHCI(pci_info *info, Stack *stack) // And finally start the controller _WriteReg(OHCI_CONTROL, control); - release_spinlock(&fSpinLock); restore_interrupts(former); // The controller is now OPERATIONAL. @@ -429,6 +426,33 @@ OHCI::SubmitTransfer(Transfer *transfer) if (transfer->TransferPipe()->DeviceAddress() == fRootHubAddress) return fRootHub->ProcessTransfer(this, transfer); + uint32 type = transfer->TransferPipe()->Type(); + if ((type & USB_OBJECT_CONTROL_PIPE) || (type & USB_OBJECT_BULK_PIPE)) { + TRACE(("usb_ohci: submitting async transfer\n")); + return _SubmitAsyncTransfer(transfer); + } + + if ((type & USB_OBJECT_INTERRUPT_PIPE) || (type & USB_OBJECT_ISO_PIPE)) { + TRACE(("usb_ohci: submitting periodic transfer\n")); + return _SubmitPeriodicTransfer(transfer); + } + + TRACE_ERROR(("usb_ohci: tried to submit transfer for unknow pipe" + " type %lu\n", type)); + return B_ERROR; +} + + +status_t +OHCI::_SubmitAsyncTransfer(Transfer *transfer) +{ + return B_ERROR; +} + + +status_t +OHCI::_SubmitPeriodicTransfer(Transfer *transfer) +{ return B_ERROR; } diff --git a/src/add-ons/kernel/busses/usb/ohci.h b/src/add-ons/kernel/busses/usb/ohci.h index 6aa14284bb..0a1e8de0d9 100644 --- a/src/add-ons/kernel/busses/usb/ohci.h +++ b/src/add-ons/kernel/busses/usb/ohci.h @@ -59,7 +59,6 @@ public: virtual status_t SubmitTransfer(Transfer *transfer); virtual status_t CancelQueuedTransfers(Pipe *pipe, bool force); - status_t SubmitRequest(Transfer *transfer); virtual status_t NotifyPipeChange(Pipe *pipe, usb_change change); @@ -68,7 +67,8 @@ static status_t AddTo(Stack *stack); // Port operations uint8 PortCount() { return fPortCount; }; - status_t GetPortStatus(uint8 index, usb_port_status *status); + status_t GetPortStatus(uint8 index, + usb_port_status *status); status_t SetPortFeature(uint8 index, uint16 feature); status_t ClearPortFeature(uint8 index, uint16 feature); @@ -82,9 +82,13 @@ static int32 _InterruptHandler(void *data); static int32 _FinishThread(void *data); void _FinishTransfer(); + + status_t _SubmitAsyncTransfer(Transfer *transfer); + status_t _SubmitPeriodicTransfer(Transfer *transfer); // Endpoint related methods - status_t _CreateEndpoint(Pipe *pipe, bool isIsochronous); + status_t _CreateEndpoint(Pipe *pipe, + bool isIsochronous); ohci_endpoint_descriptor *_AllocateEndpoint(); void _FreeEndpoint( ohci_endpoint_descriptor *endpoint); @@ -109,8 +113,6 @@ static pci_module_info *sPCIModule; uint32 *fOperationalRegisters; area_id fRegisterArea; - spinlock fSpinLock; - // Host Controller Communication Area related stuff area_id fHccaArea; ohci_hcca *fHcca;