Changeset e1dbcbc in mainline for uspace/drv/usbhub/usbhub.c


Ignore:
Timestamp:
2011-04-29T13:43:01Z (14 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a81a1d09
Parents:
380e0364 (diff), f19f1b7 (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:

Merge development/ changes

File:
1 edited

Legend:

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

    r380e0364 re1dbcbc  
    4545#include <usb/request.h>
    4646#include <usb/classes/hub.h>
     47#include <usb/devpoll.h>
    4748#include <stdio.h>
    4849
     
    7172static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info);
    7273
    73 
    74 /// \TODO malloc checking
    7574
    7675//*********************************************
     
    104103        }
    105104
    106         usb_pipe_start_session(hub_info->control_pipe);
    107105        //set hub configuration
    108106        opResult = usb_hub_set_configuration(hub_info);
     
    121119                return opResult;
    122120        }
    123         usb_pipe_end_session(hub_info->control_pipe);
    124 
    125         /// \TODO what is this?
    126         usb_log_debug("Creating `hub' function.\n");
     121
     122        usb_log_debug("Creating 'hub' function in DDF.\n");
    127123        ddf_fun_t *hub_fun = ddf_fun_create(hub_info->usb_device->ddf_dev,
    128124            fun_exposed, "hub");
     
    152148bool hub_port_changes_callback(usb_device_t *dev,
    153149    uint8_t *change_bitmap, size_t change_bitmap_size, void *arg) {
     150        usb_log_debug("hub_port_changes_callback\n");
    154151        usb_hub_info_t *hub = (usb_hub_info_t *) arg;
    155152
     
    174171leave:
    175172        /* FIXME: proper interval. */
    176         async_usleep(1000 * 1000 * 10);
     173        async_usleep(1000 * 250);
    177174
    178175        return true;
     
    216213        // get hub descriptor
    217214        usb_log_debug("creating serialized descriptor\n");
    218         void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE);
     215        uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE];
    219216        usb_hub_descriptor_t * descriptor;
    220217        int opResult;
     
    234231        }
    235232        usb_log_debug2("deserializing descriptor\n");
    236         descriptor = usb_deserialize_hub_desriptor(serialized_descriptor);
     233        descriptor = usb_create_deserialized_hub_desriptor(
     234            serialized_descriptor);
    237235        if (descriptor == NULL) {
    238236                usb_log_warning("could not deserialize descriptor \n");
    239                 return opResult;
     237                return ENOMEM;
    240238        }
    241239        usb_log_debug("setting port count to %d\n", descriptor->ports_count);
    242240        hub_info->port_count = descriptor->ports_count;
    243241        /// \TODO this is not semantically correct
     242        bool is_power_switched =
     243            ((descriptor->hub_characteristics & 1) ==0);
     244        bool has_individual_port_powering =
     245            ((descriptor->hub_characteristics & 1) !=0);
    244246        hub_info->ports = malloc(
    245247            sizeof (usb_hub_port_t) * (hub_info->port_count + 1));
     248        if(!hub_info->ports){
     249                return ENOMEM;
     250        }
    246251        size_t port;
    247         for (port = 0; port < hub_info->port_count + 1; port++) {
     252        for (port = 0; port < hub_info->port_count + 1; ++port) {
    248253                usb_hub_port_init(&hub_info->ports[port]);
    249254        }
     255        if(is_power_switched){
     256                usb_log_debug("is_power_switched\n");
     257               
     258                if(!has_individual_port_powering){
     259                        usb_log_debug("!has_individual_port_powering\n");
     260                        opResult = usb_hub_set_feature(hub_info->control_pipe,
     261                            USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
     262                        if (opResult != EOK) {
     263                                usb_log_error("cannot power hub: %s\n",
     264                                    str_error(opResult));
     265                        }
     266                }
     267
     268                for (port = 1; port <= hub_info->port_count; ++port) {
     269                        usb_log_debug("Powering port %zu.\n",port);
     270                        opResult = usb_hub_set_port_feature(hub_info->control_pipe,
     271                            port, USB_HUB_FEATURE_PORT_POWER);
     272                        if (opResult != EOK) {
     273                                usb_log_error("cannot power on port %zu: %s.\n",
     274                                    port, str_error(opResult));
     275                        }
     276                }
     277               
     278        }else{
     279                usb_log_debug("!is_power_switched, not going to be powered\n");
     280        }
    250281        usb_log_debug2("freeing data\n");
    251         free(serialized_descriptor);
    252         free(descriptor->devices_removable);
    253282        free(descriptor);
    254283        return EOK;
     
    312341         * auto destruction, this could work better.
    313342         */
    314         int rc = usb_pipe_start_session(hub_info->control_pipe);
     343        int rc = usb_hc_connection_open(&hub_info->connection);
    315344        if (rc != EOK) {
    316                 usb_log_error("Failed to start session on control pipe: %s.\n",
    317                     str_error(rc));
    318                 return rc;
    319         }
    320         rc = usb_hc_connection_open(&hub_info->connection);
    321         if (rc != EOK) {
    322                 usb_pipe_end_session(hub_info->control_pipe);
     345                //usb_pipe_end_session(hub_info->control_pipe);
    323346                usb_log_error("Failed to open connection to HC: %s.\n",
    324347                    str_error(rc));
     
    336359        }
    337360
    338         usb_log_info("Controlling hub `%s' (%d ports).\n",
     361        usb_log_info("Controlling hub `%s' (%zu ports).\n",
    339362            hub_info->usb_device->ddf_dev->name, hub_info->port_count);
    340363        return EOK;
     
    389412    usb_hub_status_t status) {
    390413        int opResult;
    391         if (usb_hub_is_status(status,USB_HUB_FEATURE_HUB_LOCAL_POWER)) {
     414        if (!usb_hub_is_status(status,USB_HUB_FEATURE_HUB_LOCAL_POWER)) {
    392415                //restart power on hub
    393416                opResult = usb_hub_set_feature(hub_info->control_pipe,
     
    399422        } else {//power reestablished on hub- restart ports
    400423                size_t port;
    401                 for (port = 0; port < hub_info->port_count; ++port) {
     424                for (port = 1; port <= hub_info->port_count; ++port) {
    402425                        opResult = usb_hub_set_port_feature(
    403426                            hub_info->control_pipe,
    404427                            port, USB_HUB_FEATURE_PORT_POWER);
    405428                        if (opResult != EOK) {
    406                                 usb_log_error("cannot power on port %d;  %d\n",
    407                                     port, opResult);
     429                                usb_log_error("Cannot power on port %zu: %s.\n",
     430                                    port, str_error(opResult));
    408431                        }
     432                }
     433                opResult = usb_hub_clear_feature(hub_info->control_pipe,
     434                    USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
     435                if (opResult != EOK) {
     436                        usb_log_error("cannnot clear hub power change flag: "
     437                            "%d\n",
     438                            opResult);
    409439                }
    410440        }
Note: See TracChangeset for help on using the changeset viewer.