Ignore:
File:
1 edited

Legend:

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

    r3f74275 re657635  
    748748 * @param[in] gen_irq_code IRQ code generator.
    749749 *
    750  * @return IRQ capability handle on success.
    751  * @return Negative error code.
     750 * @return EOK on success or negative error code
    752751 */
    753752int hcd_ddf_setup_interrupts(ddf_dev_t *device,
     
    771770
    772771        /* Register handler to avoid interrupt lockup */
    773         const int irq_cap = register_interrupt_handler(device, irq, handler,
    774             &irq_code);
     772        int ret = register_interrupt_handler(device, irq, handler, &irq_code);
    775773        irq_code_clean(&irq_code);
    776         if (irq_cap < 0) {
    777                 usb_log_error("Failed to register interrupt handler: %s.\n",
    778                     str_error(irq_cap));
    779                 return irq_cap;
    780         }
    781 
    782         /* Enable interrupts */
    783         int ret = hcd_ddf_enable_interrupts(device);
    784774        if (ret != EOK) {
    785775                usb_log_error("Failed to register interrupt handler: %s.\n",
    786776                    str_error(ret));
    787                 unregister_interrupt_handler(device, irq_cap);
    788                 return ret;
    789         }
    790         return irq_cap;
     777                return ret;
     778        }
     779
     780        /* Enable interrupts */
     781        ret = hcd_ddf_enable_interrupts(device);
     782        if (ret != EOK) {
     783                usb_log_error("Failed to register interrupt handler: %s.\n",
     784                    str_error(ret));
     785                unregister_interrupt_handler(device, irq);
     786                return ret;
     787        }
     788        assert(irq > 0);
     789        return irq;
    791790}
    792791
     
    883882        interrupt_handler_t *irq_handler =
    884883            driver->irq_handler ? driver->irq_handler : ddf_hcd_gen_irq_handler;
    885         const int irq_cap = hcd_ddf_setup_interrupts(device, &hw_res,
    886             irq_handler, driver->irq_code_gen);
    887         bool irqs_enabled = !(irq_cap < 0);
    888         if (irqs_enabled) {
     884        const int irq = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
     885            driver->irq_code_gen);
     886        if (!(irq < 0)) {
    889887                usb_log_debug("Hw interrupts enabled.\n");
    890888        }
     
    901899        /* Init hw driver */
    902900        hcd_t *hcd = dev_to_hcd(device);
    903         ret = driver->init(hcd, &hw_res, irqs_enabled);
     901        ret = driver->init(hcd, &hw_res, !(irq < 0));
    904902        hw_res_list_parsed_clean(&hw_res);
    905903        if (ret != EOK) {
     
    909907
    910908        /* Need working irq replacement to setup root hub */
    911         if (!irqs_enabled && hcd->ops.status_hook) {
     909        if ((irq < 0) && hcd->ops.status_hook) {
    912910                hcd->polling_fibril = fibril_create(interrupt_polling, hcd);
    913911                if (hcd->polling_fibril == 0) {
     
    918916                fibril_add_ready(hcd->polling_fibril);
    919917                usb_log_warning("Failed to enable interrupts: %s."
    920                     " Falling back to polling.\n", str_error(irq_cap));
     918                    " Falling back to polling.\n", str_error(irq));
    921919        }
    922920
     
    932930irq_unregister:
    933931                /* Unregistering non-existent should be ok */
    934                 unregister_interrupt_handler(device, irq_cap);
     932                unregister_interrupt_handler(device, irq);
    935933                hcd_ddf_clean_hc(device);
    936934                return ret;
Note: See TracChangeset for help on using the changeset viewer.