Ignore:
File:
1 edited

Legend:

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

    r920d0fc r7191992  
    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"
     45
    5246
    5347static ddf_dev_ops_t vhc_ops = {
    54         .interfaces[USBHC_DEV_IFACE] = &vhc_iface,
    55         .interfaces[USB_DEV_IFACE] = &vhc_usb_iface,
    5648        .close = on_client_close,
    5749        .default_handler = default_connection_handler
    5850};
    5951
     52static 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
    6076static int vhc_dev_add(ddf_dev_t *dev)
    6177{
    62         static int vhc_count = 0;
    63         int rc;
     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);
    6486
    65         if (vhc_count > 0) {
    66                 return ELIMIT;
     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;
    6795        }
    6896
    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);
     97        hcd_set_implementation(dev_to_hcd(dev), data, vhc_schedule, NULL, NULL, NULL);
    8398
    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;
     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;
    89105        }
    90106
    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;
     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...
    103116        }
    104117
    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;
     118        return ret;
    126119}
    127120
     
    135128};
    136129
    137 
    138130int main(int argc, char * argv[])
    139 {       
     131{
    140132        log_init(NAME);
    141 
    142133        printf(NAME ": virtual USB host controller driver.\n");
    143134
     
    145136}
    146137
    147 
    148138/**
    149139 * @}
Note: See TracChangeset for help on using the changeset viewer.