From: Julian Haller <[email protected]>

ipipe_set_irq_affinity directly returns the value of the regular
irq_set_affinity method. As described in irq.h in the linux kernel,
the following return values indicate a success:

/*
 * Return value for chip->irq_set_affinity()
 *
 * IRQ_SET_MASK_OK      - OK, core updates irq_common_data.affinity
 * IRQ_SET_MASK_NOCPY   - OK, chip did update irq_common_data.affinity
 * IRQ_SET_MASK_OK_DONE - Same as IRQ_SET_MASK_OK for core. Special code to
 *                        support stacked irqchips, which indicates skipping
 *                        all descendent irqchips.
 */
enum {
        IRQ_SET_MASK_OK = 0,
        IRQ_SET_MASK_OK_NOCOPY,
        IRQ_SET_MASK_OK_DONE,
};

As one example, the GIC in i.MX6 devices returns IRQ_SET_MASK_OK_DONE
on success. Fix the xintr_attach function by treating all positive
return values as success.

Signed-off-by: Gunter Grau <[email protected]>
---
 kernel/cobalt/ipipe/intr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/cobalt/ipipe/intr.c b/kernel/cobalt/ipipe/intr.c
index 378c7f07d..cb15597f7 100644
--- a/kernel/cobalt/ipipe/intr.c
+++ b/kernel/cobalt/ipipe/intr.c
@@ -869,7 +869,7 @@ int xnintr_attach(struct xnintr *intr, void *cookie, const 
cpumask_t *cpumask)
                        return -EINVAL;
        }
        ret = ipipe_set_irq_affinity(intr->irq, *effective_mask);
-       if (ret)
+       if (ret < 0)
                return ret;
 #endif /* CONFIG_SMP */
 
-- 
2.25.1


Reply via email to