|
@@ -1227,26 +1227,32 @@ static u8 irq_vector[NR_IRQ_VECTORS] __read_mostly = { FIRST_DEVICE_VECTOR , 0 }
|
|
|
|
|
|
static int __assign_irq_vector(int irq)
|
|
|
{
|
|
|
- static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
|
|
|
- int vector;
|
|
|
+ static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
|
|
|
+ int vector, offset, i;
|
|
|
|
|
|
BUG_ON((unsigned)irq >= NR_IRQ_VECTORS);
|
|
|
|
|
|
if (irq_vector[irq] > 0)
|
|
|
return irq_vector[irq];
|
|
|
|
|
|
- current_vector += 8;
|
|
|
- if (current_vector == SYSCALL_VECTOR)
|
|
|
- current_vector += 8;
|
|
|
-
|
|
|
- if (current_vector >= FIRST_SYSTEM_VECTOR) {
|
|
|
- offset++;
|
|
|
- if (!(offset % 8))
|
|
|
- return -ENOSPC;
|
|
|
- current_vector = FIRST_DEVICE_VECTOR + offset;
|
|
|
- }
|
|
|
-
|
|
|
vector = current_vector;
|
|
|
+ offset = current_offset;
|
|
|
+next:
|
|
|
+ vector += 8;
|
|
|
+ if (vector >= FIRST_SYSTEM_VECTOR) {
|
|
|
+ offset = (offset + 1) % 8;
|
|
|
+ vector = FIRST_DEVICE_VECTOR + offset;
|
|
|
+ }
|
|
|
+ if (vector == current_vector)
|
|
|
+ return -ENOSPC;
|
|
|
+ if (vector == SYSCALL_VECTOR)
|
|
|
+ goto next;
|
|
|
+ for (i = 0; i < NR_IRQ_VECTORS; i++)
|
|
|
+ if (irq_vector[i] == vector)
|
|
|
+ goto next;
|
|
|
+
|
|
|
+ current_vector = vector;
|
|
|
+ current_offset = offset;
|
|
|
irq_vector[irq] = vector;
|
|
|
|
|
|
return vector;
|