Ignore:
File:
1 edited

Legend:

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

    re0a5d4c rb7fd2a0  
    22 * Copyright (c) 2011 Vojtech Horky
    33 * Copyright (c) 2011 Jan Vesely
    4  * Copyright (c) 2018 Ondrej Hlavaty, Petr Manek, Michal Staruch
    54 * All rights reserved.
    65 *
     
    4948#include <devman.h>
    5049#include <errno.h>
    51 #include <str_error.h>
    5250#include <stdlib.h>
    5351
     
    5856        /** Connection to device on USB bus */
    5957        usb_dev_session_t *bus_session;
    60 
     58       
    6159        /** devman handle */
    6260        devman_handle_t handle;
    63 
     61       
    6462        /** The default control pipe. */
    6563        usb_pipe_t ctrl_pipe;
    66 
     64       
    6765        /** Other endpoint pipes.
    6866         *
     
    7169         */
    7270        usb_endpoint_mapping_t *pipes;
    73 
     71       
    7472        /** Number of other endpoint pipes. */
    7573        size_t pipes_count;
    76 
    77         /** USB address of this device */
    78         usb_address_t address;
    79 
    80         /** Depth in the USB hub hiearchy */
    81         unsigned depth;
    82 
    83         /** USB speed of this device */
    84         usb_speed_t speed;
    85 
     74       
    8675        /** Current interface.
    8776         *
     
    9079         */
    9180        int interface_no;
    92 
     81       
    9382        /** Alternative interfaces. */
    9483        usb_alternate_interfaces_t alternate_interfaces;
    95 
     84       
    9685        /** Some useful descriptors for USB device. */
    9786        usb_device_descriptors_t descriptors;
    98 
     87       
    9988        /** Generic DDF device backing this one. DO NOT TOUCH! */
    10089        ddf_dev_t *ddf_dev;
    101 
     90       
    10291        /** Custom driver data.
    10392         *
     
    157146                return rc;
    158147        }
    159 
     148       
    160149        /* Change current alternative */
    161150        usb_dev->alternate_interfaces.current = alternate_setting;
     
    266255
    267256        /* Register created pipes. */
    268         unsigned pipes_registered = 0;
    269257        for (size_t i = 0; i < pipe_count; i++) {
    270258                if (pipes[i].present) {
    271                         rc = usb_pipe_register(&pipes[i].pipe, pipes[i].descriptor, pipes[i].companion_descriptor);
     259                        rc = usb_pipe_register(&pipes[i].pipe,
     260                            pipes[i].descriptor->poll_interval);
    272261                        if (rc != EOK) {
    273262                                goto rollback_unregister_endpoints;
    274263                        }
    275264                }
    276                 pipes_registered++;
    277265        }
    278266
     
    289277         */
    290278rollback_unregister_endpoints:
    291         for (size_t i = 0; i < pipes_registered; i++) {
     279        for (size_t i = 0; i < pipe_count; i++) {
    292280                if (pipes[i].present) {
    293281                        usb_pipe_unregister(&pipes[i].pipe);
     
    308296        assert(usb_dev);
    309297        assert(usb_dev->pipes || usb_dev->pipes_count == 0);
    310 
     298       
    311299        /* Destroy the pipes. */
    312         int rc;
    313300        for (size_t i = 0; i < usb_dev->pipes_count; ++i) {
    314                 usb_log_debug2("Unregistering pipe %zu: %spresent.",
     301                usb_log_debug2("Unregistering pipe %zu: %spresent.\n",
    315302                    i, usb_dev->pipes[i].present ? "" : "not ");
    316 
    317                 rc = usb_device_unmap_ep(usb_dev->pipes + i);
    318                 if (rc != EOK && rc != ENOENT)
    319                         usb_log_warning("Unregistering pipe %zu failed: %s", i, str_error(rc));
    320         }
    321 
     303                if (usb_dev->pipes[i].present)
     304                        usb_pipe_unregister(&usb_dev->pipes[i].pipe);
     305        }
     306       
    322307        free(usb_dev->pipes);
    323308        usb_dev->pipes = NULL;
     
    342327}
    343328
    344 int usb_device_unmap_ep(usb_endpoint_mapping_t *epm)
    345 {
    346         assert(epm);
    347 
    348         if (!epm->present)
    349                 return ENOENT;
    350 
    351         const int rc = usb_pipe_unregister(&epm->pipe);
    352         if (rc != EOK)
    353                 return rc;
    354 
    355         epm->present = false;
    356         return EOK;
    357 }
    358 
    359 usb_address_t usb_device_get_address(const usb_device_t *usb_dev)
    360 {
    361         assert(usb_dev);
    362         return usb_dev->depth;
    363 }
    364 
    365 unsigned usb_device_get_depth(const usb_device_t *usb_dev)
    366 {
    367         assert(usb_dev);
    368         return usb_dev->depth;
    369 }
    370 
    371 usb_speed_t usb_device_get_speed(const usb_device_t *usb_dev)
    372 {
    373         assert(usb_dev);
    374         return usb_dev->speed;
    375 }
    376 
    377 int usb_device_get_iface_number(const usb_device_t *usb_dev)
     329usb_endpoint_mapping_t * usb_device_get_mapped_ep(
     330    usb_device_t *usb_dev, usb_endpoint_t ep)
     331{
     332        assert(usb_dev);
     333        for (unsigned i = 0; i < usb_dev->pipes_count; ++i) {
     334                if (usb_dev->pipes[i].pipe.endpoint_no == ep)
     335                        return &usb_dev->pipes[i];
     336        }
     337        return NULL;
     338}
     339
     340int usb_device_get_iface_number(usb_device_t *usb_dev)
    378341{
    379342        assert(usb_dev);
     
    381344}
    382345
    383 devman_handle_t usb_device_get_devman_handle(const usb_device_t *usb_dev)
     346devman_handle_t usb_device_get_devman_handle(usb_device_t *usb_dev)
    384347{
    385348        assert(usb_dev);
     
    431394 */
    432395static errno_t usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev,
    433     const usb_endpoint_description_t **endpoints, const char **errstr_ptr)
     396    const usb_endpoint_description_t **endpoints, const char **errstr_ptr,
     397    devman_handle_t handle, int interface_no)
    434398{
    435399        assert(usb_dev != NULL);
     
    439403
    440404        usb_dev->ddf_dev = ddf_dev;
     405        usb_dev->handle = handle;
     406        usb_dev->interface_no = interface_no;
    441407        usb_dev->driver_data = NULL;
    442408        usb_dev->descriptors.full_config = NULL;
     
    445411        usb_dev->pipes = NULL;
    446412
    447         usb_dev->bus_session = usb_dev_connect(usb_dev->handle);
     413        usb_dev->bus_session = usb_dev_connect(handle);
    448414
    449415        if (!usb_dev->bus_session) {
     
    454420        /* This pipe was registered by the hub driver,
    455421         * during device initialization. */
    456         errno_t rc = usb_pipe_initialize_default_control(&usb_dev->ctrl_pipe, usb_dev->bus_session);
     422        errno_t rc = usb_pipe_initialize_default_control(
     423            &usb_dev->ctrl_pipe, usb_dev->bus_session);
    457424        if (rc != EOK) {
    458425                usb_dev_disconnect(usb_dev->bus_session);
     
    473440         * it makes no sense to speak about alternate interfaces when
    474441         * controlling a device. */
    475         usb_alternate_interfaces_init(&usb_dev->alternate_interfaces,
     442        rc = usb_alternate_interfaces_init(&usb_dev->alternate_interfaces,
    476443            usb_dev->descriptors.full_config,
    477444            usb_dev->descriptors.full_config_size, usb_dev->interface_no);
     
    490457}
    491458
    492 static errno_t usb_device_get_info(async_sess_t *sess, usb_device_t *dev)
    493 {
    494         assert(dev);
    495 
     459static errno_t usb_device_get_info(async_sess_t *sess, devman_handle_t *handle,
     460        int *iface_no)
     461{
     462        assert(handle);
     463        assert(iface_no);
     464       
    496465        async_exch_t *exch = async_exchange_begin(sess);
    497466        if (!exch)
    498467                return EPARTY;
    499 
    500         usb_device_desc_t dev_desc;
    501         const errno_t ret = usb_get_my_description(exch, &dev_desc);
    502 
     468       
     469        errno_t ret = usb_get_my_device_handle(exch, handle);
    503470        if (ret == EOK) {
    504                 dev->address = dev_desc.address;
    505                 dev->depth = dev_desc.depth;
    506                 dev->speed = dev_desc.speed;
    507                 dev->handle = dev_desc.handle;
    508                 dev->interface_no = dev_desc.iface;
    509         }
    510 
     471                ret = usb_get_my_interface(exch, iface_no);
     472                if (ret == ENOTSUP) {
     473                        *iface_no = -1;
     474                        ret = EOK;
     475                }
     476        }
     477       
    511478        async_exchange_end(exch);
    512479        return ret;
     
    518485        assert(ddf_dev);
    519486        assert(err);
     487
     488        devman_handle_t h = 0;
     489        int iface_no = -1;
    520490
    521491        async_sess_t *sess = ddf_dev_parent_sess_get(ddf_dev);
    522492        if (sess == NULL)
    523493                return ENOMEM;
     494        const errno_t ret = usb_device_get_info(sess, &h, &iface_no);
     495        if (ret != EOK)
     496                return ret;
    524497
    525498        usb_device_t *usb_dev =
     
    529502                return ENOMEM;
    530503        }
    531 
    532         const errno_t ret = usb_device_get_info(sess, usb_dev);
    533         if (ret != EOK)
    534                 return ret;
    535 
    536         return usb_device_init(usb_dev, ddf_dev, desc, err);
     504       
     505        return usb_device_init(usb_dev, ddf_dev, desc, err, h, iface_no);
    537506}
    538507
     
    548517usb_device_t * usb_device_create(devman_handle_t handle)
    549518{
     519        devman_handle_t h = 0;
     520        int iface_no = -1;
     521
     522        async_sess_t *sess = devman_device_connect(handle, IPC_FLAG_BLOCKING);
     523        errno_t ret = usb_device_get_info(sess, &h, &iface_no);
     524        if (sess)
     525                async_hangup(sess);
     526        if (ret != EOK)
     527                return NULL;
     528
    550529        usb_device_t *usb_dev = malloc(sizeof(usb_device_t));
    551530        if (!usb_dev)
    552531                return NULL;
    553532
    554         async_sess_t *sess = devman_device_connect(handle, IPC_FLAG_BLOCKING);
    555         errno_t ret = usb_device_get_info(sess, usb_dev);
    556         if (sess)
    557                 async_hangup(sess);
    558         if (ret != EOK) {
    559                 free(usb_dev);
    560                 return NULL;
    561         }
    562 
    563533        const char* dummy = NULL;
    564         ret = usb_device_init(usb_dev, NULL, NULL, &dummy);
     534        ret = usb_device_init(usb_dev, NULL, NULL, &dummy, handle, iface_no);
    565535        if (ret != EOK) {
    566536                free(usb_dev);
Note: See TracChangeset for help on using the changeset viewer.