Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-hcd/iface.c

    r0ede0c3 r1998bcd  
    6363        }
    6464
    65         usb_log_debug("%s %d:%d %zu(%zu).\n",
    66             name, target.address, target.endpoint, size, ep->max_packet_size);
    67 
    6865        const size_t bw = bandwidth_count_usb11(
    6966            ep->speed, ep->transfer_type, size, ep->max_packet_size);
     
    7168                usb_log_error("Endpoint(%d:%d) %s needs %zu bw "
    7269                    "but only %zu is reserved.\n",
    73                     target.address, target.endpoint, name, bw, res_bw);
     70                    name, target.address, target.endpoint, bw, res_bw);
    7471                return ENOSPC;
    7572        }
    76 
    77         *batch = batch_get(
    78                 fun, ep, data, size, setup_data, setup_size, in, out, arg);
    79         if (!*batch)
     73        usb_log_debug("%s %d:%d %zu(%zu).\n",
     74            name, target.address, target.endpoint, size, ep->max_packet_size);
     75
     76//      assert(ep->speed ==
     77//          usb_device_keeper_get_speed(&(*hc)->manager, target.address));
     78//      assert(ep->max_packet_size == max_packet_size);
     79//      assert(ep->transfer_type == USB_TRANSFER_CONTROL);
     80
     81        *batch =
     82            batch_get(fun, ep, data, size, setup_data, setup_size,
     83                in, out, arg);
     84        if (!batch)
    8085                return ENOMEM;
     86        return EOK;
     87}
     88
     89
     90/** Reserve default address interface function
     91 *
     92 * @param[in] fun DDF function that was called.
     93 * @param[in] speed Speed to associate with the new default address.
     94 * @return Error code.
     95 */
     96static int reserve_default_address(ddf_fun_t *fun, usb_speed_t speed)
     97{
     98        assert(fun);
     99        hc_t *hc = fun_to_hc(fun);
     100        assert(hc);
     101        usb_log_debug("Default address request with speed %d.\n", speed);
     102        usb_device_keeper_reserve_default_address(&hc->manager, speed);
     103        return EOK;
     104#if 0
     105        endpoint_t *ep = malloc(sizeof(endpoint_t));
     106        if (ep == NULL)
     107                return ENOMEM;
     108        const size_t max_packet_size = speed == USB_SPEED_LOW ? 8 : 64;
     109        endpoint_init(ep, USB_TRANSFER_CONTROL, speed, max_packet_size);
     110        int ret;
     111try_retgister:
     112        ret = usb_endpoint_manager_register_ep(&hc->ep_manager,
     113            USB_ADDRESS_DEFAULT, 0, USB_DIRECTION_BOTH, ep, endpoint_destroy, 0);
     114        if (ret == EEXISTS) {
     115                async_usleep(1000);
     116                goto try_retgister;
     117        }
     118        if (ret != EOK) {
     119                endpoint_destroy(ep);
     120        }
     121        return ret;
     122#endif
     123}
     124/*----------------------------------------------------------------------------*/
     125/** Release default address interface function
     126 *
     127 * @param[in] fun DDF function that was called.
     128 * @return Error code.
     129 */
     130static int release_default_address(ddf_fun_t *fun)
     131{
     132        assert(fun);
     133        hc_t *hc = fun_to_hc(fun);
     134        assert(hc);
     135        usb_log_debug("Default address release.\n");
     136//      return usb_endpoint_manager_unregister_ep(&hc->ep_manager,
     137//          USB_ADDRESS_DEFAULT, 0, USB_DIRECTION_BOTH);
     138        usb_device_keeper_release_default_address(&hc->manager);
    81139        return EOK;
    82140}
     
    147205        hc_t *hc = fun_to_hc(fun);
    148206        assert(hc);
    149         const size_t size = max_packet_size;
    150         int ret;
    151207        usb_speed_t speed = usb_device_keeper_get_speed(&hc->manager, address);
    152208        if (speed >= USB_SPEED_MAX) {
    153209                speed = ep_speed;
    154210        }
    155         usb_log_debug("Register endpoint %d:%d %s %s(%d) %zu(%zu) %u.\n",
    156             address, endpoint, usb_str_transfer_type(transfer_type),
    157             usb_str_speed(speed), direction, size, max_packet_size, interval);
    158 
     211        const size_t size =
     212            (transfer_type == USB_TRANSFER_INTERRUPT
     213            || transfer_type == USB_TRANSFER_ISOCHRONOUS) ?
     214            max_packet_size : 0;
     215        int ret;
    159216
    160217        endpoint_t *ep = malloc(sizeof(endpoint_t));
     
    168225        }
    169226
     227        usb_log_debug("Register endpoint %d:%d %s %s(%d) %zu(%zu) %u.\n",
     228            address, endpoint, usb_str_transfer_type(transfer_type),
     229            usb_str_speed(speed), direction, size, max_packet_size, interval);
     230
    170231        ret = usb_endpoint_manager_register_ep(&hc->ep_manager, ep, size);
    171232        if (ret != EOK) {
    172233                endpoint_destroy(ep);
     234        } else {
     235                usb_device_keeper_add_ep(&hc->manager, address, ep);
    173236        }
    174237        return ret;
     
    183246        usb_log_debug("Unregister endpoint %d:%d %d.\n",
    184247            address, endpoint, direction);
     248        endpoint_t *ep = usb_endpoint_manager_get_ep(&hc->ep_manager,
     249            address, endpoint, direction, NULL);
     250        if (ep != NULL) {
     251                usb_device_keeper_del_ep(&hc->manager, address, ep);
     252        }
    185253        return usb_endpoint_manager_unregister_ep(&hc->ep_manager, address,
    186254            endpoint, direction);
     
    323391        if (ret != EOK)
    324392                return ret;
    325         usb_endpoint_manager_reset_if_need(&hc->ep_manager, target, setup_data);
     393        usb_device_keeper_reset_if_need(&hc->manager, target, setup_data);
    326394        batch_control_write(batch);
    327395        ret = hc_schedule(hc, batch);
     
    365433/*----------------------------------------------------------------------------*/
    366434usbhc_iface_t hc_iface = {
     435        .reserve_default_address = reserve_default_address,
     436        .release_default_address = release_default_address,
    367437        .request_address = request_address,
    368438        .bind_address = bind_address,
Note: See TracChangeset for help on using the changeset viewer.