Changes in uspace/drv/bus/usb/usbhub/usbhub.c [0918382f:3e6a98c5] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhub/usbhub.c
r0918382f r3e6a98c5 45 45 #include <usb/dev/pipes.h> 46 46 #include <usb/classes/classes.h> 47 #include <usb/ddfiface.h> 47 48 #include <usb/descriptor.h> 48 49 #include <usb/dev/recognise.h> … … 56 57 57 58 #define HUB_FNC_NAME "hub" 58 /** Hub status-change endpoint description.59 *60 * For more information see section 11.15.1 of USB 1.1 specification.61 */62 const usb_endpoint_description_t hub_status_change_endpoint_description =63 {64 .transfer_type = USB_TRANSFER_INTERRUPT,65 .direction = USB_DIRECTION_IN,66 .interface_class = USB_CLASS_HUB,67 .interface_subclass = 0,68 .interface_protocol = 0,69 .flags = 070 };71 59 72 60 /** Standard get hub global status request */ … … 111 99 fibril_condvar_initialize(&hub_dev->pending_ops_cv); 112 100 101 102 int opResult = usb_pipe_start_long_transfer(&usb_dev->ctrl_pipe); 103 if (opResult != EOK) { 104 usb_log_error("Failed to start long ctrl pipe transfer: %s\n", 105 str_error(opResult)); 106 return opResult; 107 } 108 113 109 /* Set hub's first configuration. (There should be only one) */ 114 int opResult = usb_set_first_configuration(usb_dev); 115 if (opResult != EOK) { 110 opResult = usb_set_first_configuration(usb_dev); 111 if (opResult != EOK) { 112 usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe); 116 113 usb_log_error("Could not set hub configuration: %s\n", 117 114 str_error(opResult)); … … 122 119 opResult = usb_hub_process_hub_specific_info(hub_dev); 123 120 if (opResult != EOK) { 121 usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe); 124 122 usb_log_error("Could process hub specific info, %s\n", 125 123 str_error(opResult)); … … 129 127 /* Create hub control function. */ 130 128 usb_log_debug("Creating DDF function '" HUB_FNC_NAME "'.\n"); 131 hub_dev->hub_fun = usb_device_ddf_fun_create(hub_dev->usb_device,129 hub_dev->hub_fun = ddf_fun_create(hub_dev->usb_device->ddf_dev, 132 130 fun_exposed, HUB_FNC_NAME); 133 131 if (hub_dev->hub_fun == NULL) { 132 usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe); 134 133 usb_log_error("Failed to create hub function.\n"); 135 134 return ENOMEM; … … 139 138 opResult = ddf_fun_bind(hub_dev->hub_fun); 140 139 if (opResult != EOK) { 140 usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe); 141 141 usb_log_error("Failed to bind hub function: %s.\n", 142 142 str_error(opResult)); … … 146 146 147 147 /* Start hub operation. */ 148 opResult = usb_device_auto_poll _desc(hub_dev->usb_device,149 &hub_status_change_endpoint_description,150 hub_port_changes_callback, ((hub_dev->port_count + 1 + 7) / 8),151 -1, usb_hub_polling_terminated_callback, hub_dev);152 if (opResult != EOK) {148 opResult = usb_device_auto_poll(hub_dev->usb_device, 0, 149 hub_port_changes_callback, ((hub_dev->port_count + 1 + 8) / 8), 150 usb_hub_polling_terminated_callback, hub_dev); 151 if (opResult != EOK) { 152 usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe); 153 153 /* Function is already bound */ 154 154 ddf_fun_unbind(hub_dev->hub_fun); … … 160 160 hub_dev->running = true; 161 161 usb_log_info("Controlling hub '%s' (%zu ports).\n", 162 usb_device_get_name(hub_dev->usb_device), hub_dev->port_count); 163 162 ddf_dev_get_name(hub_dev->usb_device->ddf_dev), hub_dev->port_count); 163 164 usb_pipe_end_long_transfer(&usb_dev->ctrl_pipe); 164 165 return EOK; 165 166 } … … 184 185 { 185 186 assert(usb_dev); 186 usb_hub_dev_t *hub = usb_dev ice_data_get(usb_dev);187 usb_hub_dev_t *hub = usb_dev->driver_data; 187 188 assert(hub); 188 189 unsigned tries = 10; … … 198 199 199 200 for (size_t port = 0; port < hub->port_count; ++port) { 200 const int ret = usb_hub_port_fini(&hub->ports[port], hub); 201 if (ret != EOK) 202 return ret; 201 if (hub->ports[port].attached_device.fun) { 202 const int ret = 203 usb_hub_port_fini(&hub->ports[port], hub); 204 if (ret != EOK) 205 return ret; 206 } 203 207 } 204 208 free(hub->ports); … … 243 247 244 248 /* N + 1 bit indicates change on port N */ 245 for (size_t port = 0; port < hub->port_count ; ++port) {249 for (size_t port = 0; port < hub->port_count + 1; port++) { 246 250 const size_t bit = port + 1; 247 251 const bool change = (change_bitmap[bit / 8] >> (bit % 8)) & 1; … … 269 273 /* Get hub descriptor. */ 270 274 usb_log_debug("Retrieving descriptor\n"); 271 usb_pipe_t *control_pipe = 272 usb_device_get_default_pipe(hub_dev->usb_device); 275 usb_pipe_t *control_pipe = &hub_dev->usb_device->ctrl_pipe; 273 276 274 277 usb_hub_descriptor_header_t descriptor; … … 308 311 } 309 312 310 usb_log_info("Hub port power switching enabled (%s).\n", 311 hub_dev->per_port_power ? "per port" : "ganged"); 313 usb_log_info("Hub port power switching enabled.\n"); 312 314 313 315 for (size_t port = 0; port < hub_dev->port_count; ++port) { … … 317 319 318 320 if (ret != EOK) { 319 usb_log_error("Cannot power on port % u: %s.\n",321 usb_log_error("Cannot power on port %zu: %s.\n", 320 322 hub_dev->ports[port].port_number, str_error(ret)); 321 323 } else { … … 343 345 /* Get number of possible configurations from device descriptor */ 344 346 const size_t configuration_count = 345 usb_device _descriptors(usb_device)->device.configuration_count;347 usb_device->descriptors.device.configuration_count; 346 348 usb_log_debug("Hub has %zu configurations.\n", configuration_count); 347 349 … … 351 353 } 352 354 353 // TODO: Make sure that the cast is correct 354 const size_t config_size = 355 usb_device_descriptors(usb_device)->full_config_size; 356 const usb_standard_configuration_descriptor_t *config_descriptor = 357 usb_device_descriptors(usb_device)->full_config; 358 359 if (config_size < sizeof(usb_standard_configuration_descriptor_t)) { 355 if (usb_device->descriptors.configuration_size 356 < sizeof(usb_standard_configuration_descriptor_t)) { 360 357 usb_log_error("Configuration descriptor is not big enough" 361 358 " to fit standard configuration descriptor.\n"); … … 363 360 } 364 361 362 // TODO: Make sure that the cast is correct 363 usb_standard_configuration_descriptor_t *config_descriptor 364 = (usb_standard_configuration_descriptor_t *) 365 usb_device->descriptors.configuration; 366 365 367 /* Set configuration. Use the configuration that was in 366 368 * usb_device->descriptors.configuration i.e. The first one. */ 367 369 const int opResult = usb_request_set_configuration( 368 usb_device_get_default_pipe(usb_device), 369 config_descriptor->configuration_number); 370 &usb_device->ctrl_pipe, config_descriptor->configuration_number); 370 371 if (opResult != EOK) { 371 372 usb_log_error("Failed to set hub configuration: %s.\n", … … 406 407 if (ret != EOK) { 407 408 usb_log_warning("HUB OVER-CURRENT GONE: Cannot power on" 408 " port % u: %s\n", hub_dev->ports[port].port_number,409 " port %zu: %s\n", hub_dev->ports[port].port_number, 409 410 str_error(ret)); 410 411 } else { … … 427 428 assert(hub_dev->usb_device); 428 429 usb_log_debug("Global interrupt on a hub\n"); 429 usb_pipe_t *control_pipe = 430 usb_device_get_default_pipe(hub_dev->usb_device); 430 usb_pipe_t *control_pipe = &hub_dev->usb_device->ctrl_pipe; 431 431 432 432 usb_hub_status_t status; … … 452 452 /* Ack change in hub OC flag */ 453 453 const int ret = usb_request_clear_feature( 454 control_pipe, USB_REQUEST_TYPE_CLASS,454 &hub_dev->usb_device->ctrl_pipe, USB_REQUEST_TYPE_CLASS, 455 455 USB_REQUEST_RECIPIENT_DEVICE, 456 456 USB_HUB_FEATURE_C_HUB_OVER_CURRENT, 0);
Note:
See TracChangeset
for help on using the changeset viewer.