Changes in uspace/drv/bus/usb/vhc/connhost.c [02fc5c4:aa81adc] in mainline
- File:
-
- 1 edited
-
uspace/drv/bus/usb/vhc/connhost.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/vhc/connhost.c
r02fc5c4 raa81adc 57 57 * @return Error code. 58 58 */ 59 static int request_address(ddf_fun_t *fun, usb_address_t *address, bool strict, 60 usb_speed_t speed) 61 { 62 VHC_DATA(vhc, fun); 63 64 assert(address); 65 return usb_device_manager_request_address( 66 &vhc->dev_manager, address, strict, speed); 59 static int request_address(ddf_fun_t *fun, usb_speed_t speed, 60 usb_address_t *address) 61 { 62 VHC_DATA(vhc, fun); 63 64 usb_address_t addr = device_keeper_get_free_address(&vhc->dev_keeper, 65 USB_SPEED_HIGH); 66 if (addr < 0) { 67 return addr; 68 } 69 70 if (address != NULL) { 71 *address = addr; 72 } 73 74 return EOK; 67 75 } 68 76 … … 80 88 usb_log_debug("Binding handle %" PRIun " to address %d.\n", 81 89 handle, address); 82 usb_device_ manager_bind_address(&vhc->dev_manager, address, handle);90 usb_device_keeper_bind(&vhc->dev_keeper, address, handle); 83 91 84 92 return EOK; … … 96 104 { 97 105 VHC_DATA(vhc, fun); 98 return usb_device_manager_get_info_by_address( 99 &vhc->dev_manager, address, handle, NULL); 106 bool found = 107 usb_device_keeper_find_by_address(&vhc->dev_keeper, address, handle); 108 return found ? EOK : ENOENT; 100 109 } 101 110 … … 110 119 VHC_DATA(vhc, fun); 111 120 usb_log_debug("Releasing address %d...\n", address); 112 usb_device_ manager_release_address(&vhc->dev_manager, address);121 usb_device_keeper_release(&vhc->dev_keeper, address); 113 122 114 123 return ENOTSUP; … … 128 137 */ 129 138 static int register_endpoint(ddf_fun_t *fun, 130 usb_address_t address, usb_ endpoint_t endpoint,139 usb_address_t address, usb_speed_t speed, usb_endpoint_t endpoint, 131 140 usb_transfer_type_t transfer_type, usb_direction_t direction, 132 141 size_t max_packet_size, unsigned int interval) 133 142 { 134 VHC_DATA(vhc, fun); 135 136 return usb_endpoint_manager_add_ep(&vhc->ep_manager, 137 address, endpoint, direction, transfer_type, USB_SPEED_FULL, 1, 0, 138 NULL, NULL); 139 143 /* TODO: Use usb_endpoint_manager_add_ep */ 144 VHC_DATA(vhc, fun); 145 146 endpoint_t *ep = endpoint_get( 147 address, endpoint, direction, transfer_type, USB_SPEED_FULL, 1); 148 if (ep == NULL) { 149 return ENOMEM; 150 } 151 152 int rc = usb_endpoint_manager_register_ep(&vhc->ep_manager, ep, 1); 153 if (rc != EOK) { 154 endpoint_destroy(ep); 155 return rc; 156 } 157 158 return EOK; 140 159 } 141 160 … … 153 172 VHC_DATA(vhc, fun); 154 173 155 int rc = usb_endpoint_manager_remove_ep(&vhc->ep_manager, 156 address, endpoint, direction, NULL, NULL); 174 endpoint_t *ep = usb_endpoint_manager_get_ep(&vhc->ep_manager, 175 address, endpoint, direction, NULL); 176 if (ep == NULL) { 177 return ENOENT; 178 } 179 180 int rc = usb_endpoint_manager_unregister_ep(&vhc->ep_manager, 181 address, endpoint, direction); 157 182 158 183 return rc; 159 184 } 160 #if 0 185 161 186 /** Schedule interrupt out transfer. 162 187 * … … 388 413 return EOK; 389 414 } 390 #endif 391 static int usb_read(ddf_fun_t *fun, usb_target_t target, uint64_t setup_buffer, 392 uint8_t *data_buffer, size_t data_buffer_size, 393 usbhc_iface_transfer_in_callback_t callback, void *arg) 394 { 395 VHC_DATA(vhc, fun); 396 397 endpoint_t *ep = usb_endpoint_manager_find_ep(&vhc->ep_manager, 398 target.address, target.endpoint, USB_DIRECTION_IN); 399 if (ep == NULL) { 400 return ENOENT; 401 } 402 const usb_transfer_type_t transfer_type = ep->transfer_type; 403 404 405 vhc_transfer_t *transfer = vhc_transfer_create(target.address, 406 target.endpoint, USB_DIRECTION_IN, transfer_type, 407 fun, arg); 408 if (transfer == NULL) { 409 return ENOMEM; 410 } 411 if (transfer_type == USB_TRANSFER_CONTROL) { 412 transfer->setup_buffer = malloc(sizeof(uint64_t)); 413 assert(transfer->setup_buffer); 414 memcpy(transfer->setup_buffer, &setup_buffer, sizeof(uint64_t)); 415 transfer->setup_buffer_size = sizeof(uint64_t); 416 } 417 transfer->data_buffer = data_buffer; 418 transfer->data_buffer_size = data_buffer_size; 419 transfer->callback_in = callback; 420 421 int rc = vhc_virtdev_add_transfer(vhc, transfer); 422 if (rc != EOK) { 423 if (transfer->setup_buffer != NULL) { 424 free(transfer->setup_buffer); 425 } 426 free(transfer); 427 return rc; 428 } 429 430 return EOK; 431 } 432 433 static int usb_write(ddf_fun_t *fun, usb_target_t target, uint64_t setup_buffer, 434 const uint8_t *data_buffer, size_t data_buffer_size, 435 usbhc_iface_transfer_out_callback_t callback, void *arg) 436 { 437 VHC_DATA(vhc, fun); 438 439 endpoint_t *ep = usb_endpoint_manager_find_ep(&vhc->ep_manager, 440 target.address, target.endpoint, USB_DIRECTION_OUT); 441 if (ep == NULL) { 442 return ENOENT; 443 } 444 const usb_transfer_type_t transfer_type = ep->transfer_type; 445 446 447 vhc_transfer_t *transfer = vhc_transfer_create(target.address, 448 target.endpoint, USB_DIRECTION_OUT, transfer_type, 449 fun, arg); 450 if (transfer == NULL) { 451 return ENOMEM; 452 } 453 if (transfer_type == USB_TRANSFER_CONTROL) { 454 transfer->setup_buffer = malloc(sizeof(uint64_t)); 455 assert(transfer->setup_buffer); 456 memcpy(transfer->setup_buffer, &setup_buffer, sizeof(uint64_t)); 457 transfer->setup_buffer_size = sizeof(uint64_t); 458 } 459 transfer->data_buffer = (void*)data_buffer; 460 transfer->data_buffer_size = data_buffer_size; 461 transfer->callback_out = callback; 462 463 int rc = vhc_virtdev_add_transfer(vhc, transfer); 464 if (rc != EOK) { 465 free(transfer->setup_buffer); 466 free(transfer); 467 return rc; 468 } 469 470 return EOK; 471 } 472 473 static int tell_address(ddf_fun_t *fun, usb_address_t *address) 415 416 static int tell_address(ddf_fun_t *fun, devman_handle_t handle, 417 usb_address_t *address) 474 418 { 475 419 UNSUPPORTED("tell_address"); … … 488 432 } 489 433 490 static int tell_address_rh(ddf_fun_t *root_hub_fun, usb_address_t *address) 434 static int tell_address_rh(ddf_fun_t *root_hub_fun, devman_handle_t handle, 435 usb_address_t *address) 491 436 { 492 437 VHC_DATA(vhc, root_hub_fun); 493 438 494 devman_handle_t handle = root_hub_fun->handle; 439 if (handle == 0) { 440 handle = root_hub_fun->handle; 441 } 495 442 496 443 usb_log_debug("tell_address_rh(handle=%" PRIun ")\n", handle); 497 const usb_address_t addr = 498 usb_device_manager_find_address(&vhc->dev_manager, handle); 444 usb_address_t addr = usb_device_keeper_find(&vhc->dev_keeper, handle); 499 445 if (addr < 0) { 500 446 return addr; … … 508 454 .request_address = request_address, 509 455 .bind_address = bind_address, 510 . get_handle= find_by_address,456 .find_by_address = find_by_address, 511 457 .release_address = release_address, 512 458 … … 514 460 .unregister_endpoint = unregister_endpoint, 515 461 516 .write = usb_write, 517 .read = usb_read, 462 .interrupt_out = interrupt_out, 463 .interrupt_in = interrupt_in, 464 465 .bulk_in = bulk_in, 466 .bulk_out = bulk_out, 467 468 .control_write = control_write, 469 .control_read = control_read 518 470 }; 519 471 520 472 usb_iface_t vhc_usb_iface = { 521 473 .get_hc_handle = usb_iface_get_hc_handle_hc_impl, 522 .get_ my_address = tell_address474 .get_address = tell_address 523 475 }; 524 476 525 477 usb_iface_t rh_usb_iface = { 526 478 .get_hc_handle = usb_iface_get_hc_handle_rh_impl, 527 .get_ my_address = tell_address_rh479 .get_address = tell_address_rh 528 480 }; 529 481
Note:
See TracChangeset
for help on using the changeset viewer.
