Changeset 5f5321ee in mainline for uspace/drv/bus/usb/ehci/hc.c


Ignore:
Timestamp:
2014-01-24T16:12:32Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
763dbcb
Parents:
dc44023
Message:

ehci: Implement endpoint list enqueue

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/ehci/hc.c

    rdc44023 r5f5321ee  
    198198{
    199199        assert(instance);
    200         /* TODO: implement*/
     200        //TODO: stop the hw
     201#if 0
     202        endpoint_list_fini(&instance->async_list);
     203        endpoint_list_fini(&instance->int_list);
     204        return_page(instance->periodic_list_base);
     205#endif
    201206};
    202207
    203208void hc_enqueue_endpoint(hc_t *instance, const endpoint_t *ep)
    204209{
     210        assert(instance);
     211        assert(ep);
     212        ehci_endpoint_t *ehci_ep = ehci_endpoint_get(ep);
     213        switch (ep->transfer_type)
     214        {
     215        case USB_TRANSFER_CONTROL:
     216                endpoint_list_prepend_ep(&instance->async_list, ehci_ep);
     217                break;
     218        case USB_TRANSFER_BULK:
     219                endpoint_list_append_ep(&instance->async_list, ehci_ep);
     220                break;
     221        case USB_TRANSFER_INTERRUPT:
     222                endpoint_list_append_ep(&instance->int_list, ehci_ep);
     223                break;
     224        case USB_TRANSFER_ISOCHRONOUS:
     225                /* NOT SUPPORTED */
     226                break;
     227        }
    205228}
    206229
     
    343366{
    344367        assert(instance);
     368        int ret = endpoint_list_init(&instance->async_list, "ASYNC");
     369        if (ret != EOK) {
     370                usb_log_error("Failed to setup ASYNC list: %s", str_error(ret));
     371                return ret;
     372        }
     373
     374        ret = endpoint_list_init(&instance->int_list, "INT");
     375        if (ret != EOK) {
     376                usb_log_error("Failed to setup INT list: %s", str_error(ret));
     377                endpoint_list_fini(&instance->async_list);
     378                return ret;
     379        }
    345380
    346381        /* Take 1024 periodic list heads, we ignore low mem options */
    347382        instance->periodic_list_base = get_page();
    348         if (!instance->periodic_list_base)
     383        if (!instance->periodic_list_base) {
     384                usb_log_error("Failed to get ISO schedule page.");
     385                endpoint_list_fini(&instance->async_list);
     386                endpoint_list_fini(&instance->int_list);
    349387                return ENOMEM;
     388        }
    350389        for (unsigned i = 0;
    351390            i < PAGE_SIZE/sizeof(instance->periodic_list_base[0]); ++i)
    352391        {
    353392                /* Disable everything for now */
    354                 instance->periodic_list_base[i] = LINK_POINTER_TERM;
     393                instance->periodic_list_base[i] =
     394                    LINK_POINTER_QH(instance->int_list.list_head_pa);
    355395        }
    356396        return EOK;
Note: See TracChangeset for help on using the changeset viewer.