Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/src/hcd.c

    readaeae8 rae3a941  
    149149 * If this method fails, a polling fibril is started instead.
    150150 *
    151  * @param[in]  hcd        Host controller device.
    152  * @param[in]  hw_res      Resources to be used.
    153  * @param[out] irq_handle  Storage for the returned IRQ handle
    154  *
    155  * @return Error code.
     151 * @param[in] hcd Host controller device.
     152 * @param[in] hw_res Resources to be used.
     153 *
     154 * @return IRQ capability handle on success.
     155 * @return Negative error code.
    156156 */
    157157static errno_t hcd_ddf_setup_interrupts(hc_device_t *hcd,
    158     const hw_res_list_parsed_t *hw_res, cap_irq_handle_t *irq_handle)
     158    const hw_res_list_parsed_t *hw_res)
    159159{
    160160        assert(hcd);
     
    169169        if (ret != EOK) {
    170170                usb_log_error("Failed to generate IRQ code: %s.",
    171                     str_error(ret));
    172                 return ret;
     171                    str_error(irq));
     172                return irq;
    173173        }
    174174
    175175        /* Register handler to avoid interrupt lockup */
    176         cap_irq_handle_t ihandle;
     176        int irq_cap;
    177177        ret = register_interrupt_handler(hcd->ddf_dev, irq, irq_handler,
    178             &irq_code, &ihandle);
     178            &irq_code, &irq_cap);
    179179        irq_code_clean(&irq_code);
    180180        if (ret != EOK) {
    181181                usb_log_error("Failed to register interrupt handler: %s.",
    182                     str_error(ret));
    183                 return ret;
     182                    str_error(irq_cap));
     183                return irq_cap;
    184184        }
    185185
     
    189189                usb_log_error("Failed to enable interrupts: %s.",
    190190                    str_error(ret));
    191                 unregister_interrupt_handler(hcd->ddf_dev, ihandle);
     191                unregister_interrupt_handler(hcd->ddf_dev, irq_cap);
    192192                return ret;
    193193        }
    194 
    195         *irq_handle = ihandle;
    196         return EOK;
     194        return irq_cap;
    197195}
    198196
     
    247245
    248246        /* Setup interrupts  */
    249         hcd->irq_handle = CAP_NIL;
    250         errno_t irqerr = hcd_ddf_setup_interrupts(hcd, &hw_res,
    251             &hcd->irq_handle);
    252         if (irqerr == EOK) {
     247        hcd->irq_cap = hcd_ddf_setup_interrupts(hcd, &hw_res);
     248        if (hcd->irq_cap >= 0) {
    253249                usb_log_debug("Hw interrupts enabled.");
    254250        }
     
    274270
    275271        /* Need working irq replacement to setup root hub */
    276         if (irqerr != EOK && ops->status) {
     272        if (hcd->irq_cap < 0 && ops->status) {
    277273                hcd->polling_fibril = fibril_create(interrupt_polling, hcd->bus);
    278274                if (!hcd->polling_fibril) {
     
    283279                fibril_add_ready(hcd->polling_fibril);
    284280                usb_log_warning("Failed to enable interrupts: %s."
    285                     " Falling back to polling.", str_error(irqerr));
     281                    " Falling back to polling.", str_error(hcd->irq_cap));
    286282        }
    287283
     
    309305                hc_driver->stop(hcd);
    310306err_irq:
    311         unregister_interrupt_handler(device, hcd->irq_handle);
     307        unregister_interrupt_handler(device, hcd->irq_cap);
    312308        if (hc_driver->hc_remove)
    313309                hc_driver->hc_remove(hcd);
     
    328324                        return err;
    329325
    330         unregister_interrupt_handler(dev, hcd->irq_handle);
     326        unregister_interrupt_handler(dev, hcd->irq_cap);
    331327
    332328        if (hc_driver->hc_remove)
Note: See TracChangeset for help on using the changeset viewer.