Changes in / [151293d:4166fb1] in mainline
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r151293d r4166fb1 570 570 571 571 % USB release build (less logging) 572 ! CONFIG_USB_RELEASE_BUILD ( n/y)572 ! CONFIG_USB_RELEASE_BUILD (y/n) 573 573 574 574 % Start virtual USB host controller … … 576 576 577 577 % Polling UHCI & OHCI (no interrupts) 578 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS ( y/n)578 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS (n/y) 579 579 580 580 % Run devman in kconsole (not recommended) -
uspace/drv/usbhid/generic/hiddev.c
r151293d r4166fb1 99 99 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data; 100 100 101 usb_log_debug2("hid_dev: %p, Max input report size (% d).\n",101 usb_log_debug2("hid_dev: %p, Max input report size (%zu).\n", 102 102 hid_dev, hid_dev->max_input_report_size); 103 103 … … 226 226 } 227 227 228 usb_log_debug("HID function created. Handle: % d\n", fun->handle);228 usb_log_debug("HID function created. Handle: %" PRIun "\n", fun->handle); 229 229 230 230 return EOK; -
uspace/drv/usbhid/kbd/kbddev.c
r151293d r4166fb1 798 798 } 799 799 800 usb_log_debug("%s function created. Handle: % d\n", HID_KBD_FUN_NAME,801 fun->handle);800 usb_log_debug("%s function created. Handle: %" PRIun "\n", 801 HID_KBD_FUN_NAME, fun->handle); 802 802 803 803 usb_log_debug("Adding DDF function to class %s...\n", -
uspace/drv/usbhid/multimedia/multimedia.c
r151293d r4166fb1 211 211 } 212 212 213 usb_log_debug("%s function created. Handle: %d\n", NAME, fun->handle); 213 usb_log_debug("%s function created (jandle: %" PRIun ").\n", 214 NAME, fun->handle); 214 215 215 216 rc = ddf_fun_add_to_class(fun, "keyboard"); -
uspace/drv/usbhub/ports.c
r151293d r4166fb1 202 202 203 203 //close address 204 if(hub->ports[port].attached_device.address >= 0){ 205 /*uncomment this code to use it when DDF allows device removal 206 opResult = usb_hc_unregister_device( 207 &hub->connection, 208 hub->attached_devs[port].address); 209 if(opResult != EOK) { 210 dprintf(USB_LOG_LEVEL_WARNING, "could not release " 211 "address of " 212 "removed device: %d", opResult); 213 } 214 hub->attached_devs[port].address = 0; 215 hub->attached_devs[port].handle = 0; 216 */ 204 205 usb_hub_port_t *the_port = hub->ports + port; 206 207 fibril_mutex_lock(&hub->port_mutex); 208 209 if (the_port->attached_device.address >= 0) { 210 usb_log_warning("Device unplug on `%s' (port %zu): " \ 211 "not implemented.\n", hub->usb_device->ddf_dev->name, 212 (size_t) port); 213 the_port->attached_device.address = -1; 214 the_port->attached_device.handle = 0; 217 215 } else { 218 216 usb_log_warning("Device removed before being registered.\n"); … … 223 221 * port reset callback from new device wrapper. 224 222 */ 225 usb_hub_port_t *the_port = hub->ports + port;226 223 fibril_mutex_lock(&the_port->reset_mutex); 227 224 the_port->reset_completed = true; … … 230 227 fibril_mutex_unlock(&the_port->reset_mutex); 231 228 } 229 230 fibril_mutex_unlock(&hub->port_mutex); 232 231 } 233 232 … … 396 395 } 397 396 397 fibril_mutex_lock(&data->hub->port_mutex); 398 398 data->hub->ports[data->port].attached_device.handle = child_handle; 399 399 data->hub->ports[data->port].attached_device.address = new_address; 400 fibril_mutex_unlock(&data->hub->port_mutex); 400 401 401 402 usb_log_info("Detected new device on `%s' (port %zu), " … … 406 407 leave: 407 408 free(arg); 409 410 fibril_mutex_lock(&data->hub->pending_ops_mutex); 411 assert(data->hub->pending_ops_count > 0); 412 data->hub->pending_ops_count--; 413 fibril_condvar_signal(&data->hub->pending_ops_cv); 414 fibril_mutex_unlock(&data->hub->pending_ops_mutex); 415 408 416 409 417 return EOK; … … 452 460 return ENOMEM; 453 461 } 462 fibril_mutex_lock(&hub->pending_ops_mutex); 463 hub->pending_ops_count++; 464 fibril_mutex_unlock(&hub->pending_ops_mutex); 454 465 fibril_add_ready(fibril); 455 466 -
uspace/drv/usbhub/usbhub.c
r151293d r4166fb1 72 72 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info); 73 73 74 static void usb_hub_polling_termin ted_callback(usb_device_t * device,74 static void usb_hub_polling_terminated_callback(usb_device_t * device, 75 75 bool was_error, void * data); 76 76 … … 200 200 result->control_pipe = &usb_dev->ctrl_pipe; 201 201 result->is_default_address_used = false; 202 203 result->ports = NULL; 204 result->port_count = (size_t) -1; 205 fibril_mutex_initialize(&result->port_mutex); 206 207 fibril_mutex_initialize(&result->pending_ops_mutex); 208 fibril_condvar_initialize(&result->pending_ops_cv); 209 result->pending_ops_count = 0; 202 210 return result; 203 211 } … … 340 348 rc = usb_device_auto_poll(hub_info->usb_device, 0, 341 349 hub_port_changes_callback, ((hub_info->port_count + 1) / 8) + 1, 342 usb_hub_polling_termin ted_callback, hub_info);350 usb_hub_polling_terminated_callback, hub_info); 343 351 if (rc != EOK) { 344 352 usb_log_error("Failed to create polling fibril: %s.\n", … … 473 481 * @param data pointer to usb_hub_info_t structure 474 482 */ 475 static void usb_hub_polling_termin ted_callback(usb_device_t * device,483 static void usb_hub_polling_terminated_callback(usb_device_t * device, 476 484 bool was_error, void * data){ 477 usb_hub_info_t * hub_info = data; 478 if(!hub_info) return; 479 free(hub_info->ports); 480 free(hub_info); 485 usb_hub_info_t * hub = data; 486 assert(hub); 487 488 fibril_mutex_lock(&hub->pending_ops_mutex); 489 490 /* The device is dead. However there might be some pending operations 491 * that we need to wait for. 492 * One of them is device adding in progress. 493 * The respective fibril is probably waiting for status change 494 * in port reset (port enable) callback. 495 * Such change would never come (otherwise we would not be here). 496 * Thus, we would flush all pending port resets. 497 */ 498 if (hub->pending_ops_count > 0) { 499 fibril_mutex_lock(&hub->port_mutex); 500 size_t port; 501 for (port = 0; port < hub->port_count; port++) { 502 usb_hub_port_t *the_port = hub->ports + port; 503 fibril_mutex_lock(&the_port->reset_mutex); 504 the_port->reset_completed = true; 505 the_port->reset_okay = false; 506 fibril_condvar_broadcast(&the_port->reset_cv); 507 fibril_mutex_unlock(&the_port->reset_mutex); 508 } 509 fibril_mutex_unlock(&hub->port_mutex); 510 } 511 /* And now wait for them. */ 512 while (hub->pending_ops_count > 0) { 513 fibril_condvar_wait(&hub->pending_ops_cv, 514 &hub->pending_ops_mutex); 515 } 516 fibril_mutex_unlock(&hub->pending_ops_mutex); 517 518 free(hub->ports); 519 free(hub); 481 520 } 482 521 -
uspace/drv/usbhub/usbhub.h
r151293d r4166fb1 61 61 usb_hub_port_t *ports; 62 62 63 fibril_mutex_t port_mutex; 64 63 65 /** connection to hcd */ 64 66 usb_hc_connection_t connection; … … 89 91 /** generic usb device data*/ 90 92 usb_device_t * usb_device; 93 94 /** Number of pending operations on the mutex to prevent shooting 95 * ourselves in the foot. 96 * When the hub is disconnected but we are in the middle of some 97 * operation, we cannot destroy this structure right away because 98 * the pending operation might use it. 99 */ 100 size_t pending_ops_count; 101 /** Guard for pending_ops_count. */ 102 fibril_mutex_t pending_ops_mutex; 103 /** Condition variable for pending_ops_count. */ 104 fibril_condvar_t pending_ops_cv; 105 91 106 }; 92 107 -
uspace/lib/drv/generic/driver.c
r151293d r4166fb1 405 405 /* The interface has not such method */ 406 406 printf("%s: driver_connection_gen error - " 407 "invalid interface method (%d).\n", 407 "invalid interface method " 408 "(index %" PRIun ").\n", 408 409 driver->name, iface_method_idx); 409 410 async_answer_0(callid, ENOTSUP);
Note:
See TracChangeset
for help on using the changeset viewer.