net: dsa: mv88e6xxx: Mask g1 interrupts and free interrupt
authorAndrew Lunn <andrew@lunn.ch>
Sun, 20 Nov 2016 19:14:16 +0000 (20:14 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Nov 2016 02:16:13 +0000 (21:16 -0500)
Fix the g1 interrupt free code such that is masks any further
interrupts, and then releases the interrupt.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx/chip.c

index b843052d32bd6f7d1a8374ee4b60bfd2ce0a63a7..8fcef7e0d3ba1c37d3de8944ad206d1a831dab26 100644 (file)
@@ -413,6 +413,13 @@ static const struct irq_domain_ops mv88e6xxx_g1_irq_domain_ops = {
 static void mv88e6xxx_g1_irq_free(struct mv88e6xxx_chip *chip)
 {
        int irq, virq;
+       u16 mask;
+
+       mv88e6xxx_g1_read(chip, GLOBAL_CONTROL, &mask);
+       mask |= GENMASK(chip->g1_irq.nirqs, 0);
+       mv88e6xxx_g1_write(chip, GLOBAL_CONTROL, mask);
+
+       free_irq(chip->irq, chip);
 
        for (irq = 0; irq < 16; irq++) {
                virq = irq_find_mapping(chip->g1_irq.domain, irq);