Ignore:
File:
1 edited

Legend:

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

    r27205841 rea993d18  
    247247{
    248248        assert(instance);
    249 #define SETUP_TRANSFER_LIST(type, name) \
    250 do { \
    251         int ret = transfer_list_init(&instance->transfers_##type, name); \
     249#define CHECK_RET_CLEAR_RETURN(ret, message...) \
    252250        if (ret != EOK) { \
    253                 usb_log_error("Failed(%d) to setup %s transfer list: %s.\n", \
    254                     ret, name, str_error(ret)); \
     251                usb_log_error(message); \
    255252                transfer_list_fini(&instance->transfers_bulk_full); \
    256253                transfer_list_fini(&instance->transfers_control_full); \
     
    258255                transfer_list_fini(&instance->transfers_interrupt); \
    259256                return ret; \
    260         } \
    261 } while (0)
    262 
    263         SETUP_TRANSFER_LIST(bulk_full, "BULK FULL");
    264         SETUP_TRANSFER_LIST(control_full, "CONTROL FULL");
    265         SETUP_TRANSFER_LIST(control_slow, "CONTROL LOW");
    266         SETUP_TRANSFER_LIST(interrupt, "INTERRUPT");
    267 #undef SETUP_TRANSFER_LIST
    268         /* Connect lists into one schedule */
     257        } else (void) 0
     258
     259        /* initialize TODO: check errors */
     260        int ret;
     261        ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL");
     262        CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list.");
     263
     264        ret = transfer_list_init(
     265            &instance->transfers_control_full, "CONTROL_FULL");
     266        CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list.");
     267
     268        ret = transfer_list_init(
     269            &instance->transfers_control_slow, "CONTROL_SLOW");
     270        CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list.");
     271
     272        ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT");
     273        CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list.");
     274
    269275        transfer_list_set_next(&instance->transfers_control_full,
    270276                &instance->transfers_bulk_full);
     
    331337        assert(instance);
    332338//      status |= 1; //Uncomment to work around qemu hang
     339        /* TODO: Resume interrupts are not supported */
    333340        /* Lower 2 bits are transaction error and transaction complete */
    334         if (status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) {
     341        if (status & 0x3) {
    335342                LIST_INITIALIZE(done);
    336343                transfer_list_remove_finished(
     
    351358                }
    352359        }
    353         /* Resume interrupts are not supported */
    354 
    355         /* Bits 4 and 5 indicate hc error */
    356         if (status & (UHCI_STATUS_PROCESS_ERROR | UHCI_STATUS_SYSTEM_ERROR)) {
     360        /* bits 4 and 5 indicate hc error */
     361        if (status & 0x18) {
    357362                usb_log_error("UHCI hardware failure!.\n");
    358363                ++instance->hw_failures;
     
    384389
    385390        while (1) {
    386                 /* Readd and clear status register */
     391                /* read and ack interrupts */
    387392                uint16_t status = pio_read_16(&instance->registers->usbsts);
    388                 pio_write_16(&instance->registers->usbsts, status);
     393                pio_write_16(&instance->registers->usbsts, 0x1f);
    389394                if (status != 0)
    390395                        usb_log_debug2("UHCI status: %x.\n", status);
    391396                hc_interrupt(instance, status);
    392                 async_usleep(UHCI_INT_EMULATOR_TIMEOUT);
     397                async_usleep(UHCI_CLEANER_TIMEOUT);
    393398        }
    394399        return EOK;
Note: See TracChangeset for help on using the changeset viewer.