mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
net: dsa: mv88e6xxx: fix lockup on warm boot
[ Upstream commit0395823b8d] If the switch is not hardware reset on a warm boot, interrupts can be left enabled, and possibly pending. This will cause us to enter an infinite loop trying to service an interrupt we are unable to handle, thereby preventing the kernel from booting. Ensure that the global 2 interrupt sources are disabled before we claim the parent interrupt. Observed on the ZII development revision B and C platforms with reworked serdes support, and using reboot -f to reboot the platform. Fixes:dc30c35be7("net: dsa: mv88e6xxx: Implement interrupt support.") Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
9dd6cb14dd
commit
9739d3d1bb
@@ -1083,6 +1083,13 @@ int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
int err, irq, virq;
|
||||
|
||||
chip->g2_irq.masked = ~0;
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
err = mv88e6xxx_g2_int_mask(chip, ~chip->g2_irq.masked);
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
chip->g2_irq.domain = irq_domain_add_simple(
|
||||
chip->dev->of_node, 16, 0, &mv88e6xxx_g2_irq_domain_ops, chip);
|
||||
if (!chip->g2_irq.domain)
|
||||
@@ -1092,7 +1099,6 @@ int mv88e6xxx_g2_irq_setup(struct mv88e6xxx_chip *chip)
|
||||
irq_create_mapping(chip->g2_irq.domain, irq);
|
||||
|
||||
chip->g2_irq.chip = mv88e6xxx_g2_irq_chip;
|
||||
chip->g2_irq.masked = ~0;
|
||||
|
||||
chip->device_irq = irq_find_mapping(chip->g1_irq.domain,
|
||||
MV88E6XXX_G1_STS_IRQ_DEVICE);
|
||||
|
||||
Reference in New Issue
Block a user