Ignore:
File:
1 edited

Legend:

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

    ra92ce4ef r5203e256  
    4545
    4646/** Callback for DDF USB interface. */
     47static int usb_iface_get_address_impl(ddf_fun_t *fun, devman_handle_t handle,
     48    usb_address_t *address)
     49{
     50        return usb_iface_get_address_hub_impl(fun, handle, address);
     51}
     52
     53/** Callback for DDF USB interface. */
    4754static int usb_iface_get_interface_impl(ddf_fun_t *fun, devman_handle_t handle,
    4855    int *iface_no)
     
    6370static usb_iface_t child_usb_iface = {
    6471        .get_hc_handle = usb_iface_get_hc_handle_hub_child_impl,
    65         .get_address = usb_iface_get_address_hub_impl,
     72        .get_address = usb_iface_get_address_impl,
    6673        .get_interface = usb_iface_get_interface_impl
    6774};
     
    7279};
    7380
    74 int usbmid_interface_destroy(usbmid_interface_t *mid_iface)
    75 {
    76         assert(mid_iface);
    77         assert_link_not_used(&mid_iface->link);
    78         const int ret = ddf_fun_unbind(mid_iface->fun);
    79         if (ret != EOK) {
    80                 return ret;
    81         }
    82         /* NOTE: usbmid->interface points somewhere, but we did not
    83          * allocate that space, so don't touch */
    84         ddf_fun_destroy(mid_iface->fun);
    85         /* NOTE: mid_iface is invalid at this point, it was assigned to
    86          * mid_iface->fun->driver_data and freed in ddf_fun_destroy */
    87         return EOK;
    88 }
    8981
    9082/** Spawn new child device from one interface.
     
    114106            (int) interface_descriptor->interface_number);
    115107        if (rc < 0) {
    116                 return ENOMEM;
     108                goto error_leave;
    117109        }
    118110
    119111        /* Create the device. */
    120112        child = ddf_fun_create(parent->ddf_dev, fun_inner, child_name);
    121         free(child_name);
    122113        if (child == NULL) {
    123                 return ENOMEM;
     114                rc = ENOMEM;
     115                goto error_leave;
    124116        }
    125117
     
    130122
    131123        rc = usb_device_create_match_ids_from_interface(device_descriptor,
    132             interface_descriptor, &child->match_ids);
     124            interface_descriptor,
     125            &child->match_ids);
    133126        if (rc != EOK) {
    134                 ddf_fun_destroy(child);
    135                 return rc;
     127                goto error_leave;
    136128        }
    137129
    138130        rc = ddf_fun_bind(child);
    139131        if (rc != EOK) {
    140                 /* This takes care of match_id deallocation as well. */
    141                 ddf_fun_destroy(child);
    142                 return rc;
     132                goto error_leave;
    143133        }
    144134
    145135        return EOK;
     136
     137error_leave:
     138        if (child != NULL) {
     139                child->name = NULL;
     140                /* This takes care of match_id deallocation as well. */
     141                ddf_fun_destroy(child);
     142        }
     143        if (child_name != NULL) {
     144                free(child_name);
     145        }
     146
     147        return rc;
    146148}
    147149
Note: See TracChangeset for help on using the changeset viewer.