Ignore:
File:
1 edited

Legend:

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

    r4ca778b rfeeac0d  
    4040#include <usb/dev/request.h>
    4141#include <usb/dev/dp.h>
     42#include <usb/ddfiface.h>
    4243#include "usbmid.h"
     44
     45/** Operations of the device itself. */
     46static ddf_dev_ops_t mid_device_ops = {
     47        .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
     48};
    4349
    4450/** Tell whether given interface is already in the list.
     
    5056static bool interface_in_list(const list_t *list, int interface_no)
    5157{
    52         list_foreach(*list, l) {
    53                 const usbmid_interface_t *iface = usbmid_interface_from_link(l);
     58        list_foreach(*list, link, usbmid_interface_t, iface) {
    5459                if (iface->interface_no == interface_no) {
    5560                        return true;
     
    6671 * @param list List where to add the interfaces.
    6772 */
    68 static int create_interfaces(const uint8_t *config_descriptor,
    69     size_t config_descriptor_size, list_t *list, usb_device_t *usb_dev)
     73static void create_interfaces(const uint8_t *config_descriptor,
     74    size_t config_descriptor_size, list_t *list)
    7075{
    71         assert(config_descriptor);
    72         assert(usb_dev);
    73 
    7476        const usb_dp_parser_data_t data = {
    7577                .data = config_descriptor,
     
    8789        /* Walk all descriptors nested in the current configuration decriptor;
    8890         * i.e. all interface descriptors. */
    89         for (; interface_ptr != NULL;
     91        for (;interface_ptr != NULL;
    9092            interface_ptr = usb_dp_get_sibling_descriptor(
    9193                &parser, &data, config_descriptor, interface_ptr))
     
    104106                        continue;
    105107                }
    106 
    107 
    108                 usb_log_info("Creating child for interface %d (%s).\n",
    109                     interface->interface_number,
    110                     usb_str_class(interface->interface_class));
    111 
    112                 usbmid_interface_t *iface = NULL;
    113                 const int rc = usbmid_spawn_interface_child(usb_dev, &iface,
    114                         &usb_device_descriptors(usb_dev)->device, interface);
    115                 if (rc != EOK) {
     108                usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));
     109                if (iface == NULL) {
    116110                        //TODO: Do something about that failure.
    117                         usb_log_error("Failed to create interface child for "
    118                             "%d (%s): %s.\n", interface->interface_number,
    119                             usb_str_class(interface->interface_class),
    120                             str_error(rc));
    121                 } else {
    122                         list_append(&iface->link, list);
    123                 }
    124         }
    125         return EOK;
     111                        break;
     112                }
     113
     114                link_initialize(&iface->link);
     115                iface->fun = NULL;
     116                iface->interface_no = interface->interface_number;
     117                iface->interface = interface;
     118
     119                list_append(&iface->link, list);
     120        }
    126121}
    127122
     
    134129 * @return Whether to accept this device from devman.
    135130 */
    136 int usbmid_explore_device(usb_device_t *dev)
     131bool usbmid_explore_device(usb_device_t *dev)
    137132{
    138         assert(dev);
    139         const unsigned dev_class =
    140             usb_device_descriptors(dev)->device.device_class;
     133        int rc;
     134
     135        unsigned dev_class = dev->descriptors.device.device_class;
    141136        if (dev_class != USB_CLASS_USE_INTERFACE) {
    142137                usb_log_warning(
     
    144139                    dev_class, usb_str_class(dev_class),
    145140                    USB_CLASS_USE_INTERFACE);
    146                 usb_log_error("Not a multi-interface device, refusing.\n");
    147                 return ENOTSUP;
    148         }
    149 
    150         /* Get coonfiguration descriptor. */
    151         const size_t config_descriptor_size =
    152             usb_device_descriptors(dev)->full_config_size;
    153         const void *config_descriptor_raw =
    154             usb_device_descriptors(dev)->full_config;
     141                usb_log_error("Not multi interface device, refusing.\n");
     142                return false;
     143        }
     144
     145        /* Shortcuts to save on typing ;-). */
     146        const void *config_descriptor_raw = dev->descriptors.configuration;
     147        size_t config_descriptor_size = dev->descriptors.configuration_size;
    155148        const usb_standard_configuration_descriptor_t *config_descriptor =
    156149            config_descriptor_raw;
    157150
    158151        /* Select the first configuration */
    159         int rc = usb_request_set_configuration(usb_device_get_default_pipe(dev),
     152        rc = usb_request_set_configuration(&dev->ctrl_pipe,
    160153            config_descriptor->configuration_number);
    161154        if (rc != EOK) {
    162155                usb_log_error("Failed to set device configuration: %s.\n",
    163156                    str_error(rc));
    164                 return rc;
    165         }
    166        
     157                return false;
     158        }
     159
    167160        /* Create driver soft-state. */
    168161        usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
    169162        if (!usb_mid) {
    170163                usb_log_error("Failed to create USB MID structure.\n");
    171                 return ENOMEM;
     164                return false;
    172165        }
    173166
    174167        /* Create control function. */
    175         usb_mid->ctl_fun = usb_device_ddf_fun_create(dev, fun_exposed, "ctl");
     168        usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
    176169        if (usb_mid->ctl_fun == NULL) {
    177170                usb_log_error("Failed to create control function.\n");
    178                 return ENOMEM;
    179         }
     171                return false;
     172        }
     173        ddf_fun_set_ops(usb_mid->ctl_fun, &mid_device_ops);
    180174
    181175        /* Bind control function. */
     
    185179                    str_error(rc));
    186180                ddf_fun_destroy(usb_mid->ctl_fun);
    187                 return rc;
    188         }
     181                return false;
     182        }
     183
    189184
    190185        /* Create interface children. */
    191186        list_initialize(&usb_mid->interface_list);
    192187        create_interfaces(config_descriptor_raw, config_descriptor_size,
    193             &usb_mid->interface_list, dev);
    194 
    195         return EOK;
     188            &usb_mid->interface_list);
     189
     190        /* Start child function for every interface. */
     191        list_foreach(usb_mid->interface_list, link, usbmid_interface_t, iface) {
     192                usb_log_info("Creating child for interface %d (%s).\n",
     193                    iface->interface_no,
     194                    usb_str_class(iface->interface->interface_class));
     195
     196                rc = usbmid_spawn_interface_child(dev, iface,
     197                    &dev->descriptors.device, iface->interface);
     198                if (rc != EOK) {
     199                        usb_log_error("Failed to create interface child: %s.\n",
     200                            str_error(rc));
     201                }
     202        }
     203
     204        return true;
    196205}
    197206
Note: See TracChangeset for help on using the changeset viewer.