From 555d13dc9fde786e8f12f5be29d67ef22009ae25 Mon Sep 17 00:00:00 2001 From: Salvatore Benedetto Date: Fri, 25 Jan 2008 14:03:02 +0000 Subject: [PATCH] * Implemented private method _AppendChainDescriptorsToEndpoint in order to avoid code duplication (lock needs to be added) * Fixed _SubmitControlRequest in order to use _AppendChainDescriptorsToEndpoint git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23734 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/busses/usb/ohci.cpp | 70 ++++++++++++++++++++++---- src/add-ons/kernel/busses/usb/ohci.h | 5 ++ 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/add-ons/kernel/busses/usb/ohci.cpp b/src/add-ons/kernel/busses/usb/ohci.cpp index 2bd5ba5c36..4a0cec5257 100644 --- a/src/add-ons/kernel/busses/usb/ohci.cpp +++ b/src/add-ons/kernel/busses/usb/ohci.cpp @@ -536,7 +536,14 @@ OHCI::_FinishTransfer() if (transferDone) { size_t actualLength = 0; if (callbackStatus == B_OK) { - // TODO + if (transfer->data_descriptor && transfer->incoming) { + // Read data out + } else { + // How much was transfer? + } + if (transfer->transfer->IsFragmented()) { + // TODO + } } _UnlinkTransfer(transfer); transfer->transfer->Finished(callbackStatus, actualLength); @@ -570,6 +577,47 @@ OHCI::_FinishTransfer() } +status_t +OHCI::_AppendChainDescriptorsToEndpoint(ohci_endpoint_descriptor *endpoint, + ohci_general_td *first, ohci_general_td *last) +{ + endpoint->flags |= OHCI_ENDPOINT_SKIP; + snooze(1000); + + // TODO: Lock on endpoint + ohci_general_td *head = (ohci_general_td *)endpoint->head_logical_descriptor; + if (head) { + // There is at least one descriptor to this endpoint + ohci_general_td *tail = (ohci_general_td *)endpoint->tail_logical_descriptor; + if (tail) { + // There is more than one descriptor + tail->next_logical_descriptor = first; + tail->next_physical_descriptor = first->physical_address; + } else { + // There is only one descriptor to this endpoint + head->next_logical_descriptor = first; + head->next_physical_descriptor = first->physical_address; + } + endpoint->tail_logical_descriptor = last; + endpoint->tail_physical_descriptor = last->physical_address; + } else { + // Endpoint is empty + endpoint->head_logical_descriptor = first; + endpoint->head_physical_descriptor = first->physical_address; + // Update tail only if we are appending more than one descriptor + // otherwise the controller won't process the descriptor as + // head will be the same as tail. + if (first != last) { + endpoint->tail_logical_descriptor = last; + endpoint->tail_physical_descriptor = last->physical_address; + } + } + + endpoint->flags &= ~OHCI_ENDPOINT_SKIP; + return B_OK; +} + + void OHCI::_RemoveTransferFromEndpoint(transfer_data *transfer) { @@ -773,16 +821,9 @@ OHCI::_SubmitControlRequest(Transfer *transfer) _LinkDescriptors(setupDescriptor, statusDescriptor); } - // 1. Insert the chain descriptors to the endpoint + // Append Transfer ohci_endpoint_descriptor *endpoint = (ohci_endpoint_descriptor *)transfer->TransferPipe()->ControllerCookie(); - endpoint->tail_physical_descriptor = statusDescriptor->physical_address; - endpoint->head_physical_descriptor = setupDescriptor->physical_address; - // 2. Clear the Skip bit in the enpoint - endpoint->flags &= ~OHCI_ENDPOINT_SKIP; - // 3. Tell the controller to process the control list - _WriteReg(OHCI_COMMAND_STATUS, OHCI_CONTROL_LIST_FILLED); - result = _AddPendingTransfer(transfer, endpoint, setupDescriptor, dataDescriptor, directionIn); if (result < B_OK) { @@ -791,6 +832,17 @@ OHCI::_SubmitControlRequest(Transfer *transfer) return result; } + // Append descriptors chain to the endpoint + result = _AppendChainDescriptorsToEndpoint(endpoint, setupDescriptor, + statusDescriptor); + if (result < B_OK) { + TRACE_ERROR(("usb_ohci: failed to append chain descriptors to endpoint\n")); + // TODO: Remove transfer_data from list + _FreeDescriptorChain(setupDescriptor); + } + + // Tell the controller to process the control list + _WriteReg(OHCI_COMMAND_STATUS, OHCI_CONTROL_LIST_FILLED); return B_OK; } diff --git a/src/add-ons/kernel/busses/usb/ohci.h b/src/add-ons/kernel/busses/usb/ohci.h index 4e60fc42ba..05f0189012 100644 --- a/src/add-ons/kernel/busses/usb/ohci.h +++ b/src/add-ons/kernel/busses/usb/ohci.h @@ -111,6 +111,11 @@ static int32 _FinishThread(void *data); status_t _SubmitBulkTransfer(Transfer *transfer); status_t _SubmitPeriodicTransfer(Transfer *transfer); + status_t _AppendChainDescriptorsToEndpoint( + ohci_endpoint_descriptor *endpoint, + ohci_general_td *first, + ohci_general_td *last); + // Endpoint related methods ohci_endpoint_descriptor *_AllocateEndpoint(); void _FreeEndpoint(