Ignore:
File:
1 edited

Legend:

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

    r87a3df7f r58563585  
    3434 * Exploration of available interfaces in the USB device.
    3535 */
    36 #include <ddf/driver.h>
     36
    3737#include <errno.h>
    3838#include <str_error.h>
     
    4141#include <usb/dev/request.h>
    4242#include <usb/dev/dp.h>
    43 #include <usb/ddfiface.h>
    4443#include "usbmid.h"
    45 
    46 /** Operations of the device itself. */
    47 static ddf_dev_ops_t mid_device_ops = {
    48         .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
    49 };
    5044
    5145/** Tell whether given interface is already in the list.
     
    5751static bool interface_in_list(const list_t *list, int interface_no)
    5852{
    59         list_foreach(*list, link, usbmid_interface_t, iface) {
     53        list_foreach(*list, link, const usbmid_interface_t, iface) {
    6054                if (iface->interface_no == interface_no) {
    6155                        return true;
     
    7165 * @param config_descriptor_size Size of configuration descriptor in bytes.
    7266 * @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)
     67 */
     68static int create_interfaces(const uint8_t *config_descriptor,
     69    size_t config_descriptor_size, list_t *list, usb_device_t *usb_dev)
    7770{
     71        assert(config_descriptor);
     72        assert(usb_dev);
     73
    7874        const usb_dp_parser_data_t data = {
    7975                .data = config_descriptor,
     
    9187        /* Walk all descriptors nested in the current configuration decriptor;
    9288         * i.e. all interface descriptors. */
    93         for (;interface_ptr != NULL;
     89        for (; interface_ptr != NULL;
    9490            interface_ptr = usb_dp_get_sibling_descriptor(
    9591                &parser, &data, config_descriptor, interface_ptr))
     
    10399
    104100                /* Skip alternate interfaces. */
    105                 if (interface_in_list(&mid->interface_list,
    106                     interface->interface_number)) {
     101                if (interface_in_list(list, interface->interface_number)) {
    107102                        /* TODO: add the alternatives and create match ids
    108103                         * for them. */
     
    110105                }
    111106
    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;
    121 
    122                 link_initialize(&iface->link);
    123                 iface->fun = fun;
    124                 iface->interface_no = interface->interface_number;
    125                 iface->interface = interface;
    126 
    127                 list_append(&iface->link, &mid->interface_list);
    128         }
    129 
     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) {
     116                        //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        }
    130125        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;
    141126}
    142127
     
    149134 * @return Whether to accept this device from devman.
    150135 */
    151 bool usbmid_explore_device(usb_device_t *dev)
     136int usbmid_explore_device(usb_device_t *dev)
    152137{
    153         int rc;
    154 
    155         unsigned dev_class = dev->descriptors.device.device_class;
     138        assert(dev);
     139        const unsigned dev_class =
     140            usb_device_descriptors(dev)->device.device_class;
    156141        if (dev_class != USB_CLASS_USE_INTERFACE) {
    157142                usb_log_warning(
     
    159144                    dev_class, usb_str_class(dev_class),
    160145                    USB_CLASS_USE_INTERFACE);
    161                 usb_log_error("Not multi interface device, refusing.\n");
    162                 return false;
    163         }
    164 
    165         /* Shortcuts to save on typing ;-). */
    166         const void *config_descriptor_raw = dev->descriptors.configuration;
    167         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;
    168155        const usb_standard_configuration_descriptor_t *config_descriptor =
    169156            config_descriptor_raw;
    170157
    171158        /* Select the first configuration */
    172         rc = usb_request_set_configuration(&dev->ctrl_pipe,
     159        int rc = usb_request_set_configuration(usb_device_get_default_pipe(dev),
    173160            config_descriptor->configuration_number);
    174161        if (rc != EOK) {
    175162                usb_log_error("Failed to set device configuration: %s.\n",
    176163                    str_error(rc));
    177                 return false;
    178         }
    179 
     164                return rc;
     165        }
     166       
    180167        /* Create driver soft-state. */
    181168        usb_mid_t *usb_mid = usb_device_data_alloc(dev, sizeof(usb_mid_t));
    182169        if (!usb_mid) {
    183170                usb_log_error("Failed to create USB MID structure.\n");
    184                 return false;
    185         }
    186 
    187         usb_mid->dev = dev->ddf_dev;
     171                return ENOMEM;
     172        }
    188173
    189174        /* Create control function. */
    190         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");
    191176        if (usb_mid->ctl_fun == NULL) {
    192177                usb_log_error("Failed to create control function.\n");
    193                 return false;
    194         }
    195         ddf_fun_set_ops(usb_mid->ctl_fun, &mid_device_ops);
     178                return ENOMEM;
     179        }
    196180
    197181        /* Bind control function. */
     
    201185                    str_error(rc));
    202186                ddf_fun_destroy(usb_mid->ctl_fun);
    203                 return false;
     187                return rc;
    204188        }
    205189
    206190        /* Create interface children. */
    207191        list_initialize(&usb_mid->interface_list);
    208         create_interfaces(usb_mid, config_descriptor_raw, config_descriptor_size);
    209 
    210         /* Start child function for every interface. */
    211         list_foreach(usb_mid->interface_list, link, usbmid_interface_t, iface) {
    212                 usb_log_info("Creating child for interface %d (%s).\n",
    213                     iface->interface_no,
    214                     usb_str_class(iface->interface->interface_class));
    215 
    216                 rc = usbmid_spawn_interface_child(dev, iface,
    217                     &dev->descriptors.device, iface->interface);
    218                 if (rc != EOK) {
    219                         usb_log_error("Failed to create interface child: %s.\n",
    220                             str_error(rc));
    221                 }
    222         }
    223 
    224         return true;
     192        create_interfaces(config_descriptor_raw, config_descriptor_size,
     193            &usb_mid->interface_list, dev);
     194
     195        return EOK;
    225196}
    226197
Note: See TracChangeset for help on using the changeset viewer.