Changeset 79e1abd in mainline for uspace/drv/usbhub/usbhub.c


Ignore:
Timestamp:
2011-03-29T12:09:15Z (14 years ago)
Author:
Matej Klonfar <maklf@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d012590
Parents:
841e6e5 (diff), 51e5608 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

development merge - mainline changes

File:
1 edited

Legend:

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

    r841e6e5 r79e1abd  
    5353#include "usb/classes/classes.h"
    5454
     55
     56static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port,
     57                usb_speed_t speed);
     58
     59static int usb_hub_trigger_connecting_non_removable_devices(
     60                usb_hub_info_t * hub, usb_hub_descriptor_t * descriptor);
     61
     62/**
     63 * control loop running in hub`s fibril
     64 *
     65 * Hub`s fibril periodically asks for changes on hub and if needded calls
     66 * change handling routine.
     67 * @warning currently hub driver asks for changes once a second
     68 * @param hub_info_param hub representation pointer
     69 * @return zero
     70 */
    5571int usb_hub_control_loop(void * hub_info_param){
    5672        usb_hub_info_t * hub_info = (usb_hub_info_t*)hub_info_param;
     
    91107
    92108/**
    93  * Load hub-specific information into hub_info structure.
     109 * Load hub-specific information into hub_info structure and process if needed
    94110 *
    95111 * Particularly read port count and initialize structure holding port
    96  * information.
     112 * information. If there are non-removable devices, start initializing them.
    97113 * This function is hub-specific and should be run only after the hub is
    98114 * configured using usb_hub_set_configuration function.
    99  * @param hub_info pointer to structure with usb hub data
     115 * @param hub_info hub representation
    100116 * @return error code
    101117 */
    102 static int usb_hub_get_hub_specific_info(usb_hub_info_t * hub_info){
     118static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info){
    103119        // get hub descriptor
    104120        usb_log_debug("creating serialized descriptor\n");
     
    107123
    108124        /* this was one fix of some bug, should not be needed anymore
     125         * these lines allow to reset hub once more, it can be used as
     126         * brute-force initialization for non-removable devices
    109127        int opResult = usb_request_set_configuration(&result->endpoints.control, 1);
    110128        if(opResult!=EOK){
     
    141159                hub_info->attached_devs[i].address=0;
    142160        }
     161        //handle non-removable devices
     162        usb_hub_trigger_connecting_non_removable_devices(hub_info, descriptor);
    143163        usb_log_debug2("freeing data\n");
    144164        free(serialized_descriptor);
     
    152172 * Check whether there is at least one configuration and sets the first one.
    153173 * This function should be run prior to running any hub-specific action.
    154  * @param hub_info
    155  * @return
     174 * @param hub_info hub representation
     175 * @return error code
    156176 */
    157177static int usb_hub_set_configuration(usb_hub_info_t * hub_info){
     
    162182            std_descriptor->configuration_count);
    163183        if(std_descriptor->configuration_count<1){
    164                 usb_log_error("THERE ARE NO CONFIGURATIONS AVAILABLE\n");
    165                 //shouldn`t I return?
    166                 //definitely
     184                usb_log_error("there are no configurations available\n");
    167185                return EINVAL;
    168186        }
     
    220238        }
    221239        //get port count and create attached_devs
    222         opResult = usb_hub_get_hub_specific_info(hub_info);
     240        opResult = usb_hub_process_hub_specific_info(hub_info);
    223241        if(opResult!=EOK){
    224242                usb_log_error("could not set hub configuration, errno %d\n",opResult);
     
    258276//*********************************************
    259277//
    260 //  hub driver code, main loop
     278//  hub driver code, main loop and port handling
    261279//
    262280//*********************************************
     281
     282/**
     283 * triggers actions to connect non0removable devices
     284 *
     285 * This will trigger operations leading to activated non-removable device.
     286 * Control pipe of the hub must be open fo communication.
     287 * @param hub hub representation
     288 * @param descriptor usb hub descriptor
     289 * @return error code
     290 */
     291static int usb_hub_trigger_connecting_non_removable_devices(usb_hub_info_t * hub,
     292                usb_hub_descriptor_t * descriptor)
     293{
     294        usb_log_info("attaching non-removable devices(if any)\n");
     295        usb_device_request_setup_packet_t request;
     296        int opResult;
     297        size_t rcvd_size;
     298        usb_port_status_t status;
     299        uint8_t * non_removable_dev_bitmap = descriptor->devices_removable;
     300        int port;
     301        for(port=1;port<=descriptor->ports_count;++port){
     302                bool is_non_removable =
     303                                ((non_removable_dev_bitmap[port/8]) >> (port%8)) %2;
     304                if(is_non_removable){
     305                        usb_log_debug("non-removable device on port %d\n",port);
     306                        usb_hub_set_port_status_request(&request, port);
     307                        opResult = usb_pipe_control_read(
     308                                        hub->control_pipe,
     309                                        &request, sizeof(usb_device_request_setup_packet_t),
     310                                        &status, 4, &rcvd_size
     311                                        );
     312                        if (opResult != EOK) {
     313                                usb_log_error("could not get port status of port %d errno:%d\n",
     314                                                port, opResult);
     315                                return opResult;
     316                        }
     317                        //set the status change bit, so it will be noticed in driver loop
     318                        if(usb_port_dev_connected(&status)){
     319                                usb_hub_set_enable_port_feature_request(&request, port,
     320                                                USB_HUB_FEATURE_C_PORT_CONNECTION);
     321                                opResult = usb_pipe_control_read(
     322                                                hub->control_pipe,
     323                                                &request, sizeof(usb_device_request_setup_packet_t),
     324                                                &status, 4, &rcvd_size
     325                                                );
     326                                if (opResult != EOK) {
     327                                        usb_log_warning(
     328                                                        "could not set port change on port %d errno:%d\n",
     329                                                        port, opResult);
     330                                }
     331                        }
     332                }
     333        }
     334        return EOK;
     335}
     336
    263337
    264338/**
     
    282356/**
    283357 * Reset the port with new device and reserve the default address.
    284  * @param hc
    285  * @param port
    286  * @param target
     358 * @param hub hub representation
     359 * @param port port number, starting from 1
     360 * @param speed transfer speed of attached device, one of low, full or high
    287361 */
    288362static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port,
     
    317391        if (opResult != EOK) {
    318392                usb_log_error("something went wrong when reseting a port %d\n",opResult);
    319                 //usb_hub_release_default_address(hc);
    320393                usb_hub_release_default_address(hub);
    321394        }
     
    325398/**
    326399 * Finalize adding new device after port reset
    327  * @param hc
    328  * @param port
    329  * @param target
     400 *
     401 * Set device`s address and start it`s driver.
     402 * @param hub hub representation
     403 * @param port port number, starting from 1
     404 * @param speed transfer speed of attached device, one of low, full or high
    330405 */
    331406static void usb_hub_finalize_add_device( usb_hub_info_t * hub,
     
    377452        }
    378453
    379 
    380454        //opResult = usb_hub_release_default_address(hc);
    381455        opResult = usb_hub_release_default_address(hub);
     
    412486
    413487/**
    414  * Unregister device address in hc
    415  * @param hc
    416  * @param port
    417  * @param target
     488 * routine called when a device on port has been removed
     489 *
     490 * If the device on port had default address, it releases default address.
     491 * Otherwise does not do anything, because DDF does not allow to remove device
     492 * from it`s device tree.
     493 * @param hub hub representation
     494 * @param port port number, starting from 1
    418495 */
    419496static void usb_hub_removed_device(
     
    454531 * Turn off the power on the port.
    455532 *
    456  * @param hub
    457  * @param port
     533 * @param hub hub representation
     534 * @param port port number, starting from 1
    458535 */
    459536static void usb_hub_over_current( usb_hub_info_t * hub,
     
    470547/**
    471548 * Process interrupts on given hub port
    472  * @param hc
    473  * @param port
    474  * @param target
     549 *
     550 * Accepts connection, over current and port reset change.
     551 * @param hub hub representation
     552 * @param port port number, starting from 1
    475553 */
    476554static void usb_hub_process_interrupt(usb_hub_info_t * hub,
     
    543621
    544622/**
    545  * Check changes on particular hub
    546  * @param hub_info_param pointer to usb_hub_info_t structure
    547  * @return error code if there is problem when initializing communication with
    548  * hub, EOK otherwise
     623 * check changes on hub
     624 *
     625 * Handles changes on each port with a status change.
     626 * @param hub_info hub representation
     627 * @return error code
    549628 */
    550629int usb_hub_check_hub_changes(usb_hub_info_t * hub_info){
Note: See TracChangeset for help on using the changeset viewer.