|
|
@@ -261,6 +261,7 @@ static irqreturn_t mv88e6xxx_g1_irq_thread_work(struct mv88e6xxx_chip *chip)
|
|
|
unsigned int sub_irq;
|
|
|
unsigned int n;
|
|
|
u16 reg;
|
|
|
+ u16 ctl1;
|
|
|
int err;
|
|
|
|
|
|
mutex_lock(&chip->reg_lock);
|
|
|
@@ -270,13 +271,28 @@ static irqreturn_t mv88e6xxx_g1_irq_thread_work(struct mv88e6xxx_chip *chip)
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
|
- for (n = 0; n < chip->g1_irq.nirqs; ++n) {
|
|
|
- if (reg & (1 << n)) {
|
|
|
- sub_irq = irq_find_mapping(chip->g1_irq.domain, n);
|
|
|
- handle_nested_irq(sub_irq);
|
|
|
- ++nhandled;
|
|
|
+ do {
|
|
|
+ for (n = 0; n < chip->g1_irq.nirqs; ++n) {
|
|
|
+ if (reg & (1 << n)) {
|
|
|
+ sub_irq = irq_find_mapping(chip->g1_irq.domain,
|
|
|
+ n);
|
|
|
+ handle_nested_irq(sub_irq);
|
|
|
+ ++nhandled;
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ mutex_lock(&chip->reg_lock);
|
|
|
+ err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_CTL1, &ctl1);
|
|
|
+ if (err)
|
|
|
+ goto unlock;
|
|
|
+ err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, ®);
|
|
|
+unlock:
|
|
|
+ mutex_unlock(&chip->reg_lock);
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
+ ctl1 &= GENMASK(chip->g1_irq.nirqs, 0);
|
|
|
+ } while (reg & ctl1);
|
|
|
+
|
|
|
out:
|
|
|
return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE);
|
|
|
}
|