diff options
author | Weiwei Wang <weiwei.wang@windriver.com> | 2008-09-17 20:23:48 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-09-24 22:12:24 -0400 |
commit | be61ea52900b97800effbb68478915d73b5d4df2 (patch) | |
tree | 9ce76e41c78966b1da5a70eb6014c432b38995cd /drivers/net | |
parent | 315781408ef4a6ff831f8fd37c90d4bb7c234853 (diff) |
[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')
-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 fe41e4ec21ec..ce10cfa1ee53 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) | |||
2069 | static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) | 2069 | static int sbmac_start_tx(struct sk_buff *skb, struct net_device *dev) |
2070 | { | 2070 | { |
2071 | struct sbmac_softc *sc = netdev_priv(dev); | 2071 | struct sbmac_softc *sc = netdev_priv(dev); |
2072 | unsigned long flags; | ||
2072 | 2073 | ||
2073 | /* lock eth irq */ | 2074 | /* lock eth irq */ |
2074 | spin_lock_irq (&sc->sbm_lock); | 2075 | spin_lock_irqsave(&sc->sbm_lock, flags); |
2075 | 2076 | ||
2076 | /* | 2077 | /* |
2077 | * Put the buffer on the transmit ring. If we | 2078 | * 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) | |||
2081 | if (sbdma_add_txbuffer(&(sc->sbm_txdma),skb)) { | 2082 | if (sbdma_add_txbuffer(&(sc->sbm_txdma),skb)) { |
2082 | /* XXX save skb that we could not send */ | 2083 | /* XXX save skb that we could not send */ |
2083 | netif_stop_queue(dev); | 2084 | netif_stop_queue(dev); |
2084 | spin_unlock_irq(&sc->sbm_lock); | 2085 | spin_unlock_irqrestore(&sc->sbm_lock, flags); |
2085 | 2086 | ||
2086 | return 1; | 2087 | return 1; |
2087 | } | 2088 | } |
2088 | 2089 | ||
2089 | dev->trans_start = jiffies; | 2090 | dev->trans_start = jiffies; |
2090 | 2091 | ||
2091 | spin_unlock_irq (&sc->sbm_lock); | 2092 | spin_unlock_irqrestore(&sc->sbm_lock, flags); |
2092 | 2093 | ||
2093 | return 0; | 2094 | return 0; |
2094 | } | 2095 | } |
@@ -2568,14 +2569,15 @@ static void sbmac_mii_poll(struct net_device *dev) | |||
2568 | static void sbmac_tx_timeout (struct net_device *dev) | 2569 | static void sbmac_tx_timeout (struct net_device *dev) |
2569 | { | 2570 | { |
2570 | struct sbmac_softc *sc = netdev_priv(dev); | 2571 | struct sbmac_softc *sc = netdev_priv(dev); |
2572 | unsigned long flags; | ||
2571 | 2573 | ||
2572 | spin_lock_irq (&sc->sbm_lock); | 2574 | spin_lock_irqsave(&sc->sbm_lock, flags); |
2573 | 2575 | ||
2574 | 2576 | ||
2575 | dev->trans_start = jiffies; | 2577 | dev->trans_start = jiffies; |
2576 | dev->stats.tx_errors++; | 2578 | dev->stats.tx_errors++; |
2577 | 2579 | ||
2578 | spin_unlock_irq (&sc->sbm_lock); | 2580 | spin_unlock_irqrestore(&sc->sbm_lock, flags); |
2579 | 2581 | ||
2580 | printk (KERN_WARNING "%s: Transmit timed out\n",dev->name); | 2582 | printk (KERN_WARNING "%s: Transmit timed out\n",dev->name); |
2581 | } | 2583 | } |