Ignore:
File:
1 edited

Legend:

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

    r9d58539 r065064e6  
    5454 * @return Interface @p interface_no is already present in the list.
    5555 */
    56 static bool interface_in_list(const list_t *list, int interface_no)
     56static bool interface_in_list(list_t *list, int interface_no)
    5757{
    5858        list_foreach(*list, l) {
    59                 usbmid_interface_t *iface = usbmid_interface_from_link(l);
     59                usbmid_interface_t *iface
     60                    = list_get_instance(l, usbmid_interface_t, link);
    6061                if (iface->interface_no == interface_no) {
    6162                        return true;
     
    8182        };
    8283
    83         static const usb_dp_parser_t parser = {
     84        usb_dp_parser_t parser = {
    8485                .nesting = usb_dp_standard_descriptor_nesting
    8586        };
    8687
    8788        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
     89            usb_dp_get_nested_descriptor(&parser, &data, 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
    101100                    = (usb_standard_interface_descriptor_t *) interface_ptr;
    102101
    103102                /* Skip alternate interfaces. */
    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         }
     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
     121next_descriptor:
     122                interface_ptr = usb_dp_get_sibling_descriptor(&parser, &data,
     123                    data.data, interface_ptr);
     124
     125        } while (interface_ptr != NULL);
     126
    122127}
    123128
     
    134139        int rc;
    135140
    136         unsigned dev_class = dev->descriptors.device.device_class;
     141        int dev_class = dev->descriptors.device.device_class;
    137142        if (dev_class != USB_CLASS_USE_INTERFACE) {
    138143                usb_log_warning(
    139                     "Device class: %u (%s), but expected class %u.\n",
    140                     dev_class, usb_str_class(dev_class),
    141                     USB_CLASS_USE_INTERFACE);
     144                    "Device class: %d (%s), but expected class 0.\n",
     145                    dev_class, usb_str_class(dev_class));
    142146                usb_log_error("Not multi interface device, refusing.\n");
    143147                return false;
    144148        }
    145149
    146         /* Shortcuts to save on typing ;-). */
     150        /* Short cuts to save on typing ;-). */
    147151        const void *config_descriptor_raw = dev->descriptors.configuration;
    148152        size_t config_descriptor_size = dev->descriptors.configuration_size;
     
    159163        }
    160164
    161         /* Create driver soft-state. */
    162165        usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
    163166        if (!usb_mid) {
     
    166169        }
    167170
    168         /* Create control function. */
     171        /* Create control function */
    169172        usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
    170173        if (usb_mid->ctl_fun == NULL) {
     
    172175                return false;
    173176        }
     177
    174178        usb_mid->ctl_fun->ops = &mid_device_ops;
    175179
    176         /* Bind control function. */
    177180        rc = ddf_fun_bind(usb_mid->ctl_fun);
    178181        if (rc != EOK) {
     
    189192            &usb_mid->interface_list);
    190193
    191         /* Start child function for every interface. */
    192194        list_foreach(usb_mid->interface_list, link) {
    193                 usbmid_interface_t *iface = usbmid_interface_from_link(link);
     195                usbmid_interface_t *iface = list_get_instance(link,
     196                    usbmid_interface_t, link);
    194197
    195198                usb_log_info("Creating child for interface %d (%s).\n",
    196                     iface->interface_no,
     199                    (int) iface->interface_no,
    197200                    usb_str_class(iface->interface->interface_class));
    198201
Note: See TracChangeset for help on using the changeset viewer.