Changeset 9600516 in mainline for uspace/drv/uhci/uhci.c


Ignore:
Timestamp:
2011-01-21T16:49:47Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
643b983
Parents:
1062c8d
Message:

Added transfer queues for interrupt, control and bulk transfers.

UHCI structures refactoring

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci/uhci.c

    r1062c8d r9600516  
    33#include <usb/usb.h>
    44
     5#include "translating_malloc.h"
     6
    57#include "debug.h"
    68#include "name.h"
    79#include "uhci.h"
     10
     11static int init_tranfer_lists(transfer_list_t list[]);
    812
    913int uhci_init(device_t *device, void *regs)
     
    2630        if (ret < 0) {
    2731                free( instance );
    28                 printf(NAME": Failed to gain access to registers at %p\n", io);
     32                uhci_print_error("Failed to gain access to registers at %p\n", io);
    2933                return ret;
    3034        }
     
    3236
    3337        /* init root hub */
    34         ret = uhci_root_hub_init( &instance->root_hub, device,
    35           (char*)regs + UHCI_ROOT_HUB_PORT_REGISTERS_OFFSET );
     38        ret = uhci_root_hub_init(&instance->root_hub, device,
     39          (char*)regs + UHCI_ROOT_HUB_PORT_REGISTERS_OFFSET);
    3640        if (ret < 0) {
    37                 free( instance );
    38                 printf(NAME": Failed to initialize root hub driver.\n");
     41                free(instance);
     42                uhci_print_error("Failed to initialize root hub driver.\n");
     43                return ret;
     44        }
     45
     46        instance->frame_list = trans_malloc(sizeof(frame_list_t));
     47        if (instance->frame_list == NULL) {
     48                uhci_print_error("Failed to allocate frame list pointer.\n");
     49                uhci_root_hub_fini(&instance->root_hub);
     50                free(instance);
     51                return ENOMEM;
     52        }
     53
     54        const uintptr_t pa = (uintptr_t)addr_to_phys(instance->frame_list);
     55
     56        pio_write_32(&instance->registers->flbaseadd, (uint32_t)pa);
     57
     58        ret = init_tranfer_lists(instance->transfers);
     59        if (ret != EOK) {
     60                uhci_print_error("Transfer list initialization failed.\n");
     61                uhci_root_hub_fini(&instance->root_hub);
     62                free(instance);
    3963                return ret;
    4064        }
    4165
    4266        device->driver_data = instance;
     67        return EOK;
     68}
     69/*----------------------------------------------------------------------------*/
     70int init_tranfer_lists(transfer_list_t transfers[])
     71{
     72        //TODO:refactor
     73        int ret;
     74        ret = transfer_list_init(&transfers[USB_TRANSFER_BULK], NULL);
     75        if (ret != EOK) {
     76                uhci_print_error("Failed to inititalize bulk queue.\n");
     77                return ret;
     78        }
     79
     80        ret = transfer_list_init(
     81          &transfers[USB_TRANSFER_CONTROL], &transfers[USB_TRANSFER_BULK]);
     82        if (ret != EOK) {
     83                uhci_print_error("Failed to inititalize control queue.\n");
     84                transfer_list_fini(&transfers[USB_TRANSFER_BULK]);
     85                return ret;
     86        }
     87
     88        ret = transfer_list_init(
     89          &transfers[USB_TRANSFER_INTERRUPT], &transfers[USB_TRANSFER_CONTROL]);
     90        if (ret != EOK) {
     91                uhci_print_error("Failed to interrupt control queue.\n");
     92                transfer_list_fini(&transfers[USB_TRANSFER_CONTROL]);
     93                transfer_list_fini(&transfers[USB_TRANSFER_BULK]);
     94                return ret;
     95        }
     96
    4397        return EOK;
    4498}
Note: See TracChangeset for help on using the changeset viewer.