Added a keep_port_ownership driver setting for EHCI, to allow keeping devices on EHCI instead of giving them up to the 1.0 controller.

Hopefully this will get things working here until OHCI is implemented.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21231 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol 2007-05-24 21:45:11 +00:00
parent 9a36f03a87
commit 3d5bdb8688
2 changed files with 11 additions and 2 deletions

View File

@ -10,6 +10,7 @@
#include <PCI.h> #include <PCI.h>
#include <USB3.h> #include <USB3.h>
#include <KernelExport.h> #include <KernelExport.h>
#include <driver_settings.h>
#include "ehci.h" #include "ehci.h"
@ -110,6 +111,7 @@ EHCI::EHCI(pci_info *info, Stack *stack)
fFreeListHead(NULL), fFreeListHead(NULL),
fRootHub(NULL), fRootHub(NULL),
fRootHubAddress(0), fRootHubAddress(0),
fKeepPortOwnership(false),
fPortCount(0), fPortCount(0),
fPortResetChange(0), fPortResetChange(0),
fPortSuspendChange(0) fPortSuspendChange(0)
@ -122,6 +124,12 @@ EHCI::EHCI(pci_info *info, Stack *stack)
TRACE(("usb_ehci: constructing new EHCI Host Controller Driver\n")); TRACE(("usb_ehci: constructing new EHCI Host Controller Driver\n"));
fInitOK = false; fInitOK = false;
void *handle = load_driver_settings("ehci");
if (handle) {
fKeepPortOwnership = get_driver_boolean_parameter(handle, "keep_port_ownership", false, true);
unload_driver_settings(handle);
}
// enable busmaster and memory mapped access // enable busmaster and memory mapped access
uint16 command = sPCIModule->read_pci_config(fPCIInfo->bus, uint16 command = sPCIModule->read_pci_config(fPCIInfo->bus,
fPCIInfo->device, fPCIInfo->function, PCI_command, 2); fPCIInfo->device, fPCIInfo->function, PCI_command, 2);
@ -677,7 +685,7 @@ EHCI::ResetPort(uint8 index)
uint32 portRegister = EHCI_PORTSC + index * sizeof(uint32); uint32 portRegister = EHCI_PORTSC + index * sizeof(uint32);
uint32 portStatus = ReadOpReg(portRegister) & EHCI_PORTSC_DATAMASK; uint32 portStatus = ReadOpReg(portRegister) & EHCI_PORTSC_DATAMASK;
if (portStatus & EHCI_PORTSC_DMINUS) { if (!fKeepPortOwnership && (portStatus & EHCI_PORTSC_DMINUS)) {
TRACE(("usb_ehci: lowspeed device connected, giving up port ownership\n")); TRACE(("usb_ehci: lowspeed device connected, giving up port ownership\n"));
// there is a lowspeed device connected. // there is a lowspeed device connected.
// we give the ownership to a companion controller. // we give the ownership to a companion controller.
@ -701,7 +709,7 @@ EHCI::ResetPort(uint8 index)
return B_ERROR; return B_ERROR;
} }
if ((portStatus & EHCI_PORTSC_ENABLE) == 0) { if (!fKeepPortOwnership && (portStatus & EHCI_PORTSC_ENABLE) == 0) {
TRACE(("usb_ehci: fullspeed device connected, giving up port ownership\n")); TRACE(("usb_ehci: fullspeed device connected, giving up port ownership\n"));
// the port was not enabled, this means that no high speed device is // the port was not enabled, this means that no high speed device is
// attached to this port. we give up ownership to a companion controler // attached to this port. we give up ownership to a companion controler

View File

@ -156,6 +156,7 @@ static pci_module_info *sPCIModule;
uint8 fRootHubAddress; uint8 fRootHubAddress;
// Port management // Port management
bool fKeepPortOwnership;
uint8 fPortCount; uint8 fPortCount;
uint16 fPortResetChange; uint16 fPortResetChange;
uint16 fPortSuspendChange; uint16 fPortSuspendChange;