Ignore:
File:
1 edited

Legend:

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

    r87a3df7f r56fd7cf  
    3434 * Exploration of available interfaces in the USB device.
    3535 */
    36 #include <ddf/driver.h>
    3736#include <errno.h>
    3837#include <str_error.h>
     
    5756static bool interface_in_list(const list_t *list, int interface_no)
    5857{
    59         list_foreach(*list, link, usbmid_interface_t, iface) {
     58        list_foreach(*list, l) {
     59                usbmid_interface_t *iface = usbmid_interface_from_link(l);
    6060                if (iface->interface_no == interface_no) {
    6161                        return true;
     
    7171 * @param config_descriptor_size Size of configuration descriptor in bytes.
    7272 * @param list List where to add the interfaces.
    73  * @return EOK on success, ENOMEM if out of memory.
    74  */
    75 static int create_interfaces(usb_mid_t *mid, const uint8_t *config_descriptor,
    76     size_t config_descriptor_size)
     73 */
     74static void create_interfaces(const uint8_t *config_descriptor,
     75    size_t config_descriptor_size, list_t *list)
    7776{
    7877        const usb_dp_parser_data_t data = {
     
    103102
    104103                /* Skip alternate interfaces. */
    105                 if (interface_in_list(&mid->interface_list,
    106                     interface->interface_number)) {
     104                if (interface_in_list(list, interface->interface_number)) {
    107105                        /* TODO: add the alternatives and create match ids
    108106                         * for them. */
    109107                        continue;
    110108                }
    111 
    112                 /* Create the function */
    113                 ddf_fun_t *fun = ddf_fun_create(mid->dev, fun_inner, NULL);
    114                 if (fun == NULL)
    115                         goto error;
    116 
    117                 usbmid_interface_t *iface = ddf_fun_data_alloc(fun,
    118                     sizeof(usbmid_interface_t));
    119                 if (iface == NULL)
    120                         goto error;
     109                usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));
     110                if (iface == NULL) {
     111                        //TODO: Do something about that failure.
     112                        break;
     113                }
    121114
    122115                link_initialize(&iface->link);
    123                 iface->fun = fun;
     116                iface->fun = NULL;
    124117                iface->interface_no = interface->interface_number;
    125118                iface->interface = interface;
    126119
    127                 list_append(&iface->link, &mid->interface_list);
    128         }
    129 
    130         return EOK;
    131 error:
    132         while (!list_empty(&mid->interface_list)) {
    133                 link_t *link = list_first(&mid->interface_list);
    134                 usbmid_interface_t *iface = list_get_instance(link,
    135                     usbmid_interface_t, link);
    136 
    137                 ddf_fun_destroy(iface->fun);
    138         }
    139 
    140         return ENOMEM;
     120                list_append(&iface->link, list);
     121        }
    141122}
    142123
     
    185166        }
    186167
    187         usb_mid->dev = dev->ddf_dev;
    188 
    189168        /* Create control function. */
    190169        usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
     
    204183        }
    205184
     185
    206186        /* Create interface children. */
    207187        list_initialize(&usb_mid->interface_list);
    208         create_interfaces(usb_mid, config_descriptor_raw, config_descriptor_size);
     188        create_interfaces(config_descriptor_raw, config_descriptor_size,
     189            &usb_mid->interface_list);
    209190
    210191        /* Start child function for every interface. */
    211         list_foreach(usb_mid->interface_list, link, usbmid_interface_t, iface) {
     192        list_foreach(usb_mid->interface_list, link) {
     193                usbmid_interface_t *iface = usbmid_interface_from_link(link);
     194
    212195                usb_log_info("Creating child for interface %d (%s).\n",
    213196                    iface->interface_no,
Note: See TracChangeset for help on using the changeset viewer.