This fixes lockups encountered on normal PC hardware where
EFI is not used: STI in real-mode code triggered the hang.

This changes probe and open so that all sky2 interrupts are
disabled until sky2_net_irq() is called explicitly.
---
 src/drivers/net/sky2.c |   14 ++++++--------
 1 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/src/drivers/net/sky2.c b/src/drivers/net/sky2.c
index 00940af..d19757a 100644
--- a/src/drivers/net/sky2.c
+++ b/src/drivers/net/sky2.c
@@ -1130,7 +1130,7 @@ static int sky2_up(struct net_device *dev)
        struct sky2_port *sky2 = netdev_priv(dev);
        struct sky2_hw *hw = sky2->hw;
        unsigned port = sky2->port;
-       u32 imask, ramsize;
+       u32 ramsize;
        int err = -ENOMEM;
 
        netdev_link_down(dev);
@@ -1198,10 +1198,8 @@ static int sky2_up(struct net_device *dev)
        if (err)
                goto err_out;
 
-       /* Enable interrupts from phy/mac for port */
-       imask = sky2_read32(hw, B0_IMSK);
-       imask |= portirq_msk[port];
-       sky2_write32(hw, B0_IMSK, imask);
+       /* Disable interrupts */
+       sky2_write32(hw, B0_IMSK, 0);
 
        DBGIO(PFX "%s: le bases: st %p [%x], rx %p [%x], tx %p [%x]\n",
              dev->name, hw->st_le, hw->st_dma, sky2->rx_le, sky2->rx_le_map,
@@ -2250,9 +2248,11 @@ static void sky2_net_irq(struct net_device *dev, int 
enable)
 
        u32 imask = sky2_read32(hw, B0_IMSK);
        if (enable)
-               imask |= portirq_msk[sky2->port];
+               imask |= portirq_msk[sky2->port] | Y2_IS_BASE;
        else
                imask &= ~portirq_msk[sky2->port];
+       if ((imask & ~Y2_IS_BASE) == 0)
+               imask = 0;
        sky2_write32(hw, B0_IMSK, imask);
 }
 
@@ -2321,8 +2321,6 @@ static int sky2_probe(struct pci_device *pdev,
                goto err_out_free_netdev;
        }
 
-       sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
-
        sky2_show_addr(dev);
 
        if (hw->ports > 1) {
-- 
1.6.6.1

_______________________________________________
gPXE mailing list
[email protected]
http://etherboot.org/mailman/listinfo/gpxe

Reply via email to