Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-hcd/root_hub.c

    r4abc304 r687efaa  
    3434#include <assert.h>
    3535#include <errno.h>
    36 #include <str_error.h>
    3736#include <stdio.h>
    38 #include <ops/hw_res.h>
    39 
    4037#include <usb_iface.h>
    4138#include <usb/debug.h>
    4239
    4340#include "root_hub.h"
    44 #include "uhci.h"
    4541
     42extern device_ops_t child_ops;
    4643/*----------------------------------------------------------------------------*/
    47 static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun,
    48     devman_handle_t *handle)
     44int setup_root_hub(device_t **device, device_t *hc)
    4945{
    50         ddf_fun_t *hc_fun = root_hub_fun->driver_data;
    51         assert(hc_fun != NULL);
    52 
    53         *handle = hc_fun->handle;
    54 
    55         return EOK;
    56 }
    57 /*----------------------------------------------------------------------------*/
    58 static int usb_iface_get_address_rh_impl(ddf_fun_t *fun, devman_handle_t handle,
    59     usb_address_t *address)
    60 {
    61         assert(fun);
    62         ddf_fun_t *hc_fun = fun->driver_data;
    63         assert(hc_fun);
    64         uhci_t *hc = fun_to_uhci(hc_fun);
    65         assert(hc);
    66 
    67         usb_address_t addr = device_keeper_find(&hc->device_manager,
    68             handle);
    69         if (addr < 0) {
    70                 return addr;
    71         }
    72 
    73         if (address != NULL) {
    74                 *address = addr;
    75         }
    76 
    77         return EOK;
    78 }
    79 /*----------------------------------------------------------------------------*/
    80 usb_iface_t usb_iface_root_hub_fun_impl = {
    81         .get_hc_handle = usb_iface_get_hc_handle_rh_impl,
    82         .get_address = usb_iface_get_address_rh_impl
    83 };
    84 /*----------------------------------------------------------------------------*/
    85 static hw_resource_list_t *get_resource_list(ddf_fun_t *dev)
    86 {
    87         assert(dev);
    88         ddf_fun_t *hc_ddf_instance = dev->driver_data;
    89         assert(hc_ddf_instance);
    90         uhci_t *hc = hc_ddf_instance->driver_data;
    91         assert(hc);
    92 
    93         //TODO: fix memory leak
    94         hw_resource_list_t *resource_list = malloc(sizeof(hw_resource_list_t));
    95         assert(resource_list);
    96         resource_list->count = 1;
    97         resource_list->resources = malloc(sizeof(hw_resource_t));
    98         assert(resource_list->resources);
    99         resource_list->resources[0].type = IO_RANGE;
    100         resource_list->resources[0].res.io_range.address =
    101             ((uintptr_t)hc->registers) + 0x10; // see UHCI design guide
    102         resource_list->resources[0].res.io_range.size = 4;
    103         resource_list->resources[0].res.io_range.endianness = LITTLE_ENDIAN;
    104 
    105         return resource_list;
    106 }
    107 /*----------------------------------------------------------------------------*/
    108 static hw_res_ops_t hw_res_iface = {
    109         .get_resource_list = get_resource_list,
    110         .enable_interrupt = NULL
    111 };
    112 /*----------------------------------------------------------------------------*/
    113 static ddf_dev_ops_t root_hub_ops = {
    114         .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl,
    115         .interfaces[HW_RES_DEV_IFACE] = &hw_res_iface
    116 };
    117 /*----------------------------------------------------------------------------*/
    118 int setup_root_hub(ddf_fun_t **fun, ddf_dev_t *hc)
    119 {
    120         assert(fun);
    121         assert(hc);
    122         int ret;
    123 
    124         ddf_fun_t *hub = ddf_fun_create(hc, fun_inner, "root-hub");
     46        assert(device);
     47        device_t *hub = create_device();
    12548        if (!hub) {
    12649                usb_log_error("Failed to create root hub device structure.\n");
     50                return ENOMEM;
     51        }
     52        char *name;
     53        int ret = asprintf(&name, "UHCI Root Hub");
     54        if (ret < 0) {
     55                usb_log_error("Failed to create root hub name.\n");
     56                free(hub);
    12757                return ENOMEM;
    12858        }
     
    13262        if (ret < 0) {
    13363                usb_log_error("Failed to create root hub match string.\n");
    134                 ddf_fun_destroy(hub);
     64                free(hub);
     65                free(name);
    13566                return ENOMEM;
    13667        }
    13768
    138         ret = ddf_fun_add_match_id(hub, match_str, 100);
    139         if (ret != EOK) {
    140                 usb_log_error("Failed(%d) to add root hub match id: %s\n",
    141                     ret, str_error(ret));
    142                 ddf_fun_destroy(hub);
    143                 return ret;
     69        match_id_t *match_id = create_match_id();
     70        if (!match_id) {
     71                usb_log_error("Failed to create root hub match id.\n");
     72                free(hub);
     73                free(match_str);
     74                return ENOMEM;
    14475        }
     76        match_id->id = match_str;
     77        match_id->score = 90;
    14578
    146         hub->ops = &root_hub_ops;
     79        add_match_id(&hub->match_ids, match_id);
     80        hub->name = name;
     81        hub->parent = hc;
     82        hub->ops = &child_ops;
    14783
    148         *fun = hub;
     84        *device = hub;
    14985        return EOK;
    15086}
Note: See TracChangeset for help on using the changeset viewer.