Ignore:
File:
1 edited

Legend:

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

    r5a6cc679 rb7fd2a0  
    4848#include <devman.h>
    4949#include <errno.h>
    50 #include <str_error.h>
    5150#include <stdlib.h>
    5251
     
    5756        /** Connection to device on USB bus */
    5857        usb_dev_session_t *bus_session;
    59 
     58       
    6059        /** devman handle */
    6160        devman_handle_t handle;
    62 
     61       
    6362        /** The default control pipe. */
    6463        usb_pipe_t ctrl_pipe;
    65 
     64       
    6665        /** Other endpoint pipes.
    6766         *
     
    7069         */
    7170        usb_endpoint_mapping_t *pipes;
    72 
     71       
    7372        /** Number of other endpoint pipes. */
    7473        size_t pipes_count;
    75 
    76         /** USB address of this device */
    77         usb_address_t address;
    78 
    79         /** Depth in the USB hub hiearchy */
    80         unsigned depth;
    81 
    82         /** USB speed of this device */
    83         usb_speed_t speed;
    84 
     74       
    8575        /** Current interface.
    8676         *
     
    8979         */
    9080        int interface_no;
    91 
     81       
    9282        /** Alternative interfaces. */
    9383        usb_alternate_interfaces_t alternate_interfaces;
    94 
     84       
    9585        /** Some useful descriptors for USB device. */
    9686        usb_device_descriptors_t descriptors;
    97 
     87       
    9888        /** Generic DDF device backing this one. DO NOT TOUCH! */
    9989        ddf_dev_t *ddf_dev;
    100 
     90       
    10191        /** Custom driver data.
    10292         *
     
    156146                return rc;
    157147        }
    158 
     148       
    159149        /* Change current alternative */
    160150        usb_dev->alternate_interfaces.current = alternate_setting;
     
    265255
    266256        /* Register created pipes. */
    267         unsigned pipes_registered = 0;
    268257        for (size_t i = 0; i < pipe_count; i++) {
    269258                if (pipes[i].present) {
    270                         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);
    271261                        if (rc != EOK) {
    272262                                goto rollback_unregister_endpoints;
    273263                        }
    274264                }
    275                 pipes_registered++;
    276265        }
    277266
     
    288277         */
    289278rollback_unregister_endpoints:
    290         for (size_t i = 0; i < pipes_registered; i++) {
     279        for (size_t i = 0; i < pipe_count; i++) {
    291280                if (pipes[i].present) {
    292281                        usb_pipe_unregister(&pipes[i].pipe);
     
    307296        assert(usb_dev);
    308297        assert(usb_dev->pipes || usb_dev->pipes_count == 0);
    309 
     298       
    310299        /* Destroy the pipes. */
    311         int rc;
    312300        for (size_t i = 0; i < usb_dev->pipes_count; ++i) {
    313                 usb_log_debug2("Unregistering pipe %zu: %spresent.",
     301                usb_log_debug2("Unregistering pipe %zu: %spresent.\n",
    314302                    i, usb_dev->pipes[i].present ? "" : "not ");
    315 
    316                 rc = usb_device_unmap_ep(usb_dev->pipes + i);
    317                 if (rc != EOK && rc != ENOENT)
    318                         usb_log_warning("Unregistering pipe %zu failed: %s", i, str_error(rc));
    319         }
    320 
     303                if (usb_dev->pipes[i].present)
     304                        usb_pipe_unregister(&usb_dev->pipes[i].pipe);
     305        }
     306       
    321307        free(usb_dev->pipes);
    322308        usb_dev->pipes = NULL;
     
    341327}
    342328
    343 int usb_device_unmap_ep(usb_endpoint_mapping_t *epm)
    344 {
    345         assert(epm);
    346 
    347         if (!epm->present)
    348                 return ENOENT;
    349 
    350         const int rc = usb_pipe_unregister(&epm->pipe);
    351         if (rc != EOK)
    352                 return rc;
    353 
    354         epm->present = false;
    355         return EOK;
    356 }
    357 
    358 usb_address_t usb_device_get_address(const usb_device_t *usb_dev)
    359 {
    360         assert(usb_dev);
    361         return usb_dev->depth;
    362 }
    363 
    364 unsigned usb_device_get_depth(const usb_device_t *usb_dev)
    365 {
    366         assert(usb_dev);
    367         return usb_dev->depth;
    368 }
    369 
    370 usb_speed_t usb_device_get_speed(const usb_device_t *usb_dev)
    371 {
    372         assert(usb_dev);
    373         return usb_dev->speed;
    374 }
    375 
    376 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)
    377341{
    378342        assert(usb_dev);
     
    380344}
    381345
    382 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)
    383347{
    384348        assert(usb_dev);
     
    430394 */
    431395static errno_t usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev,
    432     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)
    433398{
    434399        assert(usb_dev != NULL);
     
    438403
    439404        usb_dev->ddf_dev = ddf_dev;
     405        usb_dev->handle = handle;
     406        usb_dev->interface_no = interface_no;
    440407        usb_dev->driver_data = NULL;
    441408        usb_dev->descriptors.full_config = NULL;
     
    444411        usb_dev->pipes = NULL;
    445412
    446         usb_dev->bus_session = usb_dev_connect(usb_dev->handle);
     413        usb_dev->bus_session = usb_dev_connect(handle);
    447414
    448415        if (!usb_dev->bus_session) {
     
    453420        /* This pipe was registered by the hub driver,
    454421         * during device initialization. */
    455         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);
    456424        if (rc != EOK) {
    457425                usb_dev_disconnect(usb_dev->bus_session);
     
    472440         * it makes no sense to speak about alternate interfaces when
    473441         * controlling a device. */
    474         usb_alternate_interfaces_init(&usb_dev->alternate_interfaces,
     442        rc = usb_alternate_interfaces_init(&usb_dev->alternate_interfaces,
    475443            usb_dev->descriptors.full_config,
    476444            usb_dev->descriptors.full_config_size, usb_dev->interface_no);
     
    489457}
    490458
    491 static errno_t usb_device_get_info(async_sess_t *sess, usb_device_t *dev)
    492 {
    493         assert(dev);
    494 
     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       
    495465        async_exch_t *exch = async_exchange_begin(sess);
    496466        if (!exch)
    497467                return EPARTY;
    498 
    499         usb_device_desc_t dev_desc;
    500         const errno_t ret = usb_get_my_description(exch, &dev_desc);
    501 
     468       
     469        errno_t ret = usb_get_my_device_handle(exch, handle);
    502470        if (ret == EOK) {
    503                 dev->address = dev_desc.address;
    504                 dev->depth = dev_desc.depth;
    505                 dev->speed = dev_desc.speed;
    506                 dev->handle = dev_desc.handle;
    507                 dev->interface_no = dev_desc.iface;
    508         }
    509 
     471                ret = usb_get_my_interface(exch, iface_no);
     472                if (ret == ENOTSUP) {
     473                        *iface_no = -1;
     474                        ret = EOK;
     475                }
     476        }
     477       
    510478        async_exchange_end(exch);
    511479        return ret;
     
    517485        assert(ddf_dev);
    518486        assert(err);
     487
     488        devman_handle_t h = 0;
     489        int iface_no = -1;
    519490
    520491        async_sess_t *sess = ddf_dev_parent_sess_get(ddf_dev);
    521492        if (sess == NULL)
    522493                return ENOMEM;
     494        const errno_t ret = usb_device_get_info(sess, &h, &iface_no);
     495        if (ret != EOK)
     496                return ret;
    523497
    524498        usb_device_t *usb_dev =
     
    528502                return ENOMEM;
    529503        }
    530 
    531         const errno_t ret = usb_device_get_info(sess, usb_dev);
    532         if (ret != EOK)
    533                 return ret;
    534 
    535         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);
    536506}
    537507
     
    547517usb_device_t * usb_device_create(devman_handle_t handle)
    548518{
     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
    549529        usb_device_t *usb_dev = malloc(sizeof(usb_device_t));
    550530        if (!usb_dev)
    551531                return NULL;
    552532
    553         async_sess_t *sess = devman_device_connect(handle, IPC_FLAG_BLOCKING);
    554         errno_t ret = usb_device_get_info(sess, usb_dev);
    555         if (sess)
    556                 async_hangup(sess);
    557         if (ret != EOK) {
    558                 free(usb_dev);
    559                 return NULL;
    560         }
    561 
    562533        const char* dummy = NULL;
    563         ret = usb_device_init(usb_dev, NULL, NULL, &dummy);
     534        ret = usb_device_init(usb_dev, NULL, NULL, &dummy, handle, iface_no);
    564535        if (ret != EOK) {
    565536                free(usb_dev);
Note: See TracChangeset for help on using the changeset viewer.