Changeset 35c37fc in mainline for uspace/drv/bus/usb/ehci/hc.c


Ignore:
Timestamp:
2018-01-05T20:15:08Z (6 years ago)
Author:
Ondřej Hlavatý <aearsis@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9e5b162
Parents:
b60944b
git-author:
Ondřej Hlavatý <aearsis@…> (2018-01-05 16:11:04)
git-committer:
Ondřej Hlavatý <aearsis@…> (2018-01-05 20:15:08)
Message:

ehci: refactor to dma_buffers

One big hidden thing was refactored - now TDs are allocated in one
buffer together with setup and data buffers themselves. This reduces the
number of allocated pages per transfer to minimum.

File:
1 edited

Legend:

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

    rb60944b r35c37fc  
    4545#include <usb/debug.h>
    4646#include <usb/usb.h>
    47 #include <usb/host/utils/malloc32.h>
    4847
    4948#include "ehci_batch.h"
     
    198197 * @param[in] instance Host controller structure to use.
    199198 */
    200 int hc_gone(hc_device_t *instance)
    201 {
    202         assert(instance);
    203         return EOK;
    204         //TODO: stop the hw
    205 #if 0
    206         endpoint_list_fini(&instance->async_list);
    207         endpoint_list_fini(&instance->int_list);
    208         return_page(instance->periodic_list_base);
    209 #endif
     199int hc_gone(hc_device_t *hcd)
     200{
     201        hc_t *hc = hcd_to_hc(hcd);
     202        endpoint_list_fini(&hc->async_list);
     203        endpoint_list_fini(&hc->int_list);
     204        dma_buffer_free(&hc->dma_buffer);
     205        return EOK;
    210206};
    211207
     
    406402
    407403        /* Enable periodic list */
    408         assert(instance->periodic_list_base);
     404        assert(instance->periodic_list);
    409405        uintptr_t phys_base =
    410             addr_to_phys((void*)instance->periodic_list_base);
     406            addr_to_phys((void*)instance->periodic_list);
    411407        assert((phys_base & USB_PERIODIC_LIST_BASE_MASK) == phys_base);
    412408        EHCI_WR(instance->registers->periodiclistbase, phys_base);
     
    477473
    478474        /* Take 1024 periodic list heads, we ignore low mem options */
    479         instance->periodic_list_base = get_page();
    480         if (!instance->periodic_list_base) {
     475        if (dma_buffer_alloc(&instance->dma_buffer, PAGE_SIZE)) {
    481476                usb_log_error("HC(%p): Failed to get ISO schedule page.",
    482477                    instance);
     
    485480                return ENOMEM;
    486481        }
     482        instance->periodic_list = instance->dma_buffer.virt;
    487483
    488484        usb_log_debug2("HC(%p): Initializing Periodic list.", instance);
    489         for (unsigned i = 0;
    490             i < PAGE_SIZE/sizeof(instance->periodic_list_base[0]); ++i)
     485        for (unsigned i = 0; i < PAGE_SIZE/sizeof(link_pointer_t); ++i)
    491486        {
    492487                /* Disable everything for now */
    493                 instance->periodic_list_base[i] =
     488                instance->periodic_list[i] =
    494489                    LINK_POINTER_QH(addr_to_phys(instance->int_list.list_head));
    495490        }
Note: See TracChangeset for help on using the changeset viewer.