Changeset 9a818a9 in mainline for uspace/drv/uhci-hcd/uhci.c


Ignore:
Timestamp:
2011-02-07T12:49:19Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e2172cf8
Parents:
da17cf0
Message:

Adds support for tracker scheduling and callback

File:
1 edited

Legend:

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

    rda17cf0 r9a818a9  
    8686
    8787        const uintptr_t pa = (uintptr_t)addr_to_phys(instance->frame_list);
    88 
    8988        pio_write_32(&instance->registers->flbaseadd, (uint32_t)pa);
     89
     90        list_initialize(&instance->tracker_list);
    9091
    9192        instance->cleaner = fibril_create(uhci_clean_finished, instance);
     
    209210        return EOK;
    210211}
    211 /*---------------------------------------------------------------------------*/
     212/*----------------------------------------------------------------------------*/
     213int uhci_schedule(uhci_t *instance, tracker_t *tracker)
     214{
     215        assert(instance);
     216        assert(tracker);
     217        const int low_speed = (tracker->speed == LOW_SPEED);
     218        if (!allowed_usb_packet(
     219            low_speed, tracker->transfer_type, tracker->packet_size)) {
     220                usb_log_warning("Invalid USB packet specified %s SPEED %d %zu.\n",
     221                          low_speed ? "LOW" : "FULL" , tracker->transfer_type,
     222                    tracker->packet_size);
     223                return ENOTSUP;
     224        }
     225        /* TODO: check available bandwith here */
     226
     227        transfer_list_t *list =
     228            instance->transfers[low_speed][tracker->transfer_type];
     229        assert(list);
     230        transfer_list_add_tracker(list, tracker);
     231        list_append(&tracker->link, &instance->tracker_list);
     232
     233        return EOK;
     234}
     235/*----------------------------------------------------------------------------*/
    212236int uhci_clean_finished(void* arg)
    213237{
     
    217241
    218242        while(1) {
    219                 usb_log_debug("Running cleaning fibril on: %p.\n", instance);
     243                /* tracker iteration */
     244                link_t *current = instance->tracker_list.next;
     245                while (current != &instance->tracker_list)
     246                {
     247                        link_t *next = current->next;
     248                        tracker_t *tracker = list_get_instance(current, tracker_t, link);
     249                        assert(current == &tracker->link);
     250                        if (!transfer_descriptor_is_active(tracker->td)) {
     251                                usb_log_debug("Found inactive tracker.\n");
     252                                list_remove(current);
     253                                tracker->next_step(tracker);
     254                        }
     255                        current = next;
     256                }
    220257                /* iterate all transfer queues */
    221258                transfer_list_t *current_list = &instance->transfers_interrupt;
Note: See TracChangeset for help on using the changeset viewer.