Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbhub/usbhub.c

    r6bb83c7 r563fb40  
    4343#include <usb/recognise.h>
    4444#include <usb/devreq.h>
    45 #include <usb/request.h>
    4645#include <usb/classes/hub.h>
    4746
     
    5049#include "port_status.h"
    5150#include "usb/usb.h"
    52 #include "usb/pipes.h"
     51
     52static int iface_get_hc_handle(device_t *device, devman_handle_t *handle)
     53{
     54        return usb_hc_find(device->handle, handle);
     55}
    5356
    5457static usb_iface_t hub_usb_iface = {
    55         .get_hc_handle = usb_drv_find_hc
     58        .get_hc_handle = iface_get_hc_handle
    5659};
    5760
     
    6669//*********************************************
    6770
    68 usb_hub_info_t * usb_create_hub_info(device_t * device) {
     71usb_hub_info_t * usb_create_hub_info(device_t * device, int hc) {
    6972        usb_hub_info_t* result = usb_new(usb_hub_info_t);
    70         usb_device_connection_initialize_from_device(&result->device_connection,
    71                         device);
    72         usb_hc_connection_initialize_from_device(&result->connection,
    73                         device);
    74         usb_endpoint_pipe_initialize_default_control(&result->endpoints.control,
    75             &result->device_connection);
    76        
    77 
    7873        //result->device = device;
    7974        result->port_count = -1;
     
    8176        result->device = device;
    8277
    83         //result->usb_device = usb_new(usb_hcd_attached_device_info_t);
    84        
     78
     79        dprintf(USB_LOG_LEVEL_DEBUG, "phone to hc = %d", hc);
     80        if (hc < 0) {
     81                return result;
     82        }
     83        //get some hub info
     84        usb_address_t addr = usb_drv_get_my_address(hc, device);
     85        dprintf(USB_LOG_LEVEL_DEBUG, "address of newly created hub = %d", addr);
     86        /*if(addr<0){
     87                //return result;
     88
     89        }*/
     90
     91        result->address = addr;
     92
    8593        // get hub descriptor
    8694
     
    9199        int opResult;
    92100        dprintf(USB_LOG_LEVEL_DEBUG, "starting control transaction");
    93         usb_endpoint_pipe_start_session(&result->endpoints.control);
    94         opResult = usb_request_get_descriptor(&result->endpoints.control,
     101       
     102        opResult = usb_drv_req_get_descriptor(hc, addr,
    95103                        USB_REQUEST_TYPE_CLASS,
    96104                        USB_DESCTYPE_HUB, 0, 0, serialized_descriptor,
    97105                        USB_HUB_MAX_DESCRIPTOR_SIZE, &received_size);
    98         usb_endpoint_pipe_end_session(&result->endpoints.control);
    99 
    100         /* Initialize the interrupt endpoint.
    101         usb_endpoint_pipe_initalize(
    102                 &hub_data->endpoints->status_change,
    103                 &endpiont_descriptor, &hub_data->connection);
    104 
    105          */ /// \TODO add this call
    106106
    107107        if (opResult != EOK) {
     
    119119        dprintf(USB_LOG_LEVEL_INFO, "setting port count to %d",descriptor->ports_count);
    120120        result->port_count = descriptor->ports_count;
    121         result->attached_devs = (usb_hc_attached_device_t*)
    122             malloc((result->port_count+1) * sizeof(usb_hc_attached_device_t));
     121        result->attached_devs = (usb_hub_attached_device_t*)
     122            malloc((result->port_count+1) * sizeof(usb_hub_attached_device_t));
    123123        int i;
    124124        for(i=0;i<result->port_count+1;++i){
    125                 result->attached_devs[i].handle=0;
     125                result->attached_devs[i].devman_handle=0;
    126126                result->attached_devs[i].address=0;
    127127        }
     
    148148        dev->ops = &hub_device_ops;
    149149
    150 
    151         usb_hub_info_t * hub_info = usb_create_hub_info(dev);
    152         usb_endpoint_pipe_start_session(&hub_info->endpoints.control);
    153 
     150        //create the hub structure
     151        //get hc connection
     152        int hc = usb_drv_hc_connect_auto(dev, 0);
     153        if (hc < 0) {
     154                return hc;
     155        }
     156
     157        usb_hub_info_t * hub_info = usb_create_hub_info(dev, hc);
    154158        int port;
    155159        int opResult;
    156         //usb_target_t target;
    157         //target.address = hub_info->usb_device->address;
    158         //target.endpoint = 0;
     160        usb_target_t target;
     161        target.address = hub_info->address;
     162        target.endpoint = 0;
    159163
    160164        //get configuration descriptor
     
    162166        // and all should be checked
    163167        usb_standard_device_descriptor_t std_descriptor;
    164         opResult = usb_request_get_device_descriptor(&hub_info->endpoints.control,
     168        opResult = usb_drv_req_get_device_descriptor(hc, target.address,
    165169            &std_descriptor);
    166170        if(opResult!=EOK){
     
    175179        /// \TODO check other configurations
    176180        usb_standard_configuration_descriptor_t config_descriptor;
    177         opResult = usb_request_get_bare_configuration_descriptor(
    178             &hub_info->endpoints.control, 0,
     181        opResult = usb_drv_req_get_bare_configuration_descriptor(hc,
     182        target.address, 0,
    179183        &config_descriptor);
    180184        if(opResult!=EOK){
     
    183187        }
    184188        //set configuration
    185         opResult = usb_request_set_configuration(&hub_info->endpoints.control,
     189        opResult = usb_drv_req_set_configuration(hc, target.address,
    186190    config_descriptor.configuration_number);
    187191
     
    193197        for (port = 1; port < hub_info->port_count+1; ++port) {
    194198                usb_hub_set_power_port_request(&request, port);
    195                 opResult = usb_endpoint_pipe_control_write(&hub_info->endpoints.control,
    196                                 &request,sizeof(usb_device_request_setup_packet_t), NULL, 0);
     199                opResult = usb_drv_sync_control_write(hc, target, &request, NULL, 0);
    197200                dprintf(USB_LOG_LEVEL_INFO, "powering port %d",port);
    198201                if (opResult != EOK) {
     
    202205        //ports powered, hub seems to be enabled
    203206
    204         usb_endpoint_pipe_end_session(&hub_info->endpoints.control);
    205         //async_hangup(hc);
     207        async_hangup(hc);
    206208
    207209        //add the hub to list
     
    217219
    218220        dprintf(USB_LOG_LEVEL_INFO, "hub dev added");
    219         //address is lost...
    220221        dprintf(USB_LOG_LEVEL_DEBUG, "\taddress %d, has %d ports ",
    221                         //hub_info->endpoints.control.,
     222                        hub_info->address,
    222223                        hub_info->port_count);
    223224        dprintf(USB_LOG_LEVEL_DEBUG, "\tused configuration %d",config_descriptor.configuration_number);
     
    256257 * @param target
    257258 */
    258 static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port) {
     259static void usb_hub_init_add_device(int hc, uint16_t port, usb_target_t target) {
    259260        usb_device_request_setup_packet_t request;
    260261        int opResult;
    261262        dprintf(USB_LOG_LEVEL_INFO, "some connection changed");
    262         assert(hub->endpoints.control.hc_phone);
    263263        //get default address
    264         //opResult = usb_drv_reserve_default_address(hc);
    265         opResult = usb_hc_reserve_default_address(&hub->connection, false);
     264        opResult = usb_drv_reserve_default_address(hc);
    266265        if (opResult != EOK) {
    267266                dprintf(USB_LOG_LEVEL_WARNING, "cannot assign default address, it is probably used");
     
    270269        //reset port
    271270        usb_hub_set_reset_port_request(&request, port);
    272         opResult = usb_endpoint_pipe_control_write(
    273                         &hub->endpoints.control,
    274                         &request,sizeof(usb_device_request_setup_packet_t),
     271        opResult = usb_drv_sync_control_write(
     272                        hc, target,
     273                        &request,
    275274                        NULL, 0
    276275                        );
    277276        if (opResult != EOK) {
    278277                dprintf(USB_LOG_LEVEL_ERROR, "something went wrong when reseting a port");
    279                 //usb_hub_release_default_address(hc);
    280                 usb_hc_release_default_address(&hub->connection);
     278                usb_hub_release_default_address(hc);
    281279        }
    282280}
     
    289287 */
    290288static void usb_hub_finalize_add_device( usb_hub_info_t * hub,
    291                 uint16_t port) {
     289                int hc, uint16_t port, usb_target_t target) {
    292290
    293291        int opResult;
    294292        dprintf(USB_LOG_LEVEL_INFO, "finalizing add device");
    295         opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
     293        opResult = usb_hub_clear_port_feature(hc, target.address,
    296294            port, USB_HUB_FEATURE_C_PORT_RESET);
    297 
    298295        if (opResult != EOK) {
    299296                dprintf(USB_LOG_LEVEL_ERROR, "failed to clear port reset feature");
    300                 usb_hc_release_default_address(&hub->connection);
    301                 return;
    302         }
    303         //create connection to device
    304         usb_endpoint_pipe_t new_device_pipe;
    305         usb_device_connection_t new_device_connection;
    306         usb_device_connection_initialize_on_default_address(
    307                         &new_device_connection,
    308                         &hub->connection
    309                         );
    310         usb_endpoint_pipe_initialize_default_control(
    311                         &new_device_pipe,
    312                         &new_device_connection);
    313         /// \TODO get highspeed info
    314 
    315 
    316 
    317 
    318 
    319         /* Request address from host controller. */
    320         usb_address_t new_device_address = usb_hc_request_address(
    321                         &hub->connection,
    322                         false/// \TODO fullspeed??
    323                         );
     297                usb_hub_release_default_address(hc);
     298                return;
     299        }
     300
     301        /* Request address at from host controller. */
     302        usb_address_t new_device_address = usb_drv_request_address(hc);
    324303        if (new_device_address < 0) {
    325304                dprintf(USB_LOG_LEVEL_ERROR, "failed to get free USB address");
    326305                opResult = new_device_address;
    327                 usb_hc_release_default_address(&hub->connection);
     306                usb_hub_release_default_address(hc);
    328307                return;
    329308        }
    330309        dprintf(USB_LOG_LEVEL_INFO, "setting new address %d",new_device_address);
    331         //opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT,
    332         //    new_device_address);
    333         opResult = usb_request_set_address(&new_device_pipe,new_device_address);
     310        opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT,
     311            new_device_address);
    334312
    335313        if (opResult != EOK) {
    336314                dprintf(USB_LOG_LEVEL_ERROR, "could not set address for new device");
    337                 usb_hc_release_default_address(&hub->connection);
    338                 return;
    339         }
    340 
    341 
    342         //opResult = usb_hub_release_default_address(hc);
    343         opResult = usb_hc_release_default_address(&hub->connection);
     315                usb_hub_release_default_address(hc);
     316                return;
     317        }
     318
     319
     320        opResult = usb_hub_release_default_address(hc);
    344321        if(opResult!=EOK){
    345322                return;
    346323        }
    347324
     325        devman_handle_t hc_handle;
     326        opResult = usb_drv_find_hc(hub->device, &hc_handle);
     327        if (opResult != EOK) {
     328                usb_log_error("Failed to get handle of host controller: %s.\n",
     329                    str_error(opResult));
     330                return;
     331        }
     332
    348333        devman_handle_t child_handle;
    349         //??
    350     opResult = usb_device_register_child_in_devman(new_device_address,
    351             hub->connection.hc_handle, hub->device, &child_handle);
    352 
     334        opResult = usb_device_register_child_in_devman(new_device_address,
     335            hc_handle, hub->device, &child_handle);
    353336        if (opResult != EOK) {
    354337                dprintf(USB_LOG_LEVEL_ERROR, "could not start driver for new device");
    355338                return;
    356339        }
    357         hub->attached_devs[port].handle = child_handle;
     340        hub->attached_devs[port].devman_handle = child_handle;
    358341        hub->attached_devs[port].address = new_device_address;
    359342
    360         //opResult = usb_drv_bind_address(hc, new_device_address, child_handle);
    361         opResult = usb_hc_register_device(
    362                         &hub->connection,
    363                         &hub->attached_devs[port]);
     343        opResult = usb_drv_bind_address(hc, new_device_address, child_handle);
    364344        if (opResult != EOK) {
    365345                dprintf(USB_LOG_LEVEL_ERROR, "could not assign address of device in hcd");
     
    378358 */
    379359static void usb_hub_removed_device(
    380     usb_hub_info_t * hub,uint16_t port) {
     360    usb_hub_info_t * hub, int hc, uint16_t port, usb_target_t target) {
    381361        //usb_device_request_setup_packet_t request;
    382362        int opResult;
     
    385365         * devide manager
    386366         */
    387        
     367
     368        hub->attached_devs[port].devman_handle=0;
    388369        //close address
    389370        if(hub->attached_devs[port].address!=0){
    390                 //opResult = usb_drv_release_address(hc,hub->attached_devs[port].address);
    391                 opResult = usb_hc_unregister_device(
    392                                 &hub->connection, hub->attached_devs[port].address);
     371                opResult = usb_drv_release_address(hc,hub->attached_devs[port].address);
    393372                if(opResult != EOK) {
    394373                        dprintf(USB_LOG_LEVEL_WARNING, "could not release address of " \
     
    396375                }
    397376                hub->attached_devs[port].address = 0;
    398                 hub->attached_devs[port].handle = 0;
    399377        }else{
    400378                dprintf(USB_LOG_LEVEL_WARNING, "this is strange, disconnected device had no address");
    401379                //device was disconnected before it`s port was reset - return default address
    402                 //usb_drv_release_default_address(hc);
    403                 usb_hc_release_default_address(&hub->connection);
     380                usb_drv_release_default_address(hc);
    404381        }
    405382}
     
    411388 * @param target
    412389 */
    413 static void usb_hub_process_interrupt(usb_hub_info_t * hub,
    414         uint16_t port) {
     390static void usb_hub_process_interrupt(usb_hub_info_t * hub, int hc,
     391        uint16_t port, usb_address_t address) {
    415392        dprintf(USB_LOG_LEVEL_DEBUG, "interrupt at port %d", port);
    416393        //determine type of change
    417         usb_endpoint_pipe_t *pipe = &hub->endpoints.control;
    418         int opResult = usb_endpoint_pipe_start_session(pipe);
    419        
    420         if(opResult != EOK){
    421                 dprintf(USB_LOG_LEVEL_ERROR, "cannot open pipe %d", opResult);
    422         }
    423 
    424         /*
    425394        usb_target_t target;
    426395        target.address=address;
    427396        target.endpoint=0;
    428         */
    429 
    430397        usb_port_status_t status;
    431398        size_t rcvd_size;
    432399        usb_device_request_setup_packet_t request;
    433         //int opResult;
     400        int opResult;
    434401        usb_hub_set_port_status_request(&request, port);
    435402        //endpoint 0
    436403
    437         opResult = usb_endpoint_pipe_control_read(
    438                         pipe,
    439                         &request, sizeof(usb_device_request_setup_packet_t),
     404        opResult = usb_drv_sync_control_read(
     405                        hc, target,
     406                        &request,
    440407                        &status, 4, &rcvd_size
    441408                        );
     
    450417        //something connected/disconnected
    451418        if (usb_port_connect_change(&status)) {
    452                 opResult = usb_hub_clear_port_feature(pipe,
     419                opResult = usb_hub_clear_port_feature(hc, target.address,
    453420                    port, USB_HUB_FEATURE_C_PORT_CONNECTION);
    454421                // TODO: check opResult
    455422                if (usb_port_dev_connected(&status)) {
    456423                        dprintf(USB_LOG_LEVEL_INFO, "some connection changed");
    457                         usb_hub_init_add_device(hub, port);
     424                        usb_hub_init_add_device(hc, port, target);
    458425                } else {
    459                         usb_hub_removed_device(hub, port);
     426                        usb_hub_removed_device(hub, hc, port, target);
    460427                }
    461428        }
     
    464431                dprintf(USB_LOG_LEVEL_INFO, "port reset complete");
    465432                if (usb_port_enabled(&status)) {
    466                         usb_hub_finalize_add_device(hub, port);
     433                        usb_hub_finalize_add_device(hub, hc, port, target);
    467434                } else {
    468435                        dprintf(USB_LOG_LEVEL_WARNING, "ERROR: port reset, but port still not enabled");
     
    480447        /// \TODO handle other changes
    481448        /// \TODO debug log for various situations
    482         usb_endpoint_pipe_end_session(pipe);
    483 
    484449
    485450}
     
    499464                fibril_mutex_unlock(&usb_hub_list_lock);
    500465                usb_hub_info_t * hub_info = ((usb_hub_info_t*)lst_item->data);
    501                 int opResult;
    502 
    503                 opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.status_change);
    504                 if(opResult != EOK){
    505                         continue;
    506                 }
    507466                /*
    508467                 * Check status change pipe of this hub.
    509468                 */
    510                 /*
     469
    511470                usb_target_t target;
    512471                target.address = hub_info->address;
     
    514473                dprintf(USB_LOG_LEVEL_INFO, "checking changes for hub at addr %d",
    515474                    target.address);
    516                 */
     475
    517476                size_t port_count = hub_info->port_count;
    518477
    519478                /*
    520479                 * Connect to respective HC.
    521                  *
     480                 */
    522481                int hc = usb_drv_hc_connect_auto(hub_info->device, 0);
    523482                if (hc < 0) {
    524483                        continue;
    525                 }*/
     484                }
    526485
    527486                /// FIXME: count properly
     
    530489                void *change_bitmap = malloc(byte_length);
    531490                size_t actual_size;
    532                 //usb_handle_t handle;
     491                usb_handle_t handle;
    533492
    534493                /*
    535494                 * Send the request.
    536495                 */
    537                 opResult = usb_endpoint_pipe_read(
    538                                 &hub_info->endpoints.status_change,
    539                                 change_bitmap, byte_length, &actual_size
    540                                 );
    541 
    542                 //usb_drv_async_wait_for(handle);
     496                int opResult = usb_drv_async_interrupt_in(hc, target,
     497                                change_bitmap, byte_length, &actual_size,
     498                                &handle);
     499
     500                usb_drv_async_wait_for(handle);
    543501
    544502                if (opResult != EOK) {
     
    553511                        if (interrupt) {
    554512                                usb_hub_process_interrupt(
    555                                         hub_info, port);
     513                                        hub_info, hc, port, hub_info->address);
    556514                        }
    557515                }
    558                 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    559516                free(change_bitmap);
    560                
    561 
    562                 //async_hangup(hc);
     517
     518                async_hangup(hc);
    563519                fibril_mutex_lock(&usb_hub_list_lock);
    564520        }
Note: See TracChangeset for help on using the changeset viewer.