Changeset 3f03199 in mainline for uspace/drv/bus/usb/uhci/uhci.c


Ignore:
Timestamp:
2013-09-15T06:33:53Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9348862
Parents:
dd7078c (diff), 1c0cef0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

Major conflicts in USB HC drivers.
Compiles and UHCI works (qemu).
OHCI has device remove problems.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/uhci/uhci.c

    rdd7078c r3f03199  
    8080                return EBADMEM;
    8181
    82 #define CHECK_RET_RETURN(ret, message...) \
    83 if (ret != EOK) { \
    84         usb_log_error(message); \
    85         return ret; \
    86 } else (void)0
    87 
    88         uintptr_t reg_base = 0;
    89         size_t reg_size = 0;
     82        addr_range_t regs;
    9083        int irq = 0;
    9184
    92         int ret = get_my_registers(device, &reg_base, &reg_size, &irq);
    93         CHECK_RET_RETURN(ret, "Failed to get I/O region for %" PRIun ": %s.\n",
    94             ddf_dev_get_handle(device), str_error(ret));
    95         usb_log_debug("I/O regs at 0x%p (size %zu), IRQ %d.\n",
    96             (void *) reg_base, reg_size, irq);
     85        int ret = get_my_registers(device, &regs, &irq);
     86        if (ret != EOK) {
     87                usb_log_error("Failed to get I/O addresses for %" PRIun ": %s.\n",
     88                    ddf_dev_get_handle(device), str_error(ret));
     89                return ret;
     90        }
     91        usb_log_debug("I/O regs at %p (size %zu), IRQ %d.\n",
     92            RNGABSPTR(regs), RNGSZ(regs), irq);
    9793
    98         const size_t ranges_count = hc_irq_pio_range_count();
    99         const size_t cmds_count = hc_irq_cmd_count();
    100         irq_pio_range_t irq_ranges[ranges_count];
    101         irq_cmd_t irq_cmds[cmds_count];
    102         ret = hc_get_irq_code(irq_ranges, sizeof(irq_ranges), irq_cmds,
    103             sizeof(irq_cmds), reg_base, reg_size);
    104         CHECK_RET_RETURN(ret, "Failed to generate IRQ commands: %s.\n",
    105             str_error(ret));
     94        ret = hcd_ddf_setup_hc(device, USB_SPEED_FULL,
     95            BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
     96        if (ret != EOK) {
     97                usb_log_error("Failed to setup generic HCD.\n");
     98                return ret;
     99        }
    106100
    107         irq_code_t irq_code = {
    108                 .rangecount = ranges_count,
    109                 .ranges = irq_ranges,
    110                 .cmdcount = cmds_count,
    111                 .cmds = irq_cmds
    112         };
     101        hc_t *hc = malloc(sizeof(hc_t));
     102        if (!hc) {
     103                usb_log_error("Failed to allocate UHCI HC structure.\n");
     104                hcd_ddf_clean_hc(device);
     105                return ENOMEM;
     106        }
    113107
    114         /* Register handler to avoid interrupt lockup */
    115         ret = register_interrupt_handler(device, irq, irq_handler, &irq_code);
    116         CHECK_RET_RETURN(ret, "Failed to register interrupt handler: %s.\n",
    117             str_error(ret));
    118        
    119         ret = disable_legacy(device);
    120         CHECK_RET_RETURN(ret, "Failed to disable legacy USB: %s.\n",
    121             str_error(ret));
     108        ret = hc_register_irq_handler(device, &regs, irq, irq_handler);
     109        if (ret != EOK) {
     110                usb_log_error("Failed to register interrupt handler: %s.\n",
     111                    str_error(ret));
     112                hcd_ddf_clean_hc(device);
     113                return ret;
     114        }
    122115
    123116        bool interrupts = false;
     
    131124        }
    132125
    133         ret = hcd_ddf_setup_hc(device, USB_SPEED_FULL,
    134             BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
    135         CHECK_RET_RETURN(ret, "Failed to setup UHCI HCD.\n");
    136        
    137         hc_t *hc = malloc(sizeof(hc_t));
    138         ret = hc ? EOK : ENOMEM;
    139         CHECK_RET_RETURN(ret, "Failed to allocate UHCI HC structure.\n");
     126        ret = disable_legacy(device);
     127        if (ret != EOK) {
     128                usb_log_error("Failed to disable legacy USB: %s.\n",
     129                    str_error(ret));
     130                hcd_ddf_clean_hc(device);
     131                return ret;
     132        }
    140133
    141         ret = hc_init(hc, (void*)reg_base, reg_size, interrupts);
    142         CHECK_RET_RETURN(ret,
    143             "Failed to init uhci_hcd: %s.\n", str_error(ret));
     134        ret = hc_init(hc, &regs, interrupts);
     135        if (ret != EOK) {
     136                usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret));
     137                hcd_ddf_clean_hc(device);
     138                // TODO unregister interrupt handler
     139                return ret;
     140        }
    144141
    145142        hcd_set_implementation(dev_to_hcd(device), hc, hc_schedule, NULL, NULL);
     
    151148        ret = hcd_ddf_setup_root_hub(device);
    152149        if (ret != EOK) {
    153                 // TODO: Undo hcd_setup_device
    154150                hc_fini(hc);
    155                 CHECK_RET_RETURN(ret, "Failed to setup UHCI root hub: %s.\n",
     151                hcd_ddf_clean_hc(device);
     152                // TODO unregister interrupt handler
     153                usb_log_error("Failed to setup UHCI root hub: %s.\n",
    156154                    str_error(ret));
    157155                return ret;
Note: See TracChangeset for help on using the changeset viewer.