diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 3bd7226d15fa..81c49a4d679e 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -36,6 +36,9 @@ void synchronize_irq(unsigned int irq) | |||
| 36 | { | 36 | { |
| 37 | struct irq_desc *desc = irq_desc + irq; | 37 | struct irq_desc *desc = irq_desc + irq; |
| 38 | 38 | ||
| 39 | if (irq >= NR_IRQS) | ||
| 40 | return; | ||
| 41 | |||
| 39 | while (desc->status & IRQ_INPROGRESS) | 42 | while (desc->status & IRQ_INPROGRESS) |
| 40 | cpu_relax(); | 43 | cpu_relax(); |
| 41 | } | 44 | } |
| @@ -60,6 +63,9 @@ void disable_irq_nosync(unsigned int irq) | |||
| 60 | irq_desc_t *desc = irq_desc + irq; | 63 | irq_desc_t *desc = irq_desc + irq; |
| 61 | unsigned long flags; | 64 | unsigned long flags; |
| 62 | 65 | ||
| 66 | if (irq >= NR_IRQS) | ||
| 67 | return; | ||
| 68 | |||
| 63 | spin_lock_irqsave(&desc->lock, flags); | 69 | spin_lock_irqsave(&desc->lock, flags); |
| 64 | if (!desc->depth++) { | 70 | if (!desc->depth++) { |
| 65 | desc->status |= IRQ_DISABLED; | 71 | desc->status |= IRQ_DISABLED; |
| @@ -86,6 +92,9 @@ void disable_irq(unsigned int irq) | |||
| 86 | { | 92 | { |
| 87 | irq_desc_t *desc = irq_desc + irq; | 93 | irq_desc_t *desc = irq_desc + irq; |
| 88 | 94 | ||
| 95 | if (irq >= NR_IRQS) | ||
| 96 | return; | ||
| 97 | |||
| 89 | disable_irq_nosync(irq); | 98 | disable_irq_nosync(irq); |
| 90 | if (desc->action) | 99 | if (desc->action) |
| 91 | synchronize_irq(irq); | 100 | synchronize_irq(irq); |
| @@ -108,6 +117,9 @@ void enable_irq(unsigned int irq) | |||
| 108 | irq_desc_t *desc = irq_desc + irq; | 117 | irq_desc_t *desc = irq_desc + irq; |
| 109 | unsigned long flags; | 118 | unsigned long flags; |
| 110 | 119 | ||
| 120 | if (irq >= NR_IRQS) | ||
| 121 | return; | ||
| 122 | |||
| 111 | spin_lock_irqsave(&desc->lock, flags); | 123 | spin_lock_irqsave(&desc->lock, flags); |
| 112 | switch (desc->depth) { | 124 | switch (desc->depth) { |
| 113 | case 0: | 125 | case 0: |
| @@ -163,6 +175,9 @@ int setup_irq(unsigned int irq, struct irqaction * new) | |||
| 163 | unsigned long flags; | 175 | unsigned long flags; |
| 164 | int shared = 0; | 176 | int shared = 0; |
| 165 | 177 | ||
| 178 | if (irq >= NR_IRQS) | ||
| 179 | return -EINVAL; | ||
| 180 | |||
| 166 | if (desc->handler == &no_irq_type) | 181 | if (desc->handler == &no_irq_type) |
| 167 | return -ENOSYS; | 182 | return -ENOSYS; |
| 168 | /* | 183 | /* |
