Ignore:
File:
1 edited

Legend:

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

    rb7fd2a0 r5a6cc679  
    4848#include <devman.h>
    4949#include <errno.h>
     50#include <str_error.h>
    5051#include <stdlib.h>
    5152
     
    5657        /** Connection to device on USB bus */
    5758        usb_dev_session_t *bus_session;
    58        
     59
    5960        /** devman handle */
    6061        devman_handle_t handle;
    61        
     62
    6263        /** The default control pipe. */
    6364        usb_pipe_t ctrl_pipe;
    64        
     65
    6566        /** Other endpoint pipes.
    6667         *
     
    6970         */
    7071        usb_endpoint_mapping_t *pipes;
    71        
     72
    7273        /** Number of other endpoint pipes. */
    7374        size_t pipes_count;
    74        
     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
    7585        /** Current interface.
    7686         *
     
    7989         */
    8090        int interface_no;
    81        
     91
    8292        /** Alternative interfaces. */
    8393        usb_alternate_interfaces_t alternate_interfaces;
    84        
     94
    8595        /** Some useful descriptors for USB device. */
    8696        usb_device_descriptors_t descriptors;
    87        
     97
    8898        /** Generic DDF device backing this one. DO NOT TOUCH! */
    8999        ddf_dev_t *ddf_dev;
    90        
     100
    91101        /** Custom driver data.
    92102         *
     
    146156                return rc;
    147157        }
    148        
     158
    149159        /* Change current alternative */
    150160        usb_dev->alternate_interfaces.current = alternate_setting;
     
    255265
    256266        /* Register created pipes. */
     267        unsigned pipes_registered = 0;
    257268        for (size_t i = 0; i < pipe_count; i++) {
    258269                if (pipes[i].present) {
    259                         rc = usb_pipe_register(&pipes[i].pipe,
    260                             pipes[i].descriptor->poll_interval);
     270                        rc = usb_pipe_register(&pipes[i].pipe, pipes[i].descriptor, pipes[i].companion_descriptor);
    261271                        if (rc != EOK) {
    262272                                goto rollback_unregister_endpoints;
    263273                        }
    264274                }
     275                pipes_registered++;
    265276        }
    266277
     
    277288         */
    278289rollback_unregister_endpoints:
    279         for (size_t i = 0; i < pipe_count; i++) {
     290        for (size_t i = 0; i < pipes_registered; i++) {
    280291                if (pipes[i].present) {
    281292                        usb_pipe_unregister(&pipes[i].pipe);
     
    296307        assert(usb_dev);
    297308        assert(usb_dev->pipes || usb_dev->pipes_count == 0);
    298        
     309
    299310        /* Destroy the pipes. */
     311        int rc;
    300312        for (size_t i = 0; i < usb_dev->pipes_count; ++i) {
    301                 usb_log_debug2("Unregistering pipe %zu: %spresent.\n",
     313                usb_log_debug2("Unregistering pipe %zu: %spresent.",
    302314                    i, usb_dev->pipes[i].present ? "" : "not ");
    303                 if (usb_dev->pipes[i].present)
    304                         usb_pipe_unregister(&usb_dev->pipes[i].pipe);
    305         }
    306        
     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
    307321        free(usb_dev->pipes);
    308322        usb_dev->pipes = NULL;
     
    327341}
    328342
    329 usb_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 
    340 int usb_device_get_iface_number(usb_device_t *usb_dev)
     343int 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
     358usb_address_t usb_device_get_address(const usb_device_t *usb_dev)
     359{
     360        assert(usb_dev);
     361        return usb_dev->depth;
     362}
     363
     364unsigned usb_device_get_depth(const usb_device_t *usb_dev)
     365{
     366        assert(usb_dev);
     367        return usb_dev->depth;
     368}
     369
     370usb_speed_t usb_device_get_speed(const usb_device_t *usb_dev)
     371{
     372        assert(usb_dev);
     373        return usb_dev->speed;
     374}
     375
     376int usb_device_get_iface_number(const usb_device_t *usb_dev)
    341377{
    342378        assert(usb_dev);
     
    344380}
    345381
    346 devman_handle_t usb_device_get_devman_handle(usb_device_t *usb_dev)
     382devman_handle_t usb_device_get_devman_handle(const usb_device_t *usb_dev)
    347383{
    348384        assert(usb_dev);
     
    394430 */
    395431static errno_t usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev,
    396     const usb_endpoint_description_t **endpoints, const char **errstr_ptr,
    397     devman_handle_t handle, int interface_no)
     432    const usb_endpoint_description_t **endpoints, const char **errstr_ptr)
    398433{
    399434        assert(usb_dev != NULL);
     
    403438
    404439        usb_dev->ddf_dev = ddf_dev;
    405         usb_dev->handle = handle;
    406         usb_dev->interface_no = interface_no;
    407440        usb_dev->driver_data = NULL;
    408441        usb_dev->descriptors.full_config = NULL;
     
    411444        usb_dev->pipes = NULL;
    412445
    413         usb_dev->bus_session = usb_dev_connect(handle);
     446        usb_dev->bus_session = usb_dev_connect(usb_dev->handle);
    414447
    415448        if (!usb_dev->bus_session) {
     
    420453        /* This pipe was registered by the hub driver,
    421454         * during device initialization. */
    422         errno_t rc = usb_pipe_initialize_default_control(
    423             &usb_dev->ctrl_pipe, usb_dev->bus_session);
     455        errno_t rc = usb_pipe_initialize_default_control(&usb_dev->ctrl_pipe, usb_dev->bus_session);
    424456        if (rc != EOK) {
    425457                usb_dev_disconnect(usb_dev->bus_session);
     
    440472         * it makes no sense to speak about alternate interfaces when
    441473         * controlling a device. */
    442         rc = usb_alternate_interfaces_init(&usb_dev->alternate_interfaces,
     474        usb_alternate_interfaces_init(&usb_dev->alternate_interfaces,
    443475            usb_dev->descriptors.full_config,
    444476            usb_dev->descriptors.full_config_size, usb_dev->interface_no);
     
    457489}
    458490
    459 static 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        
     491static errno_t usb_device_get_info(async_sess_t *sess, usb_device_t *dev)
     492{
     493        assert(dev);
     494
    465495        async_exch_t *exch = async_exchange_begin(sess);
    466496        if (!exch)
    467497                return EPARTY;
    468        
    469         errno_t ret = usb_get_my_device_handle(exch, handle);
     498
     499        usb_device_desc_t dev_desc;
     500        const errno_t ret = usb_get_my_description(exch, &dev_desc);
     501
    470502        if (ret == EOK) {
    471                 ret = usb_get_my_interface(exch, iface_no);
    472                 if (ret == ENOTSUP) {
    473                         *iface_no = -1;
    474                         ret = EOK;
    475                 }
    476         }
    477        
     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
    478510        async_exchange_end(exch);
    479511        return ret;
     
    485517        assert(ddf_dev);
    486518        assert(err);
    487 
    488         devman_handle_t h = 0;
    489         int iface_no = -1;
    490519
    491520        async_sess_t *sess = ddf_dev_parent_sess_get(ddf_dev);
    492521        if (sess == NULL)
    493522                return ENOMEM;
    494         const errno_t ret = usb_device_get_info(sess, &h, &iface_no);
    495         if (ret != EOK)
    496                 return ret;
    497523
    498524        usb_device_t *usb_dev =
     
    502528                return ENOMEM;
    503529        }
    504        
    505         return usb_device_init(usb_dev, ddf_dev, desc, err, h, iface_no);
     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);
    506536}
    507537
     
    517547usb_device_t * usb_device_create(devman_handle_t handle)
    518548{
    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 
    529549        usb_device_t *usb_dev = malloc(sizeof(usb_device_t));
    530550        if (!usb_dev)
    531551                return NULL;
    532552
     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
    533562        const char* dummy = NULL;
    534         ret = usb_device_init(usb_dev, NULL, NULL, &dummy, handle, iface_no);
     563        ret = usb_device_init(usb_dev, NULL, NULL, &dummy);
    535564        if (ret != EOK) {
    536565                free(usb_dev);
Note: See TracChangeset for help on using the changeset viewer.