Ignore:
File:
1 edited

Legend:

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

    r5203e256 r9f583151  
    5757{
    5858        list_foreach(*list, l) {
    59                 usbmid_interface_t *iface
    60                     = list_get_instance(l, usbmid_interface_t, link);
     59                usbmid_interface_t *iface = usbmid_interface_from_link(l);
    6160                if (iface->interface_no == interface_no) {
    6261                        return true;
     
    7372 * @param list List where to add the interfaces.
    7473 */
    75 static void create_interfaces(uint8_t *config_descriptor,
     74static void create_interfaces(const uint8_t *config_descriptor,
    7675    size_t config_descriptor_size, list_t *list)
    7776{
    78         usb_dp_parser_data_t data = {
     77        const usb_dp_parser_data_t data = {
    7978                .data = config_descriptor,
    8079                .size = config_descriptor_size,
     
    8281        };
    8382
    84         usb_dp_parser_t parser = {
     83        static const usb_dp_parser_t parser = {
    8584                .nesting = usb_dp_standard_descriptor_nesting
    8685        };
    8786
    88         uint8_t *interface_ptr = usb_dp_get_nested_descriptor(&parser, &data,
    89             data.data);
    90         if (interface_ptr == NULL) {
    91                 return;
    92         }
    93 
    94         do {
    95                 if (interface_ptr[1] != USB_DESCTYPE_INTERFACE) {
    96                         goto next_descriptor;
    97                 }
    98 
    99                 usb_standard_interface_descriptor_t *interface
     87        const uint8_t *interface_ptr =
     88            usb_dp_get_nested_descriptor(&parser, &data, config_descriptor);
     89
     90        /* Walk all descriptors nested in the current configuration decriptor;
     91         * i.e. all interface descriptors. */
     92        for (;interface_ptr != NULL;
     93            interface_ptr = usb_dp_get_sibling_descriptor(
     94                &parser, &data, config_descriptor, interface_ptr))
     95        {
     96                /* The second byte is DESCTYPE byte in all desriptors. */
     97                if (interface_ptr[1] != USB_DESCTYPE_INTERFACE)
     98                        continue;
     99
     100                const usb_standard_interface_descriptor_t *interface
    100101                    = (usb_standard_interface_descriptor_t *) interface_ptr;
    101102
    102103                /* Skip alternate interfaces. */
    103                 if (!interface_in_list(list, interface->interface_number)) {
    104                         usbmid_interface_t *iface
    105                             = malloc(sizeof(usbmid_interface_t));
    106                         if (iface == NULL) {
    107                                 break;
    108                         }
    109                         link_initialize(&iface->link);
    110                         iface->fun = NULL;
    111                         iface->interface_no = interface->interface_number;
    112                         iface->interface = interface;
    113 
    114                         list_append(&iface->link, list);
    115                 }
    116 
    117                 /* TODO: add the alternatives and create match ids from them
    118                  * as well.
    119                  */
    120 
    121 next_descriptor:
    122                 interface_ptr = usb_dp_get_sibling_descriptor(&parser, &data,
    123                     data.data, interface_ptr);
    124 
    125         } while (interface_ptr != NULL);
    126 
     104                if (interface_in_list(list, interface->interface_number)) {
     105                        /* TODO: add the alternatives and create match ids
     106                         * for them. */
     107                        continue;
     108                }
     109                usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));
     110                if (iface == NULL) {
     111                        //TODO: Do something about that failure.
     112                        break;
     113                }
     114
     115                link_initialize(&iface->link);
     116                iface->fun = NULL;
     117                iface->interface_no = interface->interface_number;
     118                iface->interface = interface;
     119
     120                list_append(&iface->link, list);
     121        }
    127122}
    128123
     
    139134        int rc;
    140135
    141         int dev_class = dev->descriptors.device.device_class;
     136        unsigned dev_class = dev->descriptors.device.device_class;
    142137        if (dev_class != USB_CLASS_USE_INTERFACE) {
    143138                usb_log_warning(
    144                     "Device class: %d (%s), but expected class 0.\n",
    145                     dev_class, usb_str_class(dev_class));
     139                    "Device class: %u (%s), but expected class %u.\n",
     140                    dev_class, usb_str_class(dev_class),
     141                    USB_CLASS_USE_INTERFACE);
    146142                usb_log_error("Not multi interface device, refusing.\n");
    147143                return false;
    148144        }
    149145
    150         /* Short cuts to save on typing ;-). */
    151         uint8_t *config_descriptor_raw = dev->descriptors.configuration;
     146        /* Shortcuts to save on typing ;-). */
     147        const void *config_descriptor_raw = dev->descriptors.configuration;
    152148        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;
     149        const usb_standard_configuration_descriptor_t *config_descriptor =
     150            config_descriptor_raw;
    155151
    156152        /* Select the first configuration */
     
    163159        }
    164160
    165         /* Create control function */
    166         ddf_fun_t *ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
    167         if (ctl_fun == NULL) {
     161        /* Create driver soft-state. */
     162        usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
     163        if (!usb_mid) {
     164                usb_log_error("Failed to create USB MID structure.\n");
     165                return false;
     166        }
     167
     168        /* Create control function. */
     169        usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
     170        if (usb_mid->ctl_fun == NULL) {
    168171                usb_log_error("Failed to create control function.\n");
    169172                return false;
    170173        }
    171 
    172         ctl_fun->ops = &mid_device_ops;
    173 
    174         rc = ddf_fun_bind(ctl_fun);
     174        usb_mid->ctl_fun->ops = &mid_device_ops;
     175
     176        /* Bind control function. */
     177        rc = ddf_fun_bind(usb_mid->ctl_fun);
    175178        if (rc != EOK) {
    176179                usb_log_error("Failed to bind control function: %s.\n",
    177180                    str_error(rc));
    178                 return false;
    179         }
     181                ddf_fun_destroy(usb_mid->ctl_fun);
     182                return false;
     183        }
     184
    180185
    181186        /* Create interface children. */
    182         list_t interface_list;
    183         list_initialize(&interface_list);
     187        list_initialize(&usb_mid->interface_list);
    184188        create_interfaces(config_descriptor_raw, config_descriptor_size,
    185             &interface_list);
    186 
    187         list_foreach(interface_list, link) {
    188                 usbmid_interface_t *iface = list_get_instance(link,
    189                     usbmid_interface_t, link);
     189            &usb_mid->interface_list);
     190
     191        /* Start child function for every interface. */
     192        list_foreach(usb_mid->interface_list, link) {
     193                usbmid_interface_t *iface = usbmid_interface_from_link(link);
    190194
    191195                usb_log_info("Creating child for interface %d (%s).\n",
    192                     (int) iface->interface_no,
     196                    iface->interface_no,
    193197                    usb_str_class(iface->interface->interface_class));
    194198
Note: See TracChangeset for help on using the changeset viewer.