Changes in uspace/drv/bus/usb/usbhub/usbhub.c [1dc4a5e:5203e256] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhub/usbhub.c
r1dc4a5e r5203e256 131 131 opResult = ddf_fun_bind(hub_fun); 132 132 assert(opResult == EOK); 133 opResult = ddf_fun_add_to_c ategory(hub_fun, "hub");133 opResult = ddf_fun_add_to_class(hub_fun, "hub"); 134 134 assert(opResult == EOK); 135 135 … … 220 220 * @return error code 221 221 */ 222 int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) 223 { 222 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) { 224 223 // get hub descriptor 225 usb_log_debug(" Retrievingdescriptor\n");224 usb_log_debug("Creating serialized descriptor\n"); 226 225 uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE]; 226 usb_hub_descriptor_t * descriptor; 227 227 int opResult; 228 228 … … 234 234 235 235 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); 238 240 return opResult; 239 241 } 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)); 254 257 if (!hub_info->ports) { 255 258 return ENOMEM; 256 259 } 257 258 260 size_t port; 259 261 for (port = 0; port < hub_info->port_count + 1; ++port) { 260 262 usb_hub_port_init(&hub_info->ports[port]); 261 263 } 262 263 const bool is_power_switched =264 !(descriptor.hub_characteristics & HUB_CHAR_NO_POWER_SWITCH_FLAG);265 264 if (is_power_switched) { 266 265 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 } 269 271 270 272 for (port = 1; port <= hub_info->port_count; ++port) { 271 273 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, 274 275 port, USB_HUB_FEATURE_PORT_POWER); 275 276 if (opResult != EOK) { 276 277 usb_log_error("Cannot power on port %zu: %s.\n", 277 278 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 }285 279 } 286 280 } … … 289 283 usb_log_debug("Power not switched, not going to be powered\n"); 290 284 } 285 usb_log_debug2("Freeing data\n"); 286 free(descriptor); 291 287 return EOK; 292 288 }
Note:
See TracChangeset
for help on using the changeset viewer.