lkml.org 
[lkml]   [2020]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 015/123] net: dsa: mv88e6xxx: fix lockup on warm boot
    Date
    From: Russell King <rmk+kernel@armlinux.org.uk>

    [ Upstream commit 0395823b8d9a4d87bd1bf74359123461c2ae801b ]

    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: dc30c35be720 ("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>
    ---
    drivers/net/dsa/mv88e6xxx/global2.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    --- a/drivers/net/dsa/mv88e6xxx/global2.c
    +++ b/drivers/net/dsa/mv88e6xxx/global2.c
    @@ -1083,6 +1083,13 @@ int mv88e6xxx_g2_irq_setup(struct mv88e6
    {
    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 mv88e6
    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);

    \
     
     \ /
      Last update: 2020-03-17 12:01    [W:4.510 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site