aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKomuro <komurojun-mbn@nifty.com>2007-03-08 08:13:04 +0100
committerAdrian Bunk <bunk@stusta.de>2007-03-08 08:13:04 +0100
commit1a6b8d666d090d821cbc9c07d788ac85639d74c8 (patch)
treed1d280b5d901db72a3a3c19cb76e45c26feb9b66
parentd4705d6dc74016619a1a6565dd54c7c5269c25d0 (diff)
modify 3c589_cs to be SMP safe
1. EL3WINDOW is always 1 when lock is not held. 2. The second argument of el3_interrupt is 'void *dev_id', not 'struct el3_private *lp'. Adrian Bunk: backported to 2.6.16 Signed-off-by: Komuro <komurojun-mbn@nifty.com> Signed-off-by: Adrian Bunk <bunk@stusta.de>
-rw-r--r--drivers/net/pcmcia/3c589_cs.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c
index 1c3c9c666f7..abba492ed95 100644
--- a/drivers/net/pcmcia/3c589_cs.c
+++ b/drivers/net/pcmcia/3c589_cs.c
@@ -649,11 +649,14 @@ static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
kio_addr_t ioaddr = dev->base_addr;
struct el3_private *priv = netdev_priv(dev);
+ unsigned long flags;
DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
"status %4.4x.\n", dev->name, (long)skb->len,
inw(ioaddr + EL3_STATUS));
+ spin_lock_irqsave(&priv->lock, flags);
+
priv->stats.tx_bytes += skb->len;
/* Put out the doubleword header... */
@@ -671,6 +674,7 @@ static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
dev_kfree_skb(skb);
pop_tx_status(dev);
+ spin_unlock_irqrestore(&priv->lock, flags);
return 0;
}
@@ -772,14 +776,13 @@ static void media_check(unsigned long arg)
if (!netif_device_present(dev)) goto reschedule;
- EL3WINDOW(1);
/* Check for pending interrupt with expired latency timer: with
this, we can limp along even if the interrupt is blocked */
if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
(inb(ioaddr + EL3_TIMER) == 0xff)) {
if (!lp->fast_poll)
printk(KERN_WARNING "%s: interrupt(s) dropped!\n", dev->name);
- el3_interrupt(dev->irq, lp, NULL);
+ el3_interrupt(dev->irq, dev, NULL);
lp->fast_poll = HZ;
}
if (lp->fast_poll) {