Ignore:
File:
1 edited

Legend:

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

    r58563585 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"
     50#include "hub.h"
     51#include "conn.h"
    4552
    4653static ddf_dev_ops_t vhc_ops = {
     54        .interfaces[USBHC_DEV_IFACE] = &vhc_iface,
     55        .interfaces[USB_DEV_IFACE] = &vhc_usb_iface,
    4756        .close = on_client_close,
    4857        .default_handler = default_connection_handler
    4958};
    5059
    51 static int vhc_control_node(ddf_dev_t *dev, ddf_fun_t **fun)
    52 {
    53         assert(dev);
    54         assert(fun);
    55 
    56         *fun = ddf_fun_create(dev, fun_exposed, "virtual");
    57         if (!*fun)
    58                 return ENOMEM;
    59 
    60         vhc_data_t *vhc = ddf_fun_data_alloc(*fun, sizeof(vhc_data_t));
    61         if (!vhc) {
    62                 ddf_fun_destroy(*fun);
    63         }
    64         ddf_fun_set_ops(*fun, &vhc_ops);
    65         const int ret = ddf_fun_bind(*fun);
    66         if (ret != EOK) {
    67                 ddf_fun_destroy(*fun);
    68                 *fun = NULL;
    69                 return ret;
    70         }
    71         vhc_init(vhc);
    72         return EOK;
    73 }
    74 
    75 hcd_ops_t vhc_hc_ops = {
    76         .schedule = vhc_schedule,
    77 };
    78 
    7960static int vhc_dev_add(ddf_dev_t *dev)
    8061{
    81         /* Initialize virtual structure */
    82         ddf_fun_t *ctl_fun = NULL;
    83         int ret = vhc_control_node(dev, &ctl_fun);
    84         if (ret != EOK) {
    85                 usb_log_error("Failed to setup control node.\n");
    86                 return ret;
    87         }
    88         vhc_data_t *data = ddf_fun_data_get(ctl_fun);
     62        static int vhc_count = 0;
     63        int rc;
    8964
    90         /* Initialize generic structures */
    91         ret = hcd_ddf_setup_hc(dev, USB_SPEED_FULL,
    92             BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
    93         if (ret != EOK) {
    94                 usb_log_error("Failed to init HCD structures: %s.\n",
    95                    str_error(ret));
    96                 ddf_fun_destroy(ctl_fun);
    97                 return ret;
     65        if (vhc_count > 0) {
     66                return ELIMIT;
    9867        }
    9968
    100         hcd_set_implementation(dev_to_hcd(dev), data, &vhc_hc_ops);
     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);
    10183
    102         /* Add virtual hub device */
    103         ret = vhc_virtdev_plug_hub(data, &data->hub, NULL, 0);
    104         if (ret != EOK) {
    105                 usb_log_error("Failed to plug root hub: %s.\n", str_error(ret));
    106                 ddf_fun_destroy(ctl_fun);
    107                 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;
    10889        }
    10990
    110         /*
    111          * Creating root hub registers a new USB device so HC
    112          * needs to be ready at this time.
    113          */
    114         ret = hcd_ddf_setup_root_hub(dev);
    115         if (ret != EOK) {
    116                 usb_log_error("Failed to init VHC root hub: %s\n",
    117                         str_error(ret));
    118                 // 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;
    119103        }
    120104
    121         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;
    122126}
    123127
     
    131135};
    132136
     137
    133138int main(int argc, char * argv[])
    134 {
     139{       
    135140        log_init(NAME);
     141
    136142        printf(NAME ": virtual USB host controller driver.\n");
    137143
     
    139145}
    140146
     147
    141148/**
    142149 * @}
Note: See TracChangeset for help on using the changeset viewer.