Ignore:
File:
1 edited

Legend:

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

    rfcafa04 r8f74140c  
    4040#include <usb/request.h>
    4141#include <usb/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/** Find starting indexes of all interface descriptors in a configuration.
     
    111105 * @return Whether to accept this device from devman.
    112106 */
    113 bool usbmid_explore_device(usb_device_t *dev)
     107bool usbmid_explore_device(usbmid_device_t *dev)
    114108{
    115         int rc;
    116 
    117         int dev_class = dev->descriptors.device.device_class;
    118         if (dev_class != USB_CLASS_USE_INTERFACE) {
     109        usb_standard_device_descriptor_t device_descriptor;
     110        int rc = usb_request_get_device_descriptor(&dev->ctrl_pipe,
     111            &device_descriptor);
     112        if (rc != EOK) {
     113                usb_log_error("Getting device descriptor failed: %s.\n",
     114                    str_error(rc));
     115                return false;
     116        }
     117
     118        if (device_descriptor.device_class != USB_CLASS_USE_INTERFACE) {
    119119                usb_log_warning(
    120120                    "Device class: %d (%s), but expected class 0.\n",
    121                     dev_class, usb_str_class(dev_class));
     121                    device_descriptor.device_class,
     122                    usb_str_class(device_descriptor.device_class));
    122123                usb_log_error("Not multi interface device, refusing.\n");
    123124                return false;
    124125        }
    125126
    126         /* Short cuts to save on typing ;-). */
    127         uint8_t *config_descriptor_raw = dev->descriptors.configuration;
    128         size_t config_descriptor_size = dev->descriptors.configuration_size;
    129         usb_standard_configuration_descriptor_t *config_descriptor =
    130             (usb_standard_configuration_descriptor_t *) config_descriptor_raw;
     127        size_t config_descriptor_size;
     128        uint8_t *config_descriptor_raw = NULL;
     129        rc = usb_request_get_full_configuration_descriptor_alloc(
     130            &dev->ctrl_pipe, 0,
     131            (void **) &config_descriptor_raw, &config_descriptor_size);
     132        if (rc != EOK) {
     133                usb_log_error("Failed getting full config descriptor: %s.\n",
     134                    str_error(rc));
     135                return false;
     136        }
     137
     138        usb_standard_configuration_descriptor_t *config_descriptor
     139            = (usb_standard_configuration_descriptor_t *) config_descriptor_raw;
    131140
    132141        size_t *interface_descriptors
     
    145154        if (interface_descriptors_count == (size_t) -1) {
    146155                usb_log_error("Problem parsing configuration descriptor.\n");
     156                free(config_descriptor_raw);
    147157                free(interface_descriptors);
    148158                return false;
     
    155165                usb_log_error("Failed to set device configuration: %s.\n",
    156166                    str_error(rc));
     167                free(config_descriptor_raw);
    157168                free(interface_descriptors);
    158169                return false;
     
    161172
    162173        /* Create control function */
    163         ddf_fun_t *ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl");
     174        ddf_fun_t *ctl_fun = ddf_fun_create(dev->dev, fun_exposed, "ctl");
    164175        if (ctl_fun == NULL) {
    165176                usb_log_error("Failed to create control function.\n");
    166                 free(interface_descriptors);
    167                 return false;
    168         }
    169 
    170         ctl_fun->ops = &mid_device_ops;
    171 
     177                free(config_descriptor_raw);
     178                free(interface_descriptors);
     179                return false;
     180        }
    172181        rc = ddf_fun_bind(ctl_fun);
    173182        if (rc != EOK) {
    174183                usb_log_error("Failed to bind control function: %s.\n",
    175184                    str_error(rc));
     185                free(config_descriptor_raw);
    176186                free(interface_descriptors);
    177187                return false;
     
    189199                    (int) interface->interface_number,
    190200                    usb_str_class(interface->interface_class));
    191                 rc = usbmid_spawn_interface_child(dev, &dev->descriptors.device,
     201                rc = usbmid_spawn_interface_child(dev, &device_descriptor,
    192202                    interface);
    193203                if (rc != EOK) {
     
    197207        }
    198208
     209        free(config_descriptor_raw);
     210
    199211        return true;
    200212}
Note: See TracChangeset for help on using the changeset viewer.