Ignore:
File:
1 edited

Legend:

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

    r920d0fc r58563585  
    3434 */
    3535
    36 #include <loc.h>
    37 #include <async.h>
    38 #include <unistd.h>
    39 #include <stdlib.h>
    40 #include <sysinfo.h>
    4136#include <stdio.h>
    4237#include <errno.h>
     
    4439#include <ddf/driver.h>
    4540
    46 #include <usb/usb.h>
    47 #include <usb/ddfiface.h>
    48 #include <usb_iface.h>
     41#include <usb/host/ddf_helpers.h>
     42
     43#include <usb/debug.h>
    4944#include "vhcd.h"
    50 #include "hub.h"
    51 #include "conn.h"
    5245
    5346static ddf_dev_ops_t vhc_ops = {
    54         .interfaces[USBHC_DEV_IFACE] = &vhc_iface,
    55         .interfaces[USB_DEV_IFACE] = &vhc_usb_iface,
    5647        .close = on_client_close,
    5748        .default_handler = default_connection_handler
    5849};
    5950
     51static 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
     75hcd_ops_t vhc_hc_ops = {
     76        .schedule = vhc_schedule,
     77};
     78
    6079static int vhc_dev_add(ddf_dev_t *dev)
    6180{
    62         static int vhc_count = 0;
    63         int rc;
     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);
    6489
    65         if (vhc_count > 0) {
    66                 return ELIMIT;
     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;
    6798        }
    6899
    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);
     100        hcd_set_implementation(dev_to_hcd(dev), data, &vhc_hc_ops);
    83101
    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;
     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;
    89108        }
    90109
    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;
     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...
    103119        }
    104120
    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;
     121        return ret;
    126122}
    127123
     
    135131};
    136132
    137 
    138133int main(int argc, char * argv[])
    139 {       
     134{
    140135        log_init(NAME);
    141 
    142136        printf(NAME ": virtual USB host controller driver.\n");
    143137
     
    145139}
    146140
    147 
    148141/**
    149142 * @}
Note: See TracChangeset for help on using the changeset viewer.