Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/hub.c

    r4ede178 rb6c9e1e  
    4040#include <errno.h>
    4141#include <assert.h>
     42#include <usb/debug.h>
    4243
    4344/** Check that HC connection is alright.
     
    5556
    5657/** Tell host controller to reserve default address.
     58 * @deprecated
    5759 *
    5860 * @param connection Opened connection to host controller.
     
    6567        CHECK_CONNECTION(connection);
    6668
     69        usb_log_warning("usb_hc_reserve_default_address() considered obsolete");
     70
    6771        return async_req_2_0(connection->hc_phone,
    6872            DEV_IFACE_ID(USBHC_DEV_IFACE),
     
    7175
    7276/** Tell host controller to release default address.
     77 * @deprecated
    7378 *
    7479 * @param connection Opened connection to host controller.
     
    7883{
    7984        CHECK_CONNECTION(connection);
     85
     86        usb_log_warning("usb_hc_release_default_address() considered obsolete");
    8087
    8188        return async_req_1_0(connection->hc_phone,
     
    235242        }
    236243
    237 
    238         /*
    239          * Reserve the default address.
    240          */
    241         rc = usb_hc_reserve_default_address(&hc_conn, dev_speed);
    242         if (rc != EOK) {
    243                 rc = EBUSY;
    244                 goto leave_release_free_address;
    245         }
    246 
    247         /*
    248          * Enable the port (i.e. allow signaling through this port).
    249          */
    250         rc = enable_port(port_no, arg);
    251         if (rc != EOK) {
    252                 goto leave_release_default_address;
    253         }
    254 
    255         /*
    256          * Change the address from default to the free one.
    257          * We need to create a new control pipe for that.
     244        /*
     245         * We will not register control pipe on default address.
     246         * The registration might fail. That means that someone else already
     247         * registered that endpoint. We will simply wait and try again.
     248         * (Someone else already wants to add a new device.)
    258249         */
    259250        usb_device_connection_t dev_conn;
     
    262253        if (rc != EOK) {
    263254                rc = ENOTCONN;
    264                 goto leave_release_default_address;
     255                goto leave_release_free_address;
    265256        }
    266257
     
    270261        if (rc != EOK) {
    271262                rc = ENOTCONN;
     263                goto leave_release_free_address;
     264        }
     265
     266        do {
     267                rc = usb_pipe_register_with_speed(&ctrl_pipe, dev_speed, 0,
     268                    &hc_conn);
     269                if (rc != EOK) {
     270                        /* Do not overheat the CPU ;-). */
     271                        async_usleep(10);
     272                }
     273        } while (rc != EOK);
     274
     275        /*
     276         * Endpoint is registered. We can enable the port and change
     277         * device address.
     278         */
     279        rc = enable_port(port_no, arg);
     280        if (rc != EOK) {
    272281                goto leave_release_default_address;
    273282        }
    274283
    275         /* Before sending any traffic, we need to register this
    276          * endpoint.
    277          */
    278         rc = usb_pipe_register(&ctrl_pipe, 0, &hc_conn);
    279         if (rc != EOK) {
    280                 rc = EREFUSED;
     284        rc = usb_pipe_probe_default_control(&ctrl_pipe);
     285        if (rc != EOK) {
     286                rc = ESTALL;
    281287                goto leave_release_default_address;
    282288        }
    283         rc = usb_pipe_probe_default_control(&ctrl_pipe);
     289
     290
     291        rc = usb_pipe_start_session(&ctrl_pipe);
    284292        if (rc != EOK) {
    285293                rc = ENOTCONN;
     
    293301        }
    294302
    295         /*
    296          * Register the control endpoint for the new device.
     303        usb_pipe_end_session(&ctrl_pipe);
     304
     305        /*
     306         * Address changed. We can release the original endpoint, thus
     307         * allowing other to access the default address.
     308         */
     309        unregister_control_endpoint_on_default_address(&hc_conn);
     310
     311        /*
     312         * Time to register the new endpoint.
    297313         */
    298314        rc = usb_pipe_register(&ctrl_pipe, 0, &hc_conn);
    299315        if (rc != EOK) {
    300                 rc = EREFUSED;
    301                 goto leave_unregister_endpoint;
    302         }
    303 
    304         /*
    305          * Release the original endpoint.
    306          */
    307         unregister_control_endpoint_on_default_address(&hc_conn);
    308 
    309         /*
    310          * Once the address is changed, we can return the default address.
    311          */
    312         usb_hc_release_default_address(&hc_conn);
    313 
     316                goto leave_release_free_address;
     317        }
    314318
    315319        /*
     
    326330        }
    327331
    328 
    329 
    330332        /*
    331333         * And now inform the host controller about the handle.
     
    363365        usb_pipe_end_session(&ctrl_pipe);
    364366
    365 leave_unregister_endpoint:
     367leave_release_default_address:
    366368        usb_pipe_unregister(&ctrl_pipe, &hc_conn);
    367 
    368 leave_release_default_address:
    369         usb_hc_release_default_address(&hc_conn);
    370369
    371370leave_release_free_address:
Note: See TracChangeset for help on using the changeset viewer.