Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/vhc/main.c

    r7191992 r920d0fc  
    3434 */
    3535
     36#include <loc.h>
     37#include <async.h>
     38#include <unistd.h>
     39#include <stdlib.h>
     40#include <sysinfo.h>
    3641#include <stdio.h>
    3742#include <errno.h>
     
    3944#include <ddf/driver.h>
    4045
    41 #include <usb/host/ddf_helpers.h>
    42 
    43 #include <usb/debug.h>
     46#include <usb/usb.h>
     47#include <usb/ddfiface.h>
     48#include <usb_iface.h>
    4449#include "vhcd.h"
    45 
     50#include "hub.h"
     51#include "conn.h"
    4652
    4753static ddf_dev_ops_t vhc_ops = {
     54        .interfaces[USBHC_DEV_IFACE] = &vhc_iface,
     55        .interfaces[USB_DEV_IFACE] = &vhc_usb_iface,
    4856        .close = on_client_close,
    4957        .default_handler = default_connection_handler
    5058};
    5159
    52 static int vhc_control_node(ddf_dev_t *dev, ddf_fun_t **fun)
    53 {
    54         assert(dev);
    55         assert(fun);
    56 
    57         *fun = ddf_fun_create(dev, fun_exposed, "ctl");
    58         if (!*fun)
    59                 return ENOMEM;
    60 
    61         vhc_data_t *vhc = ddf_fun_data_alloc(*fun, sizeof(vhc_data_t));
    62         if (!vhc) {
    63                 ddf_fun_destroy(*fun);
    64         }
    65         ddf_fun_set_ops(*fun, &vhc_ops);
    66         const int ret = ddf_fun_bind(*fun);
    67         if (ret != EOK) {
    68                 ddf_fun_destroy(*fun);
    69                 *fun = NULL;
    70                 return ret;
    71         }
    72         vhc_init(vhc);
    73         return EOK;
    74 }
    75 
    7660static int vhc_dev_add(ddf_dev_t *dev)
    7761{
    78         /* Initialize virtual structure */
    79         ddf_fun_t *ctl_fun = NULL;
    80         int ret = vhc_control_node(dev, &ctl_fun);
    81         if (ret != EOK) {
    82                 usb_log_error("Failed to setup control node.\n");
    83                 return ret;
    84         }
    85         vhc_data_t *data = ddf_fun_data_get(ctl_fun);
     62        static int vhc_count = 0;
     63        int rc;
    8664
    87         /* Initialize generic structures */
    88         ret = hcd_ddf_setup_hc(dev, USB_SPEED_FULL,
    89             BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
    90         if (ret != EOK) {
    91                 usb_log_error("Failed to init HCD structures: %s.\n",
    92                    str_error(ret));
    93                 ddf_fun_destroy(ctl_fun);
    94                 return ret;
     65        if (vhc_count > 0) {
     66                return ELIMIT;
    9567        }
    9668
    97         hcd_set_implementation(dev_to_hcd(dev), data, vhc_schedule, NULL, NULL, NULL);
     69        vhc_data_t *data = ddf_dev_data_alloc(dev, sizeof(vhc_data_t));
     70        if (data == NULL) {
     71                usb_log_fatal("Failed to allocate memory.\n");
     72                return ENOMEM;
     73        }
     74        data->magic = 0xDEADBEEF;
     75        rc = usb_endpoint_manager_init(&data->ep_manager, (size_t) -1,
     76            bandwidth_count_usb11);
     77        if (rc != EOK) {
     78                usb_log_fatal("Failed to initialize endpoint manager.\n");
     79                free(data);
     80                return rc;
     81        }
     82        usb_device_manager_init(&data->dev_manager, USB_SPEED_MAX);
    9883
    99         /* Add virtual hub device */
    100         ret = vhc_virtdev_plug_hub(data, &data->hub, NULL, 0);
    101         if (ret != EOK) {
    102                 usb_log_error("Failed to plug root hub: %s.\n", str_error(ret));
    103                 ddf_fun_destroy(ctl_fun);
    104                 return ret;
     84        ddf_fun_t *hc = ddf_fun_create(dev, fun_exposed, "hc");
     85        if (hc == NULL) {
     86                usb_log_fatal("Failed to create device function.\n");
     87                free(data);
     88                return ENOMEM;
    10589        }
    10690
    107         /*
    108          * Creating root hub registers a new USB device so HC
    109          * needs to be ready at this time.
    110          */
    111         ret = hcd_ddf_setup_root_hub(dev);
    112         if (ret != EOK) {
    113                 usb_log_error("Failed to init VHC root hub: %s\n",
    114                         str_error(ret));
    115                 // TODO do something here...
     91        ddf_fun_set_ops(hc, &vhc_ops);
     92        list_initialize(&data->devices);
     93        fibril_mutex_initialize(&data->guard);
     94        data->hub = &virtual_hub_device;
     95        data->hc_fun = hc;
     96
     97        rc = ddf_fun_bind(hc);
     98        if (rc != EOK) {
     99                usb_log_fatal("Failed to bind HC function: %s.\n",
     100                    str_error(rc));
     101                free(data);
     102                return rc;
    116103        }
    117104
    118         return ret;
     105        rc = ddf_fun_add_to_category(hc, USB_HC_CATEGORY);
     106        if (rc != EOK) {
     107                usb_log_fatal("Failed to add function to HC class: %s.\n",
     108                    str_error(rc));
     109                free(data);
     110                return rc;
     111        }
     112
     113        virtual_hub_device_init(hc);
     114
     115        usb_log_info("Virtual USB host controller ready (dev %zu, hc %zu).\n",
     116            (size_t) ddf_dev_get_handle(dev), (size_t) ddf_fun_get_handle(hc));
     117
     118        rc = vhc_virtdev_plug_hub(data, data->hub, NULL);
     119        if (rc != EOK) {
     120                usb_log_fatal("Failed to plug root hub: %s.\n", str_error(rc));
     121                free(data);
     122                return rc;
     123        }
     124
     125        return EOK;
    119126}
    120127
     
    128135};
    129136
     137
    130138int main(int argc, char * argv[])
    131 {
     139{       
    132140        log_init(NAME);
     141
    133142        printf(NAME ": virtual USB host controller driver.\n");
    134143
     
    136145}
    137146
     147
    138148/**
    139149 * @}
Note: See TracChangeset for help on using the changeset viewer.