Changeset 30a4301 in mainline for uspace/drv/uhci-hcd/uhci.c


Ignore:
Timestamp:
2011-02-16T22:28:58Z (14 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2736b13e
Parents:
36a4738
Message:

Use interrupt emulation until real hardware interrupts work

File:
1 edited

Legend:

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

    r36a4738 r30a4301  
    4444static void uhci_init_hw(uhci_t *instance);
    4545
    46 static int uhci_clean_finished(void *arg);
     46static int uhci_interrupt_emulator(void *arg);
    4747static int uhci_debug_checker(void *arg);
    4848
     
    6969        usb_log_debug("Device registers accessible.\n");
    7070
    71         instance->cleaner = fibril_create(uhci_clean_finished, instance);
     71        instance->cleaner = fibril_create(uhci_interrupt_emulator, instance);
    7272        fibril_add_ready(instance->cleaner);
    7373
     
    189189}
    190190/*----------------------------------------------------------------------------*/
    191 int uhci_clean_finished(void* arg)
    192 {
    193         usb_log_debug("Started cleaning fibril.\n");
     191void uhci_interrupt(uhci_t *instance)
     192{
     193        assert(instance);
     194        const uint16_t sts = pio_read_16(&instance->registers->usbsts);
     195        if ((sts & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)
     196                return;
     197        usb_log_debug("UHCI interrupt: %X.\n", sts);
     198        transfer_list_check(&instance->transfers_interrupt);
     199        transfer_list_check(&instance->transfers_control_slow);
     200        transfer_list_check(&instance->transfers_control_full);
     201        transfer_list_check(&instance->transfers_bulk_full);
     202        pio_write_16(&instance->registers->usbsts, 0xf);
     203}
     204/*----------------------------------------------------------------------------*/
     205int uhci_interrupt_emulator(void* arg)
     206{
     207        usb_log_debug("Started interrupt emulator.\n");
    194208        uhci_t *instance = (uhci_t*)arg;
    195209        assert(instance);
    196210
    197211        while(1) {
    198                 transfer_list_check(&instance->transfers_interrupt);
    199                 transfer_list_check(&instance->transfers_control_slow);
    200                 transfer_list_check(&instance->transfers_control_full);
    201                 transfer_list_check(&instance->transfers_bulk_full);
     212                uhci_interrupt(instance);
    202213                async_usleep(UHCI_CLEANER_TIMEOUT);
    203214        }
Note: See TracChangeset for help on using the changeset viewer.