Changeset e3f7418 in mainline for uspace/drv/bus/usb/usbmid/explore.c


Ignore:
Timestamp:
2011-10-15T13:06:28Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a044f71
Parents:
3958e315 (diff), 065064e6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

USB improvements.

USB unplug part2; Unplug support in all drivers (except for unused usbmouse driver).
Make descriptor paring work on const pointers.
Fixes several crashes and memory leaks.

File:
1 edited

Legend:

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

    r3958e315 re3f7418  
    7373 * @param list List where to add the interfaces.
    7474 */
    75 static void create_interfaces(uint8_t *config_descriptor,
     75static void create_interfaces(const uint8_t *config_descriptor,
    7676    size_t config_descriptor_size, list_t *list)
    7777{
    78         usb_dp_parser_data_t data = {
     78        const usb_dp_parser_data_t data = {
    7979                .data = config_descriptor,
    8080                .size = config_descriptor_size,
     
    8686        };
    8787
    88         uint8_t *interface_ptr = usb_dp_get_nested_descriptor(&parser, &data,
    89             data.data);
     88        const uint8_t *interface_ptr =
     89            usb_dp_get_nested_descriptor(&parser, &data, data.data);
    9090        if (interface_ptr == NULL) {
    9191                return;
     
    149149
    150150        /* Short cuts to save on typing ;-). */
    151         uint8_t *config_descriptor_raw = dev->descriptors.configuration;
     151        const void *config_descriptor_raw = dev->descriptors.configuration;
    152152        size_t config_descriptor_size = dev->descriptors.configuration_size;
    153         usb_standard_configuration_descriptor_t *config_descriptor =
    154             (usb_standard_configuration_descriptor_t *) config_descriptor_raw;
     153        const usb_standard_configuration_descriptor_t *config_descriptor =
     154            config_descriptor_raw;
    155155
    156156        /* Select the first configuration */
     
    163163        }
    164164
     165        usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
     166        if (!usb_mid) {
     167                usb_log_error("Failed to create USB MID structure.\n");
     168                return false;
     169        }
     170
    165171        /* Create control function */
    166         ddf_fun_t *ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
    167         if (ctl_fun == NULL) {
     172        usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
     173        if (usb_mid->ctl_fun == NULL) {
    168174                usb_log_error("Failed to create control function.\n");
    169175                return false;
    170176        }
    171177
    172         ctl_fun->ops = &mid_device_ops;
    173 
    174         rc = ddf_fun_bind(ctl_fun);
     178        usb_mid->ctl_fun->ops = &mid_device_ops;
     179
     180        rc = ddf_fun_bind(usb_mid->ctl_fun);
    175181        if (rc != EOK) {
    176182                usb_log_error("Failed to bind control function: %s.\n",
    177183                    str_error(rc));
    178                 return false;
    179         }
     184                ddf_fun_destroy(usb_mid->ctl_fun);
     185                return false;
     186        }
     187
    180188
    181189        /* Create interface children. */
    182         list_t interface_list;
    183         list_initialize(&interface_list);
     190        list_initialize(&usb_mid->interface_list);
    184191        create_interfaces(config_descriptor_raw, config_descriptor_size,
    185             &interface_list);
    186 
    187         list_foreach(interface_list, link) {
     192            &usb_mid->interface_list);
     193
     194        list_foreach(usb_mid->interface_list, link) {
    188195                usbmid_interface_t *iface = list_get_instance(link,
    189196                    usbmid_interface_t, link);
Note: See TracChangeset for help on using the changeset viewer.