diff options
author | Weiwei Wang <weiwei.wang@windriver.com> | 2008-09-18 08:23:48 +0800 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-09-24 22:12:24 -0400 |
commit | be61ea52900b97800effbb68478915d73b5d4df2 (patch) | |
tree | 9ce76e41c78966b1da5a70eb6014c432b38995cd /drivers/net/sb1250-mac.c | |
parent | 315781408ef4a6ff831f8fd37c90d4bb7c234853 (diff) | |
download | op-kernel-dev-be61ea52900b97800effbb68478915d73b5d4df2.zip op-kernel-dev-be61ea52900b97800effbb68478915d73b5d4df2.tar.gz |
[netdrvr] convert sbmac tx to spin_lock_irqsave to prevent early IRQ enable
Netpoll will call the interrupt handler with interrupts
disabled when using kgdboe, so spin_lock_irqsave() should
be used instead of spin_lock_irq() to prevent interrupts
from being incorrectly enabled.
Signed-off-by: Weiwei Wang <weiwei.wang@windriver.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/sb1250-mac.c')
-rw-r--r-- | drivers/net/sb1250-mac.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/net/sb1250-mac.c b/drivers/net/sb1250-mac.c index fe41e4e..ce10cfa 100644 --- a/drivers/net/sb1250-mac.c +++ b/drivers/net/sb1250-mac.c @@ -2069,9 +2069,10 @@ static irqreturn_t sbmac_intr(int irq,void *dev_instance) static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) { struct sbmac_softc *sc = netdev_priv(dev); + unsigned long flags; /* lock eth irq */ - spin_lock_irq (&sc->sbm_lock); + spin_lock_irqsave(&sc->sbm_lock, flags); /* * Put the buffer on the transmit ring. If we @@ -2081,14 +2082,14 @@ static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) if (sbdma_add_txbuffer(&(sc->sbm_txdma),skb)) { /* XXX save skb that we could not send */ netif_stop_queue(dev); - spin_unlock_irq(&sc->sbm_lock); + spin_unlock_irqrestore(&sc->sbm_lock, flags); return 1; } dev->trans_start = jiffies; - spin_unlock_irq (&sc->sbm_lock); + spin_unlock_irqrestore(&sc->sbm_lock, flags); return 0; } @@ -2568,14 +2569,15 @@ static void sbmac_mii_poll(struct net_device *dev) static void sbmac_tx_timeout (struct net_device *dev) { struct sbmac_softc *sc = netdev_priv(dev); + unsigned long flags; - spin_lock_irq (&sc->sbm_lock); + spin_lock_irqsave(&sc->sbm_lock, flags); dev->trans_start = jiffies; dev->stats.tx_errors++; - spin_unlock_irq (&sc->sbm_lock); + spin_unlock_irqrestore(&sc->sbm_lock, flags); printk (KERN_WARNING "%s: Transmit timed out\n",dev->name); } |