Changeset 071a1ddb in mainline for uspace/lib


Ignore:
Timestamp:
2017-12-08T21:17:27Z (8 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0722869, 569a51a
Parents:
9233e9d
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2017-12-08 00:30:18)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2017-12-08 21:17:27)
Message:

Return IRQ handles via a separate out parameter in all uspace code.

Location:
uspace/lib
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/async.c

    r9233e9d r071a1ddb  
    10511051 * @param ucode   Top-half pseudocode handler.
    10521052 *
    1053  * @return IRQ capability handle on success.
     1053 * @param[out] handle  IRQ capability handle on success.
     1054 *
    10541055 * @return Negative error code.
    10551056 *
    10561057 */
    10571058int async_irq_subscribe(int inr, async_notification_handler_t handler,
    1058     void *data, const irq_code_t *ucode)
     1059    void *data, const irq_code_t *ucode, cap_handle_t *handle)
    10591060{
    10601061        notification_t *notification =
     
    10781079        cap_handle_t cap;
    10791080        int rc = ipc_irq_subscribe(inr, imethod, ucode, &cap);
    1080         if (rc != EOK) {
    1081                 return rc;
    1082         }
    1083         return cap;
     1081        if (rc == EOK && handle != NULL) {
     1082                *handle = cap;
     1083        }
     1084        return rc;
    10841085}
    10851086
  • uspace/lib/c/include/async.h

    r9233e9d r071a1ddb  
    169169
    170170extern int async_irq_subscribe(int, async_notification_handler_t, void *,
    171     const irq_code_t *);
     171    const irq_code_t *, cap_handle_t *);
    172172extern int async_irq_unsubscribe(int);
    173173
  • uspace/lib/drv/generic/interrupt.c

    r9233e9d r071a1ddb  
    4444
    4545int register_interrupt_handler(ddf_dev_t *dev, int irq,
    46     interrupt_handler_t *handler, const irq_code_t *irq_code)
     46    interrupt_handler_t *handler, const irq_code_t *irq_code,
     47    cap_handle_t *handle)
    4748{
    4849        return async_irq_subscribe(irq, (async_notification_handler_t) handler,
    49             dev, irq_code);
     50            dev, irq_code, handle);
    5051}
    5152
  • uspace/lib/drv/include/ddf/interrupt.h

    r9233e9d r071a1ddb  
    5151
    5252extern int register_interrupt_handler(ddf_dev_t *, int, interrupt_handler_t *,
    53     const irq_code_t *);
     53    const irq_code_t *, cap_handle_t *);
    5454extern int unregister_interrupt_handler(ddf_dev_t *, int);
    5555
  • uspace/lib/usbhost/include/usb/host/ddf_helpers.h

    r9233e9d r071a1ddb  
    7575    const hw_res_list_parsed_t *hw_res,
    7676    interrupt_handler_t handler,
    77     int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *));
     77    int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *),
     78    cap_handle_t *handle);
    7879void ddf_hcd_gen_irq_handler(ipc_call_t *call, ddf_dev_t *dev);
    7980
  • uspace/lib/usbhost/src/ddf_helpers.c

    r9233e9d r071a1ddb  
    742742 * @param[in] gen_irq_code IRQ code generator.
    743743 *
    744  * @return IRQ capability handle on success.
    745  * @return Negative error code.
     744 * @param[out] handle  IRQ capability handle on success.
     745 *
     746 * @return Error code.
    746747 */
    747748int hcd_ddf_setup_interrupts(ddf_dev_t *device,
    748749    const hw_res_list_parsed_t *hw_res,
    749750    interrupt_handler_t handler,
    750     int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *hw_res))
     751    int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *hw_res),
     752    cap_handle_t *handle)
    751753{
    752754
     
    765767
    766768        /* Register handler to avoid interrupt lockup */
    767         const int irq_cap = register_interrupt_handler(device, irq, handler,
    768             &irq_code);
     769        int ret = register_interrupt_handler(device, irq, handler,
     770            &irq_code, handle);
    769771        irq_code_clean(&irq_code);
    770         if (irq_cap < 0) {
    771                 usb_log_error("Failed to register interrupt handler: %s.\n",
    772                     str_error(irq_cap));
    773                 return irq_cap;
    774         }
    775 
    776         /* Enable interrupts */
    777         int ret = hcd_ddf_enable_interrupt(device, irq);
    778772        if (ret != EOK) {
    779773                usb_log_error("Failed to register interrupt handler: %s.\n",
    780774                    str_error(ret));
    781                 unregister_interrupt_handler(device, irq_cap);
    782                 return ret;
    783         }
    784         return irq_cap;
     775                return ret;
     776        }
     777
     778        /* Enable interrupts */
     779        ret = hcd_ddf_enable_interrupt(device, irq);
     780        if (ret != EOK) {
     781                usb_log_error("Failed to register interrupt handler: %s.\n",
     782                    str_error(ret));
     783                unregister_interrupt_handler(device, *handle);
     784        }
     785        return ret;
    785786}
    786787
     
    876877        interrupt_handler_t *irq_handler =
    877878            driver->irq_handler ? driver->irq_handler : ddf_hcd_gen_irq_handler;
    878         const int irq_cap = hcd_ddf_setup_interrupts(device, &hw_res,
    879             irq_handler, driver->irq_code_gen);
    880         bool irqs_enabled = !(irq_cap < 0);
     879        int irq_cap;
     880        ret = hcd_ddf_setup_interrupts(device, &hw_res,
     881            irq_handler, driver->irq_code_gen, &irq_cap);
     882        bool irqs_enabled = (ret == EOK);
    881883        if (irqs_enabled) {
    882884                usb_log_debug("Hw interrupts enabled.\n");
    883885        }
    884886
    885         if (driver->claim)
     887        if (driver->claim) {
    886888                ret = driver->claim(device);
    887         if (ret != EOK) {
    888                 usb_log_error("Failed to claim `%s' for driver `%s'",
    889                     ddf_dev_get_name(device), driver->name);
    890                 return ret;
     889                if (ret != EOK) {
     890                        usb_log_error("Failed to claim `%s' for driver `%s'",
     891                            ddf_dev_get_name(device), driver->name);
     892                        return ret;
     893                }
    891894        }
    892895
Note: See TracChangeset for help on using the changeset viewer.