* License changed: I've successfully contacted Jan-Rixt Van Hoye, and he gave me his bless :)
* Usual clean up git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22555 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,27 +1,11 @@
|
|||||||
//------------------------------------------------------------------------------
|
/*
|
||||||
// Copyright (c) 2005, Jan-Rixt Van Hoye
|
* Copyright 2005-2008, Haiku Inc. All rights reserved.
|
||||||
//
|
* Distributed under the terms of the MIT License.
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
*
|
||||||
// copy of this software and associated documentation files (the "Software"),
|
* Authors:
|
||||||
// to deal in the Software without restriction, including without limitation
|
* Jan-Rixt Van Hoye
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
* Salvatore Benedetto <[email protected]>
|
||||||
// and/or sell copies of the Software, and to permit persons to whom the
|
*/
|
||||||
// Software is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
// DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// Authors:
|
|
||||||
// Salvatore Benedetto <[email protected]>
|
|
||||||
|
|
||||||
#include <module.h>
|
#include <module.h>
|
||||||
#include <PCI.h>
|
#include <PCI.h>
|
||||||
@@ -32,6 +16,40 @@
|
|||||||
#include "ohci.h"
|
#include "ohci.h"
|
||||||
|
|
||||||
pci_module_info *OHCI::sPCIModule = NULL;
|
pci_module_info *OHCI::sPCIModule = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
static int32
|
||||||
|
ohci_std_ops( int32 op , ... )
|
||||||
|
{
|
||||||
|
switch (op) {
|
||||||
|
case B_MODULE_INIT:
|
||||||
|
TRACE(("usb_ohci_module: init module\n"));
|
||||||
|
return B_OK;
|
||||||
|
case B_MODULE_UNINIT:
|
||||||
|
TRACE(("usb_ohci_module: uninit module\n"));
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
host_controller_info ohci_module = {
|
||||||
|
{
|
||||||
|
"busses/usb/ohci",
|
||||||
|
0,
|
||||||
|
ohci_std_ops
|
||||||
|
},
|
||||||
|
NULL,
|
||||||
|
OHCI::AddTo
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
module_info *modules[] = {
|
||||||
|
(module_info *) &ohci_module,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------
|
//------------------------------------------------------
|
||||||
// OHCI:: Reverse the bits in a value between 0 and 31
|
// OHCI:: Reverse the bits in a value between 0 and 31
|
||||||
@@ -42,146 +60,12 @@ static uint8 revbits[OHCI_NUMBER_OF_INTERRUPTS] =
|
|||||||
0x02, 0x12, 0x0a, 0x1a, 0x06, 0x16, 0x0e, 0x1e,
|
0x02, 0x12, 0x0a, 0x1a, 0x06, 0x16, 0x0e, 0x1e,
|
||||||
0x01, 0x11, 0x09, 0x19, 0x05, 0x15, 0x0d, 0x1d,
|
0x01, 0x11, 0x09, 0x19, 0x05, 0x15, 0x0d, 0x1d,
|
||||||
0x03, 0x13, 0x0b, 0x1b, 0x07, 0x17, 0x0f, 0x1f };
|
0x03, 0x13, 0x0b, 0x1b, 0x07, 0x17, 0x0f, 0x1f };
|
||||||
|
|
||||||
|
|
||||||
static int32
|
|
||||||
ohci_std_ops( int32 op , ... )
|
|
||||||
{
|
|
||||||
switch (op)
|
|
||||||
{
|
|
||||||
case B_MODULE_INIT:
|
|
||||||
TRACE(("usb_ohci_module: init module\n"));
|
|
||||||
return B_OK;
|
|
||||||
case B_MODULE_UNINIT:
|
|
||||||
TRACE(("usb_ohci_module: uninit module\n"));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
// OHCI:: Give an reference of a stack instance to the OHCI module
|
|
||||||
//
|
|
||||||
// parameters:
|
|
||||||
// - &stack: reference to a stack instance form stack.cpp
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
|
|
||||||
status_t
|
|
||||||
OHCI::AddTo(Stack *stack)
|
|
||||||
{
|
|
||||||
#ifdef TRACE_USB
|
|
||||||
set_dprintf_enabled(true);
|
|
||||||
load_driver_symbols("ohci");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!sPCIModule) {
|
|
||||||
status_t status = get_module(B_PCI_MODULE_NAME, (module_info **)&sPCIModule);
|
|
||||||
if (status < B_OK) {
|
|
||||||
TRACE_ERROR(("usb_ohci: AddTo(): getting pci module failed! 0x%08lx\n",
|
|
||||||
status));
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE(("usb_ohci: AddTo(): setting up hardware\n"));
|
|
||||||
|
|
||||||
bool found = false;
|
|
||||||
pci_info *item = new(std::nothrow) pci_info;
|
|
||||||
if (!item) {
|
|
||||||
sPCIModule = NULL;
|
|
||||||
put_module(B_PCI_MODULE_NAME);
|
|
||||||
return B_NO_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32 i = 0 ; sPCIModule->get_nth_pci_info(i, item) >= B_OK; i++) {
|
|
||||||
|
|
||||||
if (item->class_base == PCI_serial_bus && item->class_sub == PCI_usb
|
|
||||||
&& item->class_api == PCI_usb_ohci) {
|
|
||||||
if (item->u.h0.interrupt_line == 0
|
|
||||||
|| item->u.h0.interrupt_line == 0xFF) {
|
|
||||||
TRACE_ERROR(("usb_ohci: AddTo(): found with invalid IRQ -"
|
|
||||||
" check IRQ assignement\n"));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE(("usb_ohci: AddTo(): found at IRQ %u\n",
|
|
||||||
item->u.h0.interrupt_line));
|
|
||||||
OHCI *bus = new(std::nothrow) OHCI(item, stack);
|
|
||||||
if (!bus) {
|
|
||||||
delete item;
|
|
||||||
sPCIModule = NULL;
|
|
||||||
put_module(B_PCI_MODULE_NAME);
|
|
||||||
return B_NO_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bus->InitCheck() < B_OK) {
|
|
||||||
TRACE_ERROR(("usb_ohci: AddTo(): InitCheck() failed 0x%08lx\n",
|
|
||||||
bus->InitCheck()));
|
|
||||||
delete bus;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// the bus took it away
|
|
||||||
item = new(std::nothrow) pci_info;
|
|
||||||
|
|
||||||
bus->Start();
|
|
||||||
stack->AddBusManager(bus);
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
TRACE_ERROR(("usb_ohci: no devices found\n"));
|
|
||||||
delete item;
|
|
||||||
put_module(B_PCI_MODULE_NAME);
|
|
||||||
return ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete item;
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
// OHCI:: Host controller information
|
|
||||||
//
|
|
||||||
// parameters: none
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
|
|
||||||
host_controller_info ohci_module = {
|
|
||||||
{
|
|
||||||
"busses/usb/ohci",
|
|
||||||
0,
|
|
||||||
ohci_std_ops
|
|
||||||
},
|
|
||||||
NULL,
|
|
||||||
OHCI::AddTo
|
|
||||||
};
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
// OHCI:: Module information
|
|
||||||
//
|
|
||||||
// parameters: none
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
|
|
||||||
module_info *modules[] = {
|
|
||||||
(module_info *) &ohci_module,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
// OHCI:: Constructor/Initialisation
|
|
||||||
//
|
|
||||||
// parameters:
|
|
||||||
// - info: pointer to a pci information structure
|
|
||||||
// - stack: pointer to a stack instance
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
|
|
||||||
OHCI::OHCI(pci_info *info, Stack *stack)
|
OHCI::OHCI(pci_info *info, Stack *stack)
|
||||||
: BusManager(stack),
|
: BusManager(stack),
|
||||||
|
fPCIInfo(info),
|
||||||
|
fStack(stack),
|
||||||
fRegisterArea(-1),
|
fRegisterArea(-1),
|
||||||
fHccaArea(-1),
|
fHccaArea(-1),
|
||||||
fDummyControl(0),
|
fDummyControl(0),
|
||||||
@@ -191,14 +75,13 @@ OHCI::OHCI(pci_info *info, Stack *stack)
|
|||||||
fRootHubAddress(0),
|
fRootHubAddress(0),
|
||||||
fNumPorts(0)
|
fNumPorts(0)
|
||||||
{
|
{
|
||||||
fPCIInfo = info;
|
|
||||||
fStack = stack;
|
|
||||||
int i;
|
int i;
|
||||||
TRACE(("usb_ohci: constructing new BusManager\n"));
|
TRACE(("usb_ohci: constructing new BusManager\n"));
|
||||||
|
|
||||||
fInitOK = false;
|
fInitOK = false;
|
||||||
|
|
||||||
for(i = 0; i < OHCI_NO_EDS; i++) //Clear the interrupt list
|
fInterruptEndpoints = new(std::nothrow) uint32[OHCI_NUMBER_OF_INTERRUPTS];
|
||||||
|
for(i = 0; i < OHCI_NUMBER_OF_INTERRUPTS; i++) //Clear the interrupt list
|
||||||
fInterruptEndpoints[i] = 0;
|
fInterruptEndpoints[i] = 0;
|
||||||
|
|
||||||
// enable busmaster and memory mapped access
|
// enable busmaster and memory mapped access
|
||||||
@@ -338,6 +221,7 @@ OHCI::OHCI(pci_info *info, Stack *stack)
|
|||||||
fInitOK = true;
|
fInitOK = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OHCI::~OHCI()
|
OHCI::~OHCI()
|
||||||
{
|
{
|
||||||
if (fHccaArea > 0)
|
if (fHccaArea > 0)
|
||||||
@@ -357,6 +241,7 @@ OHCI::~OHCI()
|
|||||||
FreeEndpoint(fInterruptEndpoints[i]);
|
FreeEndpoint(fInterruptEndpoints[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
OHCI::Start()
|
OHCI::Start()
|
||||||
{
|
{
|
||||||
@@ -388,7 +273,9 @@ OHCI::Start()
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t OHCI::SubmitTransfer( Transfer *t )
|
|
||||||
|
status_t
|
||||||
|
OHCI::SubmitTransfer(Transfer *t)
|
||||||
{
|
{
|
||||||
TRACE(("usb OHCI::SubmitTransfer: called for device %d\n", t->TransferPipe()->DeviceAddress()));
|
TRACE(("usb OHCI::SubmitTransfer: called for device %d\n", t->TransferPipe()->DeviceAddress()));
|
||||||
|
|
||||||
@@ -398,6 +285,7 @@ status_t OHCI::SubmitTransfer( Transfer *t )
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
OHCI::NotifyPipeChange(Pipe *pipe, usb_change change)
|
OHCI::NotifyPipeChange(Pipe *pipe, usb_change change)
|
||||||
{
|
{
|
||||||
@@ -418,11 +306,88 @@ OHCI::NotifyPipeChange(Pipe *pipe, usb_change change)
|
|||||||
return B_ERROR; //We should never go here
|
return B_ERROR; //We should never go here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
OHCI::AddTo(Stack *stack)
|
||||||
|
{
|
||||||
|
#ifdef TRACE_USB
|
||||||
|
set_dprintf_enabled(true);
|
||||||
|
load_driver_symbols("ohci");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!sPCIModule) {
|
||||||
|
status_t status = get_module(B_PCI_MODULE_NAME, (module_info **)&sPCIModule);
|
||||||
|
if (status < B_OK) {
|
||||||
|
TRACE_ERROR(("usb_ohci: AddTo(): getting pci module failed! 0x%08lx\n",
|
||||||
|
status));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE(("usb_ohci: AddTo(): setting up hardware\n"));
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
pci_info *item = new(std::nothrow) pci_info;
|
||||||
|
if (!item) {
|
||||||
|
sPCIModule = NULL;
|
||||||
|
put_module(B_PCI_MODULE_NAME);
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32 i = 0 ; sPCIModule->get_nth_pci_info(i, item) >= B_OK; i++) {
|
||||||
|
|
||||||
|
if (item->class_base == PCI_serial_bus && item->class_sub == PCI_usb
|
||||||
|
&& item->class_api == PCI_usb_ohci) {
|
||||||
|
if (item->u.h0.interrupt_line == 0
|
||||||
|
|| item->u.h0.interrupt_line == 0xFF) {
|
||||||
|
TRACE_ERROR(("usb_ohci: AddTo(): found with invalid IRQ -"
|
||||||
|
" check IRQ assignement\n"));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE(("usb_ohci: AddTo(): found at IRQ %u\n",
|
||||||
|
item->u.h0.interrupt_line));
|
||||||
|
OHCI *bus = new(std::nothrow) OHCI(item, stack);
|
||||||
|
if (!bus) {
|
||||||
|
delete item;
|
||||||
|
sPCIModule = NULL;
|
||||||
|
put_module(B_PCI_MODULE_NAME);
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bus->InitCheck() < B_OK) {
|
||||||
|
TRACE_ERROR(("usb_ohci: AddTo(): InitCheck() failed 0x%08lx\n",
|
||||||
|
bus->InitCheck()));
|
||||||
|
delete bus;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the bus took it away
|
||||||
|
item = new(std::nothrow) pci_info;
|
||||||
|
|
||||||
|
bus->Start();
|
||||||
|
stack->AddBusManager(bus);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
TRACE_ERROR(("usb_ohci: no devices found\n"));
|
||||||
|
delete item;
|
||||||
|
put_module(B_PCI_MODULE_NAME);
|
||||||
|
return ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete item;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
OHCI::GetPortStatus(uint8 index, usb_port_status *status)
|
OHCI::GetPortStatus(uint8 index, usb_port_status *status)
|
||||||
{
|
{
|
||||||
TRACE(("OHCI::%s(%ud, )\n", __FUNCTION__, index));
|
TRACE(("OHCI::%s(%ud, )\n", __FUNCTION__, index));
|
||||||
if (index > fNumPorts)
|
if (index >= fNumPorts)
|
||||||
return B_BAD_INDEX;
|
return B_BAD_INDEX;
|
||||||
|
|
||||||
status->status = status->change = 0;
|
status->status = status->change = 0;
|
||||||
@@ -462,6 +427,7 @@ OHCI::GetPortStatus(uint8 index, usb_port_status *status)
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
OHCI::SetPortFeature(uint8 index, uint16 feature)
|
OHCI::SetPortFeature(uint8 index, uint16 feature)
|
||||||
{
|
{
|
||||||
@@ -482,6 +448,7 @@ OHCI::SetPortFeature(uint8 index, uint16 feature)
|
|||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
OHCI::ClearPortFeature(uint8 index, uint16 feature)
|
OHCI::ClearPortFeature(uint8 index, uint16 feature)
|
||||||
{
|
{
|
||||||
@@ -502,6 +469,7 @@ OHCI::ClearPortFeature(uint8 index, uint16 feature)
|
|||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Endpoint *
|
Endpoint *
|
||||||
OHCI::AllocateEndpoint()
|
OHCI::AllocateEndpoint()
|
||||||
{
|
{
|
||||||
@@ -527,6 +495,7 @@ OHCI::AllocateEndpoint()
|
|||||||
return endpoint;
|
return endpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
OHCI::FreeEndpoint(Endpoint *end)
|
OHCI::FreeEndpoint(Endpoint *end)
|
||||||
{
|
{
|
||||||
@@ -535,6 +504,7 @@ OHCI::FreeEndpoint(Endpoint *end)
|
|||||||
delete end;
|
delete end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TransferDescriptor *
|
TransferDescriptor *
|
||||||
OHCI::AllocateTransfer()
|
OHCI::AllocateTransfer()
|
||||||
{
|
{
|
||||||
@@ -549,7 +519,8 @@ OHCI::AllocateTransfer()
|
|||||||
memset((void *)transfer->td, 0, sizeof(ohci_general_transfer_descriptor));
|
memset((void *)transfer->td, 0, sizeof(ohci_general_transfer_descriptor));
|
||||||
return transfer;
|
return transfer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
OHCI::FreeTransfer(TransferDescriptor *trans)
|
OHCI::FreeTransfer(TransferDescriptor *trans)
|
||||||
{
|
{
|
||||||
@@ -558,6 +529,7 @@ OHCI::FreeTransfer(TransferDescriptor *trans)
|
|||||||
delete trans;
|
delete trans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
OHCI::InsertEndpointForPipe(Pipe *p)
|
OHCI::InsertEndpointForPipe(Pipe *p)
|
||||||
{
|
{
|
||||||
@@ -650,7 +622,6 @@ OHCI::InsertEndpointForPipe(Pipe *p)
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_module_info *sPCIModule = 0;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
OHCI::WriteReg(uint32 reg, uint32 value)
|
OHCI::WriteReg(uint32 reg, uint32 value)
|
||||||
@@ -659,6 +630,7 @@ OHCI::WriteReg(uint32 reg, uint32 value)
|
|||||||
*(volatile uint32 *)(fRegisterBase + reg) = value;
|
*(volatile uint32 *)(fRegisterBase + reg) = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32
|
uint32
|
||||||
OHCI::ReadReg(uint32 reg)
|
OHCI::ReadReg(uint32 reg)
|
||||||
{
|
{
|
||||||
@@ -666,9 +638,9 @@ OHCI::ReadReg(uint32 reg)
|
|||||||
return *(volatile uint32 *)(fRegisterBase + reg);
|
return *(volatile uint32 *)(fRegisterBase + reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
OHCI::CancelQueuedTransfers(Pipe *pipe)
|
OHCI::CancelQueuedTransfers(Pipe *pipe)
|
||||||
{
|
{
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,11 @@
|
|||||||
//------------------------------------------------------------------------------
|
/*
|
||||||
// Copyright (c) 2005, Jan-Rixt Van Hoye
|
* Copyright 2005-2008, Haiku Inc. All rights reserved.
|
||||||
//
|
* Distributed under the terms of the MIT License.
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
*
|
||||||
// copy of this software and associated documentation files (the "Software"),
|
* Authors:
|
||||||
// to deal in the Software without restriction, including without limitation
|
* Jan-Rixt Van Hoye
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
* Salvatore Benedetto <[email protected]>
|
||||||
// and/or sell copies of the Software, and to permit persons to whom the
|
*/
|
||||||
// Software is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
// DEALINGS IN THE SOFTWARE.
|
|
||||||
//-------------------------------------------------------------------------------
|
|
||||||
// Authors:
|
|
||||||
// Salvatore Benedetto <[email protected]>
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef OHCI_H
|
#ifndef OHCI_H
|
||||||
#define OHCI_H
|
#define OHCI_H
|
||||||
@@ -63,14 +47,40 @@ typedef struct hcd_soft_itransfer
|
|||||||
|
|
||||||
#define OHCI_NO_EDS (2 * OHCI_NUMBER_OF_INTERRUPTS - 1)
|
#define OHCI_NO_EDS (2 * OHCI_NUMBER_OF_INTERRUPTS - 1)
|
||||||
|
|
||||||
// --------------------------------
|
//
|
||||||
// OHCI: The OHCI class derived
|
// Endpoint: wrapper around the hardware endpoints
|
||||||
// from the BusManager
|
//
|
||||||
// --------------------------------
|
|
||||||
|
struct Endpoint
|
||||||
|
{
|
||||||
|
addr_t physicaladdress;//Point to the physical address
|
||||||
|
ohci_endpoint_descriptor *ed; //Logical 'endpoint'
|
||||||
|
Endpoint *next; //Pointer to the 'next' endpoint
|
||||||
|
TransferDescriptor *head, *tail; //Pointers to the 'head' and 'tail' transfer descriptors
|
||||||
|
|
||||||
|
//Utility functions
|
||||||
|
void SetNext(Endpoint *end) {
|
||||||
|
next = end;
|
||||||
|
if (end == 0)
|
||||||
|
ed->next_endpoint = 0;
|
||||||
|
else
|
||||||
|
ed->next_endpoint = end->physicaladdress;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Constructor (or better: initialiser)
|
||||||
|
Endpoint() : physicaladdress(0), ed(0), next(0), head(0), tail(0) {};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct TransferDescriptor
|
||||||
|
{
|
||||||
|
addr_t physicaladdress;
|
||||||
|
ohci_general_transfer_descriptor *td;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class OHCI : public BusManager
|
class OHCI : public BusManager
|
||||||
{
|
{
|
||||||
friend class OHCIRootHub;
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
OHCI(pci_info *info, Stack *stack);
|
OHCI(pci_info *info, Stack *stack);
|
||||||
@@ -97,7 +107,7 @@ private:
|
|||||||
inline void WriteReg(uint32 reg, uint32 value);
|
inline void WriteReg(uint32 reg, uint32 value);
|
||||||
inline uint32 ReadReg(uint32 reg);
|
inline uint32 ReadReg(uint32 reg);
|
||||||
|
|
||||||
// Global
|
// Global
|
||||||
static pci_module_info *sPCIModule;
|
static pci_module_info *sPCIModule;
|
||||||
|
|
||||||
uint32 *fRegisterBase;
|
uint32 *fRegisterBase;
|
||||||
@@ -106,21 +116,21 @@ static pci_module_info *sPCIModule;
|
|||||||
|
|
||||||
area_id fRegisterArea;
|
area_id fRegisterArea;
|
||||||
|
|
||||||
// HCCA
|
// HCCA
|
||||||
area_id fHccaArea;
|
area_id fHccaArea;
|
||||||
struct ohci_hcca *fHcca; // The HCCA structure for the interupt communication
|
struct ohci_hcca *fHcca;
|
||||||
Endpoint *fInterruptEndpoints[OHCI_NO_EDS]; // The interrupt endpoint list
|
Endpoint *fInterruptEndpoints[OHCI_NO_EDS];
|
||||||
// Dummy endpoints
|
// Dummy endpoints
|
||||||
Endpoint *fDummyControl;
|
Endpoint *fDummyControl;
|
||||||
Endpoint *fDummyBulk;
|
Endpoint *fDummyBulk;
|
||||||
Endpoint *fDummyIsochronous;
|
Endpoint *fDummyIsochronous;
|
||||||
// functions
|
// functions
|
||||||
Endpoint *AllocateEndpoint(); // allocate memory for an endpoint
|
Endpoint *AllocateEndpoint();
|
||||||
void FreeEndpoint(Endpoint *end); // Free endpoint
|
void FreeEndpoint(Endpoint *end);
|
||||||
TransferDescriptor *AllocateTransfer(); // create a NULL transfer
|
TransferDescriptor *AllocateTransfer();
|
||||||
void FreeTransfer(TransferDescriptor *trans); // Free transfer
|
void FreeTransfer(TransferDescriptor *trans);
|
||||||
|
|
||||||
status_t InsertEndpointForPipe(Pipe *p);
|
status_t InsertEndpointForPipe(Pipe *p);
|
||||||
|
|
||||||
// Root Hub
|
// Root Hub
|
||||||
OHCIRootHub *fRootHub;
|
OHCIRootHub *fRootHub;
|
||||||
@@ -128,47 +138,15 @@ static pci_module_info *sPCIModule;
|
|||||||
uint8 fNumPorts;
|
uint8 fNumPorts;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------
|
|
||||||
// OHCI: The root hub of the OHCI
|
|
||||||
// controller derived from
|
|
||||||
// the Hub class
|
|
||||||
// --------------------------------
|
|
||||||
|
|
||||||
class OHCIRootHub : public Hub
|
class OHCIRootHub : public Hub {
|
||||||
{
|
public:
|
||||||
public:
|
OHCIRootHub(Object *rootObject,
|
||||||
OHCIRootHub(OHCI *ohci, int8 deviceAddress);
|
int8 deviceAddress);
|
||||||
status_t ProcessTransfer(Transfer *t, OHCI *ohci);
|
|
||||||
|
static status_t ProcessTransfer(OHCI *ohci,
|
||||||
|
Transfer *transfer);
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// Endpoint: wrapper around the hardware endpoints
|
|
||||||
//
|
|
||||||
|
|
||||||
struct Endpoint
|
|
||||||
{
|
|
||||||
addr_t physicaladdress;//Point to the physical address
|
|
||||||
ohci_endpoint_descriptor *ed; //Logical 'endpoint'
|
|
||||||
Endpoint *next; //Pointer to the 'next' endpoint
|
|
||||||
TransferDescriptor *head, *tail; //Pointers to the 'head' and 'tail' transfer descriptors
|
|
||||||
|
|
||||||
//Utility functions
|
|
||||||
void SetNext(Endpoint *end) {
|
|
||||||
next = end;
|
|
||||||
if (end == 0)
|
|
||||||
ed->next_endpoint = 0;
|
|
||||||
else
|
|
||||||
ed->next_endpoint = end->physicaladdress;
|
|
||||||
};
|
|
||||||
|
|
||||||
//Constructor (or better: initialiser)
|
|
||||||
Endpoint() : physicaladdress(0), ed(0), next(0), head(0), tail(0) {};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TransferDescriptor
|
|
||||||
{
|
|
||||||
addr_t physicaladdress;
|
|
||||||
ohci_general_transfer_descriptor *td;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // OHCI_H
|
#endif // OHCI_H
|
||||||
|
|||||||
@@ -1,28 +1,11 @@
|
|||||||
//------------------------------------------------------------------------------
|
/*
|
||||||
// Copyright (c) 2005, Jan-Rixt Van Hoye
|
* Copyright 2005-2008, Haiku Inc. All rights reserved.
|
||||||
//
|
* Distributed under the terms of the MIT License.
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
*
|
||||||
// copy of this software and associated documentation files (the "Software"),
|
* Authors:
|
||||||
// to deal in the Software without restriction, including without limitation
|
* Jan-Rixt Van Hoye
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
* Salvatore Benedetto <[email protected]>
|
||||||
// and/or sell copies of the Software, and to permit persons to whom the
|
*/
|
||||||
// Software is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
// DEALINGS IN THE SOFTWARE.
|
|
||||||
//
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Authors:
|
|
||||||
// Salvatore Benedetto <[email protected]>
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef OHCI_HARD_H
|
#ifndef OHCI_HARD_H
|
||||||
#define OHCI_HARD_H
|
#define OHCI_HARD_H
|
||||||
|
|||||||
@@ -1,25 +1,11 @@
|
|||||||
//------------------------------------------------------------------------------
|
/*
|
||||||
// Copyright (c) 2005, Jan-Rixt Van Hoye
|
* Copyright 2005-2008, Haiku Inc. All rights reserved.
|
||||||
//
|
* Distributed under the terms of the MIT License.
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
*
|
||||||
// copy of this software and associated documentation files (the "Software"),
|
* Authors:
|
||||||
// to deal in the Software without restriction, including without limitation
|
* Jan-Rixt Van Hoye
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
* Salvatore Benedetto <[email protected]>
|
||||||
// and/or sell copies of the Software, and to permit persons to whom the
|
*/
|
||||||
// Software is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
// DEALINGS IN THE SOFTWARE.
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
#include "ohci.h"
|
#include "ohci.h"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user