Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/vhc/connhost.c

    r02fc5c4 raa81adc  
    5757 * @return Error code.
    5858 */
    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);
     59static 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;
    6775}
    6876
     
    8088        usb_log_debug("Binding handle %" PRIun " to address %d.\n",
    8189            handle, address);
    82         usb_device_manager_bind_address(&vhc->dev_manager, address, handle);
     90        usb_device_keeper_bind(&vhc->dev_keeper, address, handle);
    8391
    8492        return EOK;
     
    96104{
    97105        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;
    100109}
    101110
     
    110119        VHC_DATA(vhc, fun);
    111120        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);
    113122
    114123        return ENOTSUP;
     
    128137 */
    129138static 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,
    131140    usb_transfer_type_t transfer_type, usb_direction_t direction,
    132141    size_t max_packet_size, unsigned int interval)
    133142{
    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;
    140159}
    141160
     
    153172        VHC_DATA(vhc, fun);
    154173
    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);
    157182
    158183        return rc;
    159184}
    160 #if 0
     185
    161186/** Schedule interrupt out transfer.
    162187 *
     
    388413        return EOK;
    389414}
    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
     416static int tell_address(ddf_fun_t *fun, devman_handle_t handle,
     417    usb_address_t *address)
    474418{
    475419        UNSUPPORTED("tell_address");
     
    488432}
    489433
    490 static int tell_address_rh(ddf_fun_t *root_hub_fun, usb_address_t *address)
     434static int tell_address_rh(ddf_fun_t *root_hub_fun, devman_handle_t handle,
     435    usb_address_t *address)
    491436{
    492437        VHC_DATA(vhc, root_hub_fun);
    493438
    494         devman_handle_t handle = root_hub_fun->handle;
     439        if (handle == 0) {
     440                handle = root_hub_fun->handle;
     441        }
    495442
    496443        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);
    499445        if (addr < 0) {
    500446                return addr;
     
    508454        .request_address = request_address,
    509455        .bind_address = bind_address,
    510         .get_handle = find_by_address,
     456        .find_by_address = find_by_address,
    511457        .release_address = release_address,
    512458
     
    514460        .unregister_endpoint = unregister_endpoint,
    515461
    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
    518470};
    519471
    520472usb_iface_t vhc_usb_iface = {
    521473        .get_hc_handle = usb_iface_get_hc_handle_hc_impl,
    522         .get_my_address = tell_address
     474        .get_address = tell_address
    523475};
    524476
    525477usb_iface_t rh_usb_iface = {
    526478        .get_hc_handle = usb_iface_get_hc_handle_rh_impl,
    527         .get_my_address = tell_address_rh
     479        .get_address = tell_address_rh
    528480};
    529481
Note: See TracChangeset for help on using the changeset viewer.