Changeset 30a4301 in mainline


Ignore:
Timestamp:
2011-02-16T22:28:58Z (13 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

Location:
uspace/drv/uhci-hcd
Files:
3 edited

Legend:

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

    r36a4738 r30a4301  
    248248        }
    249249
     250        instance->tds[i - 1].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
     251
    250252        instance->next_step = batch_call_in_and_dispose;
    251253        batch_schedule(instance);
     
    272274        }
    273275
     276        instance->tds[i - 1].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
     277
    274278        instance->next_step = batch_call_out_and_dispose;
    275279        batch_schedule(instance);
  • 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        }
  • uspace/drv/uhci-hcd/uhci.h

    r36a4738 r30a4301  
    117117int uhci_schedule(uhci_t *instance, batch_t *batch);
    118118
     119void uhci_interrupt(uhci_t *instance);
     120
    119121static inline uhci_t * dev_to_uhci(device_t *dev)
    120122        { return (uhci_t*)dev->driver_data; }
Note: See TracChangeset for help on using the changeset viewer.