* Getting familiar with the existing code

* Cleanup (whitespace, nameing, code style)
* Move around methods so they match the header order
* Fix some obvious stuff
* Initialize all members
* Sync roothub code (this will be reworked to a common roothub)
* Only minor functional changes (to the worse for now)

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25527 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz 2008-05-17 12:39:46 +00:00
parent 25d0a0841f
commit fd1e6f2b37
4 changed files with 857 additions and 845 deletions

File diff suppressed because it is too large Load Diff

View File

@ -105,13 +105,13 @@ static int32 _InterruptHandler(void *data);
status_t _UnlinkTransfer(transfer_data *transfer);
static int32 _FinishThread(void *data);
void _FinishTransfer();
void _FinishTransfers();
status_t _SubmitControlRequest(Transfer *transfer);
status_t _SubmitControlTransfer(Transfer *transfer);
status_t _SubmitBulkTransfer(Transfer *transfer);
status_t _SubmitPeriodicTransfer(Transfer *transfer);
status_t _AppendChainDescriptorsToEndpoint(
status_t _AppendDescriptorChainToEndpoint(
ohci_endpoint_descriptor *endpoint,
ohci_general_td *first,
ohci_general_td *last);
@ -129,17 +129,22 @@ static int32 _FinishThread(void *data);
// Transfer descriptor related methods
ohci_general_td *_CreateGeneralDescriptor(
size_t bufferSize);
void _FreeGeneralDescriptor(
ohci_general_td *descriptor);
status_t _CreateDescriptorChain(
ohci_general_td **firstDescriptor,
ohci_general_td **lastDescriptor,
uint8 direction,
size_t bufferSize);
void _FreeGeneralDescriptor(
ohci_general_td *descriptor);
void _FreeDescriptorChain(
ohci_general_td *topDescriptor);
size_t _WriteDescriptorChain(
ohci_general_td *topDescriptor,
iovec *vector,
size_t vectorCount);
void _LinkDescriptors(ohci_general_td *first,
ohci_general_td *second);
@ -147,11 +152,6 @@ static int32 _FinishThread(void *data);
void _FreeIsochronousDescriptor(
ohci_isochronous_td *descriptor);
size_t _WriteDescriptorChain(
ohci_general_td *topDescriptor,
iovec *vector,
size_t vectorCount);
// Hash tables related methods
void _AddDescriptorToHash(
ohci_general_td *descriptor);

View File

@ -3,15 +3,15 @@
* Distributed under the terms of the MIT License.
*
* Authors:
* Jan-Rixt Van Hoye
* Salvatore Benedetto <salvatore.benedetto@gmail.com>
* Jan-Rixt Van Hoye
* Salvatore Benedetto <salvatore.benedetto@gmail.com>
*/
#ifndef OHCI_HARD_H
#define OHCI_HARD_H
#ifndef OHCI_HARDWARE_H
#define OHCI_HARDWARE_H
// --------------------------------
// The OHCI registers
// The OHCI registers
// --------------------------------
// --------------------------------
@ -95,7 +95,7 @@
#define OHCI_HCCA 0x18
// --------------------------------
// Period current ED register (section 7.2.2)
// Period current ED register (section 7.2.2)
// --------------------------------
#define OHCI_PERIOD_CURRENT_ED 0x1c
@ -206,19 +206,19 @@
// Root Hub port status (n) register (section 7.4.4)
// --------------------------------
#define OHCI_RH_PORT_STATUS(n) (0x50 + (n) * 4) // 1 based indexing
#define OHCI_RH_PORTSTATUS_CCS 0x00000001 // Current Connection Status
#define OHCI_RH_PORTSTATUS_PES 0x00000002 // Port Enable Status
#define OHCI_RH_PORTSTATUS_PSS 0x00000004 // Port Suspend Status
#define OHCI_RH_PORTSTATUS_POCI 0x00000008 // Port Overcurrent Indicator
#define OHCI_RH_PORTSTATUS_PRS 0x00000010 // Port Reset Status
#define OHCI_RH_PORTSTATUS_PPS 0x00000100 // Port Power Status
#define OHCI_RH_PORTSTATUS_LSDA 0x00000200 // Low Speed Device Attached
#define OHCI_RH_PORTSTATUS_CSC 0x00010000 // Connection Status Change
#define OHCI_RH_PORTSTATUS_PESC 0x00020000 // Port Enable Status Change
#define OHCI_RH_PORTSTATUS_PSSC 0x00040000 // Port Suspend Status change
#define OHCI_RH_PORTSTATUS_OCIC 0x00080000 // Port Overcurrent Change
#define OHCI_RH_PORTSTATUS_PRSC 0x00100000 // Port Reset Status Change
#define OHCI_RH_PORT_STATUS(n) (0x50 + (n) * 4)// 1 based indexing
#define OHCI_RH_PORTSTATUS_CCS 0x00000001 // Current Connection Status
#define OHCI_RH_PORTSTATUS_PES 0x00000002 // Port Enable Status
#define OHCI_RH_PORTSTATUS_PSS 0x00000004 // Port Suspend Status
#define OHCI_RH_PORTSTATUS_POCI 0x00000008 // Port Overcurrent Indicator
#define OHCI_RH_PORTSTATUS_PRS 0x00000010 // Port Reset Status
#define OHCI_RH_PORTSTATUS_PPS 0x00000100 // Port Power Status
#define OHCI_RH_PORTSTATUS_LSDA 0x00000200 // Low Speed Device Attached
#define OHCI_RH_PORTSTATUS_CSC 0x00010000 // Connection Status Change
#define OHCI_RH_PORTSTATUS_PESC 0x00020000 // Port Enable Status Change
#define OHCI_RH_PORTSTATUS_PSSC 0x00040000 // Port Suspend Status change
#define OHCI_RH_PORTSTATUS_OCIC 0x00080000 // Port Overcurrent Change
#define OHCI_RH_PORTSTATUS_PRSC 0x00100000 // Port Reset Status Change
// --------------------------------
// Enable List
@ -244,8 +244,8 @@
// --------------------------------
// All normal interupts
// --------------------------------
// --------------------------------
#define OHCI_NORMAL_INTERRUPTS (OHCI_SCHEDULING_OVERRUN \
| OHCI_WRITEBACK_DONE_HEAD \
| OHCI_RESUME_DETECTED \
@ -271,7 +271,7 @@
#define OHCI_NUMBER_OF_INTERRUPTS 32
typedef struct ohci_hcca
typedef struct ohci_hcca
{
uint32 interrupt_table[OHCI_NUMBER_OF_INTERRUPTS];
uint32 current_frame_number;
@ -338,8 +338,8 @@ typedef struct ohci_general_td
// Hardware part 16 bytes
uint32 flags; // Flags field
uint32 buffer_physical; // Physical buffer pointer
uint32 next_physical_descriptor; // Physical pointer next descriptor
uint32 last_physical_byte_address; // Physical pointer to buffer end
uint32 next_physical_descriptor; // Physical pointer next descriptor
uint32 last_physical_byte_address; // Physical pointer to buffer end
// Software part
addr_t physical_address; // Physical address of this descriptor
void *buffer_logical; // Logical pointer to the buffer
@ -403,7 +403,7 @@ typedef struct ohci_isochronous_td
#define OHCI_ITD_PAGE_SELECT 0x00001000
#define OHCI_ITD_MK_OFFS(len) (0xe000 | ((len) & 0x1fff))
#define OHCI_ITD_GET_BUFFER_LENGTH(x) ((x) & 0xfff)
#define OHCI_ITD_GET_BUFFER_CONDITION_CODE(x) ((x) >> 12)
#define OHCI_ITD_GET_BUFFER_CONDITION_CODE(x) ((x) >> 12)
#define OHCI_ISOCHRONOUS_TD_ALIGN 32
@ -426,11 +426,11 @@ typedef struct ohci_isochronous_td
#define OHCI_NOT_ACCESSED 15
// --------------------------------
// Some delay needed when changing
// Some delay needed when changing
// certain registers.
// --------------------------------
#define OHCI_ENABLE_POWER_DELAY 5000
#define OHCI_READ_DESC_DELAY 5000
#endif // OHCI_HARD_H
#endif // OHCI_HARDWARE_H

View File

@ -3,28 +3,29 @@
* Distributed under the terms of the MIT License.
*
* Authors:
* Jan-Rixt Van Hoye
* Salvatore Benedetto <salvatore.benedetto@gmail.com>
* Jan-Rixt Van Hoye
* Salvatore Benedetto <salvatore.benedetto@gmail.com>
* Michael Lotz <mmlr@mlotz.ch>
*/
#include "ohci.h"
static usb_device_descriptor sOHCIRootHubDevice =
{
0x12, // Descriptor size
USB_DESCRIPTOR_DEVICE, // Type of descriptor
0x110, // USB 1.1
0x09, // Hub type
0, // Subclass
0, // Protocol
64, // Max packet size
0, // Vendor
0, // Product
0x110, // Version
1, // Index of manufacture string
2, // Index of product string
0, // Index of serial number string
1 // Number of configurations
18, // Descriptor length
USB_DESCRIPTOR_DEVICE, // Descriptor type
0x110, // USB 1.1
0x09, // Class (9 = Hub)
0, // Subclass
0, // Protocol
64, // Max packet size on endpoint 0
0, // Vendor ID
0, // Product ID
0x110, // Version
1, // Index of manufacturer string
2, // Index of product string
0, // Index of serial number string
1 // Number of configurations
};
@ -41,48 +42,50 @@ static ohci_root_hub_configuration_s sOHCIRootHubConfig =
{ // configuration descriptor
9, // Descriptor length
USB_DESCRIPTOR_CONFIGURATION, // Descriptor type
34, // Total size of the configuration
1, // Number interfaces
1, // Value of configuration
0, // Number of configuration
0x40, // Self powered
0 // Max power (0, because of self power)
34, // Total length of configuration (including
// interface, endpoint and hub descriptors)
1, // Number of interfaces
1, // Value of this configuration
0, // Index of configuration string
0x40, // Attributes (0x40 = self powered)
0 // Max power (0, since self powered)
},
{ // interface descriptor
9, // Size
USB_DESCRIPTOR_INTERFACE, // Type
9, // Descriptor length
USB_DESCRIPTOR_INTERFACE, // Descriptor type
0, // Interface number
0, // Alternate setting
1, // Num endpoints
0x09, // Interface class
1, // Number of endpoints
0x09, // Interface class (9 = Hub)
0, // Interface subclass
0, // Interface protocol
0 // Interface
0 // Index of interface string
},
{ // endpoint descriptor
7, // Size
USB_DESCRIPTOR_ENDPOINT, // Type
USB_REQTYPE_DEVICE_IN | 1, // Endpoint address (first in IN endpoint)
7, // Descriptor length
USB_DESCRIPTOR_ENDPOINT, // Descriptor type
USB_REQTYPE_DEVICE_IN | 1, // Endpoint address (first in IN endpoint)
0x03, // Attributes (0x03 = interrupt endpoint)
8, // Max packet size
0xFF // Interval 256
0xff // Interval 256
},
{ // hub descriptor
9, // Lenght (including deprecated power
// control mask)
USB_DESCRIPTOR_HUB, // Type
0, // Number of ports
0x0000, // Hub characteristics
0, // Power on to power good
0, // Current
0x00, // Both ports are removable
0xff // Depricated power control mask
{ // hub descriptor
9, // Descriptor length (including
// deprecated power control mask)
USB_DESCRIPTOR_HUB, // Descriptor type
2, // Number of ports
0x0000, // Hub characteristics
0, // Power on to power good (in 2ms units)
0, // Maximum current (in mA)
0x00, // Both ports are removable
0xff // Depricated power control mask
}
};
struct ohci_root_hub_string_s {
uint8 length;
uint8 descriptor_type;
@ -121,11 +124,12 @@ static ohci_root_hub_string_s sOHCIRootHubStrings[3] = {
OHCIRootHub::OHCIRootHub(Object *rootObject, int8 deviceAddress)
: Hub(rootObject, rootObject->GetStack()->IndexOfBusManager(rootObject->GetBusManager()),
sOHCIRootHubDevice, deviceAddress, USB_SPEED_FULLSPEED, true)
: Hub(rootObject, rootObject->GetStack()->IndexOfBusManager(rootObject->GetBusManager()),
sOHCIRootHubDevice, deviceAddress, USB_SPEED_FULLSPEED, true)
{
}
status_t
OHCIRootHub::ProcessTransfer(OHCI *ohci, Transfer *transfer)
{
@ -133,8 +137,7 @@ OHCIRootHub::ProcessTransfer(OHCI *ohci, Transfer *transfer)
return B_ERROR;
usb_request_data *request = transfer->RequestData();
TRACE(("usb_ohci_roothub(): request: %d\n", request->Request));
TRACE(("usb_ohci_roothub: request: %d\n", request->Request));
status_t status = B_TIMED_OUT;
size_t actualLength = 0;
@ -147,7 +150,6 @@ OHCIRootHub::ProcessTransfer(OHCI *ohci, Transfer *transfer)
// the hub reports whether the local power failed (bit 0)
// and if there is a over-current condition (bit 1).
// everything as 0 means all is ok.
// TODO (?) actually check for the value
memset(transfer->Data(), 0, actualLength);
status = B_OK;
break;
@ -159,6 +161,7 @@ OHCIRootHub::ProcessTransfer(OHCI *ohci, Transfer *transfer)
memcpy(transfer->Data(), (void *)&portStatus, actualLength);
status = B_OK;
}
break;
}
@ -168,12 +171,12 @@ OHCIRootHub::ProcessTransfer(OHCI *ohci, Transfer *transfer)
break;
}
TRACE(("usb_ohci_roothub(): set address: %d\n", request->Value));
TRACE(("usb_ohci_roothub: set address: %d\n", request->Value));
status = B_OK;
break;
case USB_REQUEST_GET_DESCRIPTOR:
TRACE(("usb_ohci_roothub(): get descriptor: %d\n", request->Value >> 8));
TRACE(("usb_ohci_roothub: get descriptor: %d\n", request->Value >> 8));
switch (request->Value >> 8) {
case USB_DESCRIPTOR_DEVICE: {
@ -227,11 +230,11 @@ OHCIRootHub::ProcessTransfer(OHCI *ohci, Transfer *transfer)
case USB_REQUEST_CLEAR_FEATURE: {
if (request->Index == 0) {
// we don't support any hub changes
TRACE_ERROR(("usb_ohci_roothub(): clear feature: no hub changes\n"));
TRACE_ERROR(("usb_ohci_roothub: clear feature: no hub changes\n"));
break;
}
TRACE(("usb_ohci_roothub(): clear feature: %d\n", request->Value));
TRACE(("usb_ohci_roothub: clear feature: %d\n", request->Value));
if (ohci->ClearPortFeature(request->Index - 1, request->Value) >= B_OK)
status = B_OK;
break;
@ -240,11 +243,11 @@ OHCIRootHub::ProcessTransfer(OHCI *ohci, Transfer *transfer)
case USB_REQUEST_SET_FEATURE: {
if (request->Index == 0) {
// we don't support any hub changes
TRACE_ERROR(("usb_ohci_roothub(): set feature: no hub changes\n"));
TRACE_ERROR(("usb_ohci_roothub: set feature: no hub changes\n"));
break;
}
TRACE(("usb_ohci_roothub(): set feature: %d\n", request->Value));
TRACE(("usb_ohci_roothub: set feature: %d\n", request->Value));
if (ohci->SetPortFeature(request->Index - 1, request->Value) >= B_OK)
status = B_OK;
break;