Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbmid/usbmid.c

    r87a3df7f rfeeac0d  
    3030 * @{
    3131 */
     32
     33/* XXX Fix this */
     34#define _DDF_DATA_IMPLANT
    3235
    3336/**
     
    99102    const usb_standard_interface_descriptor_t *interface_descriptor)
    100103{
     104        ddf_fun_t *child = NULL;
    101105        char *child_name = NULL;
    102106        int rc;
     
    110114            usb_str_class(interface_descriptor->interface_class),
    111115            interface_descriptor->interface_number);
    112         if (rc < 0)
     116        if (rc < 0) {
    113117                return ENOMEM;
     118        }
    114119
    115         rc = ddf_fun_set_name(iface->fun, child_name);
     120        /* Create the device. */
     121        child = ddf_fun_create(parent->ddf_dev, fun_inner, child_name);
    116122        free(child_name);
    117         if (rc != EOK)
     123        if (child == NULL) {
    118124                return ENOMEM;
     125        }
    119126
    120127        match_id_list_t match_ids;
     
    123130        rc = usb_device_create_match_ids_from_interface(device_descriptor,
    124131            interface_descriptor, &match_ids);
    125         if (rc != EOK)
     132        if (rc != EOK) {
     133                ddf_fun_destroy(child);
    126134                return rc;
     135        }
    127136
    128137        list_foreach(match_ids.ids, link, match_id_t, match_id) {
    129                 rc = ddf_fun_add_match_id(iface->fun, match_id->id, match_id->score);
     138                rc = ddf_fun_add_match_id(child, match_id->id, match_id->score);
    130139                if (rc != EOK) {
    131140                        clean_match_ids(&match_ids);
     141                        ddf_fun_destroy(child);
    132142                        return rc;
    133143                }
     
    135145        clean_match_ids(&match_ids);
    136146
    137         ddf_fun_set_ops(iface->fun, &child_device_ops);
     147        rc = ddf_fun_bind(child);
     148        if (rc != EOK) {
     149                /* This takes care of match_id deallocation as well. */
     150                ddf_fun_destroy(child);
     151                return rc;
     152        }
    138153
    139         rc = ddf_fun_bind(iface->fun);
    140         if (rc != EOK)
    141                 return rc;
     154        iface->fun = child;
     155        ddf_fun_data_implant(child, iface);
     156        ddf_fun_set_ops(child, &child_device_ops);
    142157
    143158        return EOK;
Note: See TracChangeset for help on using the changeset viewer.