Changeset 27205841 in mainline for uspace/drv/uhci-hcd/hc.c


Ignore:
Timestamp:
2011-04-14T07:36:53Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
540abef
Parents:
3eeb270f
Message:

Make better use of macros

File:
1 edited

Legend:

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

    r3eeb270f r27205841  
    247247{
    248248        assert(instance);
    249 #define CHECK_RET_CLEAR_RETURN(ret, message...) \
     249#define SETUP_TRANSFER_LIST(type, name) \
     250do { \
     251        int ret = transfer_list_init(&instance->transfers_##type, name); \
    250252        if (ret != EOK) { \
    251                 usb_log_error(message); \
     253                usb_log_error("Failed(%d) to setup %s transfer list: %s.\n", \
     254                    ret, name, str_error(ret)); \
    252255                transfer_list_fini(&instance->transfers_bulk_full); \
    253256                transfer_list_fini(&instance->transfers_control_full); \
     
    255258                transfer_list_fini(&instance->transfers_interrupt); \
    256259                return ret; \
    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 
     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 */
    275269        transfer_list_set_next(&instance->transfers_control_full,
    276270                &instance->transfers_bulk_full);
     
    337331        assert(instance);
    338332//      status |= 1; //Uncomment to work around qemu hang
    339         /* TODO: Resume interrupts are not supported */
    340333        /* Lower 2 bits are transaction error and transaction complete */
    341         if (status & 0x3) {
     334        if (status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) {
    342335                LIST_INITIALIZE(done);
    343336                transfer_list_remove_finished(
     
    358351                }
    359352        }
    360         /* bits 4 and 5 indicate hc error */
    361         if (status & 0x18) {
     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)) {
    362357                usb_log_error("UHCI hardware failure!.\n");
    363358                ++instance->hw_failures;
     
    389384
    390385        while (1) {
    391                 /* read and ack interrupts */
     386                /* Readd and clear status register */
    392387                uint16_t status = pio_read_16(&instance->registers->usbsts);
    393                 pio_write_16(&instance->registers->usbsts, 0x1f);
     388                pio_write_16(&instance->registers->usbsts, status);
    394389                if (status != 0)
    395390                        usb_log_debug2("UHCI status: %x.\n", status);
    396391                hc_interrupt(instance, status);
    397                 async_usleep(UHCI_CLEANER_TIMEOUT);
     392                async_usleep(UHCI_INT_EMULATOR_TIMEOUT);
    398393        }
    399394        return EOK;
Note: See TracChangeset for help on using the changeset viewer.