Changeset ffcc5776 in mainline for uspace/drv/bus/usb/ohci/root_hub.c


Ignore:
Timestamp:
2012-02-23T06:00:07Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bfc5c9dd
Parents:
70922c2
Message:

ohci: Consider endian difference when accessing OHCI registers.

HC initialization works.
Root hub works.

Turn off work queues until memory structure endian is fixed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/ohci/root_hub.c

    r70922c2 rffcc5776  
    3333 */
    3434#include <assert.h>
     35#include <byteorder.h>
    3536#include <errno.h>
    3637#include <str_error.h>
    3738#include <fibril_synch.h>
    3839
     40#include <usb/usb.h>
    3941#include <usb/debug.h>
    4042#include <usb/dev/request.h>
    4143#include <usb/classes/hub.h>
    4244
    43 #include "root_hub.h"
    4445#include <usb/classes/classes.h>
    4546#include <usb/classes/hub.h>
    4647#include <usb/dev/driver.h>
    4748#include "ohci_regs.h"
     49#include "root_hub.h"
    4850
    4951/**
     
    122124{
    123125        assert(request);
     126        usb_log_debug("Sending interrupt vector(%zu) %hhx:%hhx.\n",
     127            size, ((uint8_t*)&mask)[0], ((uint8_t*)&mask)[1]);
    124128        usb_transfer_batch_finish_error(request, &mask, size, EOK);
    125129        usb_transfer_batch_destroy(request);
     
    150154
    151155        instance->registers = regs;
    152         instance->port_count =
    153             (instance->registers->rh_desc_a >> RHDA_NDS_SHIFT) & RHDA_NDS_MASK;
     156        instance->port_count = RHDA_NDS(instance->registers->rh_desc_a);
     157        usb_log_debug("rh_desc_a: %x.\n", instance->registers->rh_desc_a);
    154158        if (instance->port_count > 15) {
    155159                usb_log_warning("OHCI specification does not allow more than 15"
     
    184188
    185189        /* Control all ports by global switch and turn them off */
    186         instance->registers->rh_desc_b &= (RHDB_PCC_MASK << RHDB_PCC_SHIFT);
     190        instance->registers->rh_desc_b &= ~RHDB_PCC_WRITE(~0);
    187191        instance->registers->rh_status = RHS_CLEAR_GLOBAL_POWER;
    188192
    189193        /* Return control to per port state */
    190         instance->registers->rh_desc_b |=
    191                 ((1 << (instance->port_count + 1)) - 1) << RHDB_PCC_SHIFT;
     194        instance->registers->rh_desc_b |= RHDB_PCC_WRITE(~0);
    192195
    193196        /* Set per port over-current */
     
    226229                fibril_mutex_lock(&instance->guard);
    227230                assert(instance->unfinished_interrupt_transfer == NULL);
    228                 uint16_t mask = create_interrupt_mask(instance);
     231                const uint16_t mask = create_interrupt_mask(instance);
    229232                if (mask == 0) {
    230                         usb_log_debug("No changes...\n");
     233                        usb_log_debug("No changes(%hx)...\n", mask);
    231234                        instance->unfinished_interrupt_transfer = request;
    232235                } else {
     
    257260        if (instance->unfinished_interrupt_transfer) {
    258261                usb_log_debug("Finalizing interrupt transfer\n");
    259                 uint16_t mask = create_interrupt_mask(instance);
     262                const uint16_t mask = create_interrupt_mask(instance);
    260263                interrupt_request(instance->unfinished_interrupt_transfer,
    261264                    mask, instance->interrupt_mask_size);
     
    282285        instance->hub_descriptor_size = size;
    283286
    284         uint32_t hub_desc = instance->registers->rh_desc_a;
    285         uint32_t port_desc = instance->registers->rh_desc_b;
     287        const uint32_t hub_desc = instance->registers->rh_desc_a;
     288        const uint32_t port_desc = instance->registers->rh_desc_b;
    286289
    287290        /* bDescLength */
     
    305308        instance->descriptors.hub[4] = 0;
    306309        /* bPwrOn2PwrGood */
    307         instance->descriptors.hub[5] =
    308             (hub_desc >> RHDA_POTPGT_SHIFT) & RHDA_POTPGT_MASK;
     310        instance->descriptors.hub[5] = RHDA_POTPGT(hub_desc);
    309311        /* bHubContrCurrent, root hubs don't need no power. */
    310312        instance->descriptors.hub[6] = 0;
    311313
    312314        /* Device Removable and some legacy 1.0 stuff*/
    313         instance->descriptors.hub[7] =
    314             (port_desc >> RHDB_DR_SHIFT) & RHDB_DR_MASK & 0xff;
     315        instance->descriptors.hub[7] = RHDB_DR_READ(port_desc) & 0xff;
    315316        instance->descriptors.hub[8] = 0xff;
    316317        if (instance->interrupt_mask_size == 2) {
    317                 instance->descriptors.hub[8] =
    318                     (port_desc >> RHDB_DR_SHIFT) & RHDB_DR_MASK >> 8;
     318                instance->descriptors.hub[8] = RHDB_DR_READ(port_desc) >> 8;
    319319                instance->descriptors.hub[9]  = 0xff;
    320320                instance->descriptors.hub[10] = 0xff;
     
    375375                }
    376376        }
    377         /* USB is little endian */
    378         return host2uint32_t_le(mask);
     377        usb_log_debug2("OHCI root hub interrupt mask: %hx.\n", mask);
     378        return uint16_host2usb(mask);
    379379}
    380380/*----------------------------------------------------------------------------*/
     
    434434                        TRANSFER_END(request, EOVERFLOW);
    435435                } else {
    436                         uint16_t data =
     436                        const uint16_t data =
    437437                            uint16_host2usb(USB_DEVICE_STATUS_SELF_POWERED);
    438438                        TRANSFER_END_DATA(request, &data, sizeof(data));
     
    482482        usb_device_request_setup_packet_t *setup_request =
    483483            (usb_device_request_setup_packet_t *) request->setup_buffer;
    484         uint16_t setup_request_value = setup_request->value_high;
     484        const int setup_request_value = uint16_usb2host(setup_request->value);
    485485        switch (setup_request_value)
    486486        {
     
    568568        case USB_HUB_FEATURE_PORT_SUSPEND: //2
    569569        case USB_HUB_FEATURE_PORT_RESET:   //4
    570                 /* Nice thing is that these shifts correspond to the position
    571                  * of control bits in register */
    572                 instance->registers->rh_port_status[port - 1] = (1 << feature);
     570                usb_log_debug2(
     571                    "Setting port ENABLE, SUSPEND or RESET on port %zu.\n",
     572                    port);
     573                instance->registers->rh_port_status[port - 1] =
     574                    RHPS_FEATURE_BIT(feature);
    573575                return EOK;
    574576        default:
     
    624626        case USB_HUB_FEATURE_C_PORT_OVER_CURRENT: //19
    625627        case USB_HUB_FEATURE_C_PORT_RESET:        //20
    626                 /* Nice thing is that these shifts correspond to the position
    627                  * of control bits in register */
    628                 instance->registers->rh_port_status[port - 1] = (1 << feature);
     628                usb_log_debug2("Clearing port C_CONNECTION, C_ENABLE, "
     629                    "C_SUSPEND or C_RESET on port %zu.\n",
     630                    port);
     631                instance->registers->rh_port_status[port - 1] =
     632                    RHPS_FEATURE_BIT(feature);
    629633                return EOK;
    630634
     
    795799        case USB_DEVREQ_SET_CONFIGURATION:
    796800                usb_log_debug("USB_DEVREQ_SET_CONFIGURATION: %u\n",
    797                     setup_request->value);
     801                    uint16_usb2host(setup_request->value));
    798802                /* We have only one configuration, it's number is 1 */
    799803                if (uint16_usb2host(setup_request->value) != 1)
Note: See TracChangeset for help on using the changeset viewer.