Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/src/iface.c

    r549ff23 r8b54fe6  
    4949        assert(hcd);
    5050
    51         endpoint_t *ep = usb_endpoint_manager_find_ep(&hcd->ep_manager,
    52             target.address, target.endpoint, direction);
     51        int ret;
     52
     53        size_t res_bw;
     54        endpoint_t *ep = usb_endpoint_manager_get_ep(&hcd->ep_manager,
     55            target.address, target.endpoint, direction, &res_bw);
    5356        if (ep == NULL) {
    5457                usb_log_error("Endpoint(%d:%d) not registered for %s.\n",
     
    6265        const size_t bw = bandwidth_count_usb11(
    6366            ep->speed, ep->transfer_type, size, ep->max_packet_size);
    64         /* Check if we have enough bandwidth reserved */
    65         if (ep->bandwidth < bw) {
     67        if (res_bw < bw) {
    6668                usb_log_error("Endpoint(%d:%d) %s needs %zu bw "
    6769                    "but only %zu is reserved.\n",
    68                     ep->address, ep->endpoint, name, bw, ep->bandwidth);
     70                    target.address, target.endpoint, name, bw, res_bw);
    6971                return ENOSPC;
    7072        }
     
    7678        /* No private data and no private data dtor */
    7779        usb_transfer_batch_t *batch =
    78             usb_transfer_batch_create(ep, data, size, setup_data,
     80            usb_transfer_batch_get(ep, data, size, setup_data,
    7981            in, out, arg, fun, NULL, NULL);
    8082        if (!batch) {
     
    8284        }
    8385
    84         const int ret = hcd->schedule(hcd, batch);
     86        ret = hcd->schedule(hcd, batch);
    8587        if (ret != EOK)
    86                 usb_transfer_batch_destroy(batch);
     88                usb_transfer_batch_dispose(batch);
    8789
    8890        return ret;
     
    128130
    129131        usb_log_debug("Address bind %d-%" PRIun ".\n", address, handle);
    130         return usb_device_manager_bind(&hcd->dev_manager, address, handle);
     132        usb_device_manager_bind(&hcd->dev_manager, address, handle);
     133        return EOK;
    131134}
    132135/*----------------------------------------------------------------------------*/
     
    144147        hcd_t *hcd = fun_to_hcd(fun);
    145148        assert(hcd);
    146         return usb_device_manager_get_info_by_address(
    147             &hcd->dev_manager, address, handle, NULL);
     149        const bool found =
     150            usb_device_manager_find_by_address(&hcd->dev_manager, address, handle);
     151        return found ? EOK : ENOENT;
    148152}
    149153/*----------------------------------------------------------------------------*/
     
    162166        usb_device_manager_release(&hcd->dev_manager, address);
    163167        return EOK;
    164 }
    165 /*----------------------------------------------------------------------------*/
    166 static int register_helper(endpoint_t *ep, void *arg)
    167 {
    168         hcd_t *hcd = arg;
    169         assert(ep);
    170         assert(hcd);
    171         if (hcd->ep_add_hook)
    172                 return hcd->ep_add_hook(hcd, ep);
    173         return EOK;
    174 }
    175 /*----------------------------------------------------------------------------*/
    176 static void unregister_helper(endpoint_t *ep, void *arg)
    177 {
    178         hcd_t *hcd = arg;
    179         assert(ep);
    180         assert(hcd);
    181         if (hcd->ep_remove_hook)
    182                 hcd->ep_remove_hook(hcd, ep);
    183168}
    184169/*----------------------------------------------------------------------------*/
     
    195180        /* Default address is not bound or registered,
    196181         * thus it does not provide speed info. */
    197         usb_speed_t speed = ep_speed;
    198         /* NOTE The function will return EINVAL and won't
    199          * touch speed variable for default address */
    200         usb_device_manager_get_info_by_address(
    201             &hcd->dev_manager, address, NULL, &speed);
     182        const usb_speed_t speed = (address == 0) ? ep_speed :
     183            usb_device_manager_get_speed(&hcd->dev_manager, address);
    202184
    203185        usb_log_debug("Register endpoint %d:%d %s-%s %s %zuB %ums.\n",
     
    206188            max_packet_size, interval);
    207189
    208         return usb_endpoint_manager_add_ep(&hcd->ep_manager, address, endpoint,
    209             direction, transfer_type, speed, max_packet_size, size,
    210             register_helper, hcd);
     190        endpoint_t *ep = endpoint_get(
     191            address, endpoint, direction, transfer_type, speed, max_packet_size);
     192        if (!ep)
     193                return ENOMEM;
     194        int ret = EOK;
     195
     196        if (hcd->ep_add_hook) {
     197                ret = hcd->ep_add_hook(hcd, ep);
     198        }
     199        if (ret != EOK) {
     200                endpoint_destroy(ep);
     201                return ret;
     202        }
     203
     204        ret = usb_endpoint_manager_register_ep(&hcd->ep_manager, ep, size);
     205        if (ret != EOK) {
     206                endpoint_destroy(ep);
     207        }
     208        return ret;
    211209}
    212210/*----------------------------------------------------------------------------*/
     
    220218        usb_log_debug("Unregister endpoint %d:%d %s.\n",
    221219            address, endpoint, usb_str_direction(direction));
    222         return usb_endpoint_manager_remove_ep(&hcd->ep_manager, address,
    223             endpoint, direction, unregister_helper, hcd);
     220        return usb_endpoint_manager_unregister_ep(&hcd->ep_manager, address,
     221            endpoint, direction);
    224222}
    225223/*----------------------------------------------------------------------------*/
Note: See TracChangeset for help on using the changeset viewer.