Ignore:
File:
1 edited

Legend:

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

    r1dc4a5e r5203e256  
    131131        opResult = ddf_fun_bind(hub_fun);
    132132        assert(opResult == EOK);
    133         opResult = ddf_fun_add_to_category(hub_fun, "hub");
     133        opResult = ddf_fun_add_to_class(hub_fun, "hub");
    134134        assert(opResult == EOK);
    135135
     
    220220 * @return error code
    221221 */
    222 int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info)
    223 {
     222static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) {
    224223        // get hub descriptor
    225         usb_log_debug("Retrieving descriptor\n");
     224        usb_log_debug("Creating serialized descriptor\n");
    226225        uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE];
     226        usb_hub_descriptor_t * descriptor;
    227227        int opResult;
    228228
     
    234234
    235235        if (opResult != EOK) {
    236                 usb_log_error("Failed to receive hub descriptor: %s.\n",
    237                     str_error(opResult));
     236                usb_log_error("Failed when receiving hub descriptor, "
     237                    "%s\n",
     238                    str_error(opResult));
     239                free(serialized_descriptor);
    238240                return opResult;
    239241        }
    240         usb_log_debug2("Parsing descriptor\n");
    241         usb_hub_descriptor_t descriptor;
    242         opResult = usb_deserialize_hub_desriptor(
    243                 serialized_descriptor, received_size, &descriptor);
    244         if (opResult != EOK) {
    245                 usb_log_error("Could not parse descriptor: %s\n",
    246                     str_error(opResult));
    247                 return opResult;
    248         }
    249         usb_log_debug("Setting port count to %d.\n", descriptor.ports_count);
    250         hub_info->port_count = descriptor.ports_count;
    251 
    252         hub_info->ports =
    253             malloc(sizeof(usb_hub_port_t) * (hub_info->port_count + 1));
     242        usb_log_debug2("Deserializing descriptor\n");
     243        descriptor = usb_create_deserialized_hub_desriptor(
     244            serialized_descriptor);
     245        if (descriptor == NULL) {
     246                usb_log_warning("could not deserialize descriptor \n");
     247                return ENOMEM;
     248        }
     249        usb_log_debug("setting port count to %d\n", descriptor->ports_count);
     250        hub_info->port_count = descriptor->ports_count;
     251        bool is_power_switched =
     252            ((descriptor->hub_characteristics & 1) == 0);
     253        bool has_individual_port_powering =
     254            ((descriptor->hub_characteristics & 1) != 0);
     255        hub_info->ports = malloc(
     256            sizeof (usb_hub_port_t) * (hub_info->port_count + 1));
    254257        if (!hub_info->ports) {
    255258                return ENOMEM;
    256259        }
    257 
    258260        size_t port;
    259261        for (port = 0; port < hub_info->port_count + 1; ++port) {
    260262                usb_hub_port_init(&hub_info->ports[port]);
    261263        }
    262 
    263         const bool is_power_switched =
    264             !(descriptor.hub_characteristics & HUB_CHAR_NO_POWER_SWITCH_FLAG);
    265264        if (is_power_switched) {
    266265                usb_log_debug("Hub power switched\n");
    267                 const bool per_port_power = descriptor.hub_characteristics
    268                     & HUB_CHAR_POWER_PER_PORT_FLAG;
     266
     267                if (!has_individual_port_powering) {
     268                        //this setting actually makes no difference
     269                        usb_log_debug("Hub has global powering\n");
     270                }
    269271
    270272                for (port = 1; port <= hub_info->port_count; ++port) {
    271273                        usb_log_debug("Powering port %zu.\n", port);
    272                         opResult = usb_hub_set_port_feature(
    273                             hub_info->control_pipe,
     274                        opResult = usb_hub_set_port_feature(hub_info->control_pipe,
    274275                            port, USB_HUB_FEATURE_PORT_POWER);
    275276                        if (opResult != EOK) {
    276277                                usb_log_error("Cannot power on port %zu: %s.\n",
    277278                                    port, str_error(opResult));
    278                         } else {
    279                                 if (!per_port_power) {
    280                                         usb_log_debug(
    281                                             "Ganged power switching mode, "
    282                                             "one port is enough.\n");
    283                                         break;
    284                                 }
    285279                        }
    286280                }
     
    289283                usb_log_debug("Power not switched, not going to be powered\n");
    290284        }
     285        usb_log_debug2("Freeing data\n");
     286        free(descriptor);
    291287        return EOK;
    292288}
Note: See TracChangeset for help on using the changeset viewer.