Ignore:
File:
1 edited

Legend:

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

    r687efaa r4abc304  
    3434#include <assert.h>
    3535#include <errno.h>
     36#include <str_error.h>
    3637#include <stdio.h>
     38#include <ops/hw_res.h>
     39
    3740#include <usb_iface.h>
    3841#include <usb/debug.h>
    3942
    4043#include "root_hub.h"
     44#include "uhci.h"
    4145
    42 extern device_ops_t child_ops;
    4346/*----------------------------------------------------------------------------*/
    44 int setup_root_hub(device_t **device, device_t *hc)
     47static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun,
     48    devman_handle_t *handle)
    4549{
    46         assert(device);
    47         device_t *hub = create_device();
     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/*----------------------------------------------------------------------------*/
     58static 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/*----------------------------------------------------------------------------*/
     80usb_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/*----------------------------------------------------------------------------*/
     85static 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/*----------------------------------------------------------------------------*/
     108static hw_res_ops_t hw_res_iface = {
     109        .get_resource_list = get_resource_list,
     110        .enable_interrupt = NULL
     111};
     112/*----------------------------------------------------------------------------*/
     113static 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/*----------------------------------------------------------------------------*/
     118int 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");
    48125        if (!hub) {
    49126                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);
    57127                return ENOMEM;
    58128        }
     
    62132        if (ret < 0) {
    63133                usb_log_error("Failed to create root hub match string.\n");
    64                 free(hub);
    65                 free(name);
     134                ddf_fun_destroy(hub);
    66135                return ENOMEM;
    67136        }
    68137
    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;
     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;
    75144        }
    76         match_id->id = match_str;
    77         match_id->score = 90;
    78145
    79         add_match_id(&hub->match_ids, match_id);
    80         hub->name = name;
    81         hub->parent = hc;
    82         hub->ops = &child_ops;
     146        hub->ops = &root_hub_ops;
    83147
    84         *device = hub;
     148        *fun = hub;
    85149        return EOK;
    86150}
Note: See TracChangeset for help on using the changeset viewer.