Ignore:
File:
1 edited

Legend:

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

    r56fd7cf r4ca778b  
    4040#include <usb/dev/request.h>
    4141#include <usb/dev/dp.h>
    42 #include <usb/ddfiface.h>
    4342#include "usbmid.h"
    44 
    45 /** Operations of the device itself. */
    46 static ddf_dev_ops_t mid_device_ops = {
    47         .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
    48 };
    4943
    5044/** Tell whether given interface is already in the list.
     
    5751{
    5852        list_foreach(*list, l) {
    59                 usbmid_interface_t *iface = usbmid_interface_from_link(l);
     53                const usbmid_interface_t *iface = usbmid_interface_from_link(l);
    6054                if (iface->interface_no == interface_no) {
    6155                        return true;
     
    7266 * @param list List where to add the interfaces.
    7367 */
    74 static void create_interfaces(const uint8_t *config_descriptor,
    75     size_t config_descriptor_size, list_t *list)
     68static int create_interfaces(const uint8_t *config_descriptor,
     69    size_t config_descriptor_size, list_t *list, usb_device_t *usb_dev)
    7670{
     71        assert(config_descriptor);
     72        assert(usb_dev);
     73
    7774        const usb_dp_parser_data_t data = {
    7875                .data = config_descriptor,
     
    9087        /* Walk all descriptors nested in the current configuration decriptor;
    9188         * i.e. all interface descriptors. */
    92         for (;interface_ptr != NULL;
     89        for (; interface_ptr != NULL;
    9390            interface_ptr = usb_dp_get_sibling_descriptor(
    9491                &parser, &data, config_descriptor, interface_ptr))
     
    107104                        continue;
    108105                }
    109                 usbmid_interface_t *iface = malloc(sizeof(usbmid_interface_t));
    110                 if (iface == NULL) {
     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) {
    111116                        //TODO: Do something about that failure.
    112                         break;
     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);
    113123                }
    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         }
     124        }
     125        return EOK;
    122126}
    123127
     
    130134 * @return Whether to accept this device from devman.
    131135 */
    132 bool usbmid_explore_device(usb_device_t *dev)
     136int usbmid_explore_device(usb_device_t *dev)
    133137{
    134         int rc;
    135 
    136         unsigned dev_class = dev->descriptors.device.device_class;
     138        assert(dev);
     139        const unsigned dev_class =
     140            usb_device_descriptors(dev)->device.device_class;
    137141        if (dev_class != USB_CLASS_USE_INTERFACE) {
    138142                usb_log_warning(
     
    140144                    dev_class, usb_str_class(dev_class),
    141145                    USB_CLASS_USE_INTERFACE);
    142                 usb_log_error("Not multi interface device, refusing.\n");
    143                 return false;
    144         }
    145 
    146         /* Shortcuts to save on typing ;-). */
    147         const void *config_descriptor_raw = dev->descriptors.configuration;
    148         size_t config_descriptor_size = dev->descriptors.configuration_size;
     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;
    149155        const usb_standard_configuration_descriptor_t *config_descriptor =
    150156            config_descriptor_raw;
    151157
    152158        /* Select the first configuration */
    153         rc = usb_request_set_configuration(&dev->ctrl_pipe,
     159        int rc = usb_request_set_configuration(usb_device_get_default_pipe(dev),
    154160            config_descriptor->configuration_number);
    155161        if (rc != EOK) {
    156162                usb_log_error("Failed to set device configuration: %s.\n",
    157163                    str_error(rc));
    158                 return false;
    159         }
    160 
     164                return rc;
     165        }
     166       
    161167        /* Create driver soft-state. */
    162168        usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
    163169        if (!usb_mid) {
    164170                usb_log_error("Failed to create USB MID structure.\n");
    165                 return false;
     171                return ENOMEM;
    166172        }
    167173
    168174        /* Create control function. */
    169         usb_mid->ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
     175        usb_mid->ctl_fun = usb_device_ddf_fun_create(dev, fun_exposed, "ctl");
    170176        if (usb_mid->ctl_fun == NULL) {
    171177                usb_log_error("Failed to create control function.\n");
    172                 return false;
    173         }
    174         ddf_fun_set_ops(usb_mid->ctl_fun, &mid_device_ops);
     178                return ENOMEM;
     179        }
    175180
    176181        /* Bind control function. */
     
    180185                    str_error(rc));
    181186                ddf_fun_destroy(usb_mid->ctl_fun);
    182                 return false;
    183         }
    184 
     187                return rc;
     188        }
    185189
    186190        /* Create interface children. */
    187191        list_initialize(&usb_mid->interface_list);
    188192        create_interfaces(config_descriptor_raw, config_descriptor_size,
    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);
    194 
    195                 usb_log_info("Creating child for interface %d (%s).\n",
    196                     iface->interface_no,
    197                     usb_str_class(iface->interface->interface_class));
    198 
    199                 rc = usbmid_spawn_interface_child(dev, iface,
    200                     &dev->descriptors.device, iface->interface);
    201                 if (rc != EOK) {
    202                         usb_log_error("Failed to create interface child: %s.\n",
    203                             str_error(rc));
    204                 }
    205         }
    206 
    207         return true;
     193            &usb_mid->interface_list, dev);
     194
     195        return EOK;
    208196}
    209197
Note: See TracChangeset for help on using the changeset viewer.