Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbdev/src/devdrv.c

    r065064e6 r70452dd4  
    4141#include <assert.h>
    4242
    43 static int generic_device_add(ddf_dev_t *);
    44 static int generic_device_remove(ddf_dev_t *);
    45 static int generic_device_gone(ddf_dev_t *);
     43static int generic_add_device(ddf_dev_t *);
    4644
    4745static driver_ops_t generic_driver_ops = {
    48         .add_device = generic_device_add,
    49         .dev_remove = generic_device_remove,
    50         .dev_gone = generic_device_gone,
     46        .add_device = generic_add_device
    5147};
    5248static driver_t generic_driver = {
     
    5450};
    5551
    56 static const usb_driver_t *driver = NULL;
     52static usb_driver_t *driver = NULL;
    5753
    5854
     
    115111        int rc = usb_device_create_pipes(dev->ddf_dev, &dev->wire, endpoints,
    116112            dev->descriptors.configuration, dev->descriptors.configuration_size,
    117             dev->interface_no, alternate_setting, &pipes, &pipes_count);
     113            dev->interface_no, alternate_setting,
     114            &pipes, &pipes_count);
    118115
    119116        if (rc != EOK) {
     
    126123        return EOK;
    127124}
    128 /*----------------------------------------------------------------------------*/
    129 /** Callback when a new device is supposed to be controlled by this driver.
    130  *
    131  * This callback is a wrapper for USB specific version of @c device_add.
     125
     126/** Callback when new device is supposed to be controlled by this driver.
     127 *
     128 * This callback is a wrapper for USB specific version of @c add_device.
    132129 *
    133130 * @param gen_dev Device structure as prepared by DDF.
    134131 * @return Error code.
    135132 */
    136 int generic_device_add(ddf_dev_t *gen_dev)
     133int generic_add_device(ddf_dev_t *gen_dev)
    137134{
    138135        assert(driver);
    139136        assert(driver->ops);
    140         assert(driver->ops->device_add);
     137        assert(driver->ops->add_device);
    141138
    142139        int rc;
     
    150147                return rc;
    151148        }
    152         gen_dev->driver_data = dev;
    153 
    154         rc = driver->ops->device_add(dev);
    155         if (rc != EOK)
    156                 usb_device_destroy(dev);
    157         return rc;
    158 }
    159 /*----------------------------------------------------------------------------*/
    160 /** Callback when a device is supposed to be removed from the system.
    161  *
    162  * This callback is a wrapper for USB specific version of @c device_remove.
    163  *
    164  * @param gen_dev Device structure as prepared by DDF.
    165  * @return Error code.
    166  */
    167 int generic_device_remove(ddf_dev_t *gen_dev)
    168 {
    169         assert(driver);
    170         assert(driver->ops);
    171         if (driver->ops->device_rem == NULL)
    172                 return ENOTSUP;
    173         /* Just tell the driver to stop whatever it is doing, keep structures */
    174         return driver->ops->device_rem(gen_dev->driver_data);
    175 }
    176 /*----------------------------------------------------------------------------*/
    177 /** Callback when a device was removed from the system.
    178  *
    179  * This callback is a wrapper for USB specific version of @c device_gone.
    180  *
    181  * @param gen_dev Device structure as prepared by DDF.
    182  * @return Error code.
    183  */
    184 int generic_device_gone(ddf_dev_t *gen_dev)
    185 {
    186         assert(driver);
    187         assert(driver->ops);
    188         if (driver->ops->device_gone == NULL)
    189                 return ENOTSUP;
    190         usb_device_t *usb_dev = gen_dev->driver_data;
    191         const int ret = driver->ops->device_gone(usb_dev);
    192         if (ret == EOK)
    193                 usb_device_destroy(usb_dev);
    194 
    195         return ret;
    196 }
    197 /*----------------------------------------------------------------------------*/
     149
     150        return driver->ops->add_device(dev);
     151}
     152
    198153/** Destroy existing pipes of a USB device.
    199154 *
     
    320275 * @return Error code.
    321276 */
    322 int usb_device_create_pipes(const ddf_dev_t *dev, usb_device_connection_t *wire,
     277int usb_device_create_pipes(ddf_dev_t *dev, usb_device_connection_t *wire,
    323278    usb_endpoint_description_t **endpoints,
    324     const uint8_t *config_descr, size_t config_descr_size,
     279    uint8_t *config_descr, size_t config_descr_size,
    325280    int interface_no, int interface_setting,
    326281    usb_endpoint_mapping_t **pipes_ptr, size_t *pipes_count_ptr)
     
    336291        int rc;
    337292
    338         const size_t pipe_count = count_other_pipes(endpoints);
     293        size_t pipe_count = count_other_pipes(endpoints);
    339294        if (pipe_count == 0) {
    340                 *pipes_count_ptr = pipe_count;
    341295                *pipes_ptr = NULL;
    342296                return EOK;
     
    395349        }
    396350
    397         if (usb_hc_connection_close(&hc_conn) != EOK)
    398                 usb_log_warning("usb_device_create_pipes(): "
    399                     "Failed to close connection.\n");
     351        usb_hc_connection_close(&hc_conn);
    400352
    401353        *pipes_ptr = pipes;
     
    419371        }
    420372
    421         if (usb_hc_connection_close(&hc_conn) != EOK)
    422                 usb_log_warning("usb_device_create_pipes(): "
    423                     "Failed to close connection.\n");
     373        usb_hc_connection_close(&hc_conn);
    424374
    425375        /*
     
    445395 * @param[in] pipes_count Number of endpoints.
    446396 */
    447 int usb_device_destroy_pipes(const ddf_dev_t *dev,
     397int usb_device_destroy_pipes(ddf_dev_t *dev,
    448398    usb_endpoint_mapping_t *pipes, size_t pipes_count)
    449399{
    450400        assert(dev != NULL);
     401        assert(((pipes != NULL) && (pipes_count > 0))
     402            || ((pipes == NULL) && (pipes_count == 0)));
    451403
    452404        if (pipes_count == 0) {
    453                 assert(pipes == NULL);
    454405                return EOK;
    455406        }
    456         assert(pipes != NULL);
    457407
    458408        int rc;
     
    472422        size_t i;
    473423        for (i = 0; i < pipes_count; i++) {
    474                 usb_log_debug2("Unregistering pipe %zu (%spresent).\n",
    475                     i, pipes[i].present ? "" : "not ");
    476                 if (pipes[i].present)
    477                         usb_pipe_unregister(pipes[i].pipe, &hc_conn);
     424                usb_pipe_unregister(pipes[i].pipe, &hc_conn);
    478425                free(pipes[i].pipe);
    479426        }
    480427
    481         if (usb_hc_connection_close(&hc_conn) != EOK)
    482                 usb_log_warning("usb_device_destroy_pipes(): "
    483                     "Failed to close connection.\n");
     428        usb_hc_connection_close(&hc_conn);
    484429
    485430        free(pipes);
     
    599544
    600545        /* Ignore errors and hope for the best. */
    601         destroy_current_pipes(dev);
     546        usb_device_destroy_pipes(dev->ddf_dev, dev->pipes, dev->pipes_count);
     547        if (dev->descriptors.configuration != NULL) {
     548                free(dev->descriptors.configuration);
     549        }
    602550
    603551        if (dev->alternate_interfaces != NULL) {
    604                 free(dev->alternate_interfaces->alternatives);
    605         }
    606         free(dev->alternate_interfaces);
    607         free(dev->descriptors.configuration);
    608         free(dev->driver_data);
    609 }
    610 
    611 void * usb_device_data_alloc(usb_device_t *usb_dev, size_t size)
    612 {
    613         assert(usb_dev);
    614         assert(usb_dev->driver_data == NULL);
    615         return usb_dev->driver_data = calloc(1, size);
    616 
     552                if (dev->alternate_interfaces->alternatives != NULL) {
     553                        free(dev->alternate_interfaces->alternatives);
     554                }
     555                free(dev->alternate_interfaces);
     556        }
     557
     558        free(dev);
    617559}
    618560
Note: See TracChangeset for help on using the changeset viewer.