Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset c1693dae in mainline


Ignore:
Timestamp:
2011-04-15T12:52:57Z (11 years ago)
Author:
Matus Dekanek <smekideki@…>
Branches:
lfn, master
Children:
9063484
Parents:
cd5b878
Message:

minor fixes and enhancements

Location:
uspace/drv/usbhub
Files:
3 edited

Legend:

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

    rcd5b878 rc1693dae  
    153153bool hub_port_changes_callback(usb_device_t *dev,
    154154    uint8_t *change_bitmap, size_t change_bitmap_size, void *arg) {
     155        usb_log_debug("hub_port_changes_callback\n");
    155156        usb_hub_info_t *hub = (usb_hub_info_t *) arg;
    156157
     
    217218        // get hub descriptor
    218219        usb_log_debug("creating serialized descriptor\n");
    219         void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE);
     220        //void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE);
     221        uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE];
    220222        usb_hub_descriptor_t * descriptor;
    221223        int opResult;
     
    239241        if (descriptor == NULL) {
    240242                usb_log_warning("could not deserialize descriptor \n");
    241                 return opResult;
     243                return ENOMEM;
    242244        }
    243245        usb_log_debug("setting port count to %d\n", descriptor->ports_count);
    244246        hub_info->port_count = descriptor->ports_count;
    245247        /// \TODO this is not semantically correct
     248        bool is_power_switched =
     249            ((descriptor->hub_characteristics & 1) ==0);
     250        bool has_individual_port_powering =
     251            ((descriptor->hub_characteristics & 1) !=0);
    246252        hub_info->ports = malloc(
    247253            sizeof (usb_hub_port_t) * (hub_info->port_count + 1));
     
    250256                usb_hub_port_init(&hub_info->ports[port]);
    251257        }
    252         for (port = 0; port < hub_info->port_count; port++) {
    253                 opResult = usb_hub_set_port_feature(hub_info->control_pipe,
    254                     port+1, USB_HUB_FEATURE_PORT_POWER);
    255                 if (opResult != EOK) {
    256                         usb_log_error("cannot power on port %d;  %d\n",
    257                             port+1, opResult);
    258                 }
     258        if(is_power_switched){
     259                usb_log_debug("is_power_switched\n");
     260                if(has_individual_port_powering){
     261                        usb_log_debug("has_individual_port_powering\n");
     262                        for (port = 0; port < hub_info->port_count; port++) {
     263                                opResult = usb_hub_set_port_feature(hub_info->control_pipe,
     264                                    port+1, USB_HUB_FEATURE_PORT_POWER);
     265                                if (opResult != EOK) {
     266                                        usb_log_error("cannot power on port %d;  %d\n",
     267                                            port+1, opResult);
     268                                }
     269                        }
     270                }else{
     271                        usb_log_debug("!has_individual_port_powering\n");
     272                        opResult = usb_hub_set_feature(hub_info->control_pipe,
     273                            USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
     274                        if (opResult != EOK) {
     275                                usb_log_error("cannot power hub;  %d\n",
     276                                  opResult);
     277                        }
     278                }
     279        }else{
     280                usb_log_debug("!is_power_switched\n");
    259281        }
    260282        usb_log_debug2("freeing data\n");
    261         free(serialized_descriptor);
     283        //free(serialized_descriptor);
    262284        //free(descriptor->devices_removable);
    263285        free(descriptor);
  • uspace/drv/usbhub/usbhub_private.h

    rcd5b878 rc1693dae  
    113113
    114114        usb_device_request_setup_packet_t clear_request = {
    115                 .request_type = USB_HUB_REQ_TYPE_CLEAR_PORT_FEATURE,
     115                .request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE,
    116116                .request = USB_DEVREQ_SET_FEATURE,
    117117                .length = 0,
  • uspace/drv/usbhub/utils.c

    rcd5b878 rc1693dae  
    7070        uint8_t * result = malloc(size);
    7171        //size
    72         usb_serialize_hub_descriptor(descriptor,result);
     72        if(result)
     73                usb_serialize_hub_descriptor(descriptor,result);
    7374        return result;
    7475}
Note: See TracChangeset for help on using the changeset viewer.