Commit d08d2839 authored by Komuro's avatar Komuro Committed by Jeff Garzik

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'.

Signed-off-by: komurojun-mbn@nifty.com
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 2596627c
...@@ -606,11 +606,14 @@ static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -606,11 +606,14 @@ static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
kio_addr_t ioaddr = dev->base_addr; kio_addr_t ioaddr = dev->base_addr;
struct el3_private *priv = netdev_priv(dev); struct el3_private *priv = netdev_priv(dev);
unsigned long flags;
DEBUG(3, "%s: el3_start_xmit(length = %ld) called, " DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
"status %4.4x.\n", dev->name, (long)skb->len, "status %4.4x.\n", dev->name, (long)skb->len,
inw(ioaddr + EL3_STATUS)); inw(ioaddr + EL3_STATUS));
spin_lock_irqsave(&priv->lock, flags);
priv->stats.tx_bytes += skb->len; priv->stats.tx_bytes += skb->len;
/* Put out the doubleword header... */ /* Put out the doubleword header... */
...@@ -628,6 +631,7 @@ static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -628,6 +631,7 @@ static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
dev_kfree_skb(skb); dev_kfree_skb(skb);
pop_tx_status(dev); pop_tx_status(dev);
spin_unlock_irqrestore(&priv->lock, flags);
return 0; return 0;
} }
...@@ -729,14 +733,13 @@ static void media_check(unsigned long arg) ...@@ -729,14 +733,13 @@ static void media_check(unsigned long arg)
if (!netif_device_present(dev)) goto reschedule; if (!netif_device_present(dev)) goto reschedule;
EL3WINDOW(1);
/* Check for pending interrupt with expired latency timer: with /* Check for pending interrupt with expired latency timer: with
this, we can limp along even if the interrupt is blocked */ this, we can limp along even if the interrupt is blocked */
if ((inw(ioaddr + EL3_STATUS) & IntLatch) && if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
(inb(ioaddr + EL3_TIMER) == 0xff)) { (inb(ioaddr + EL3_TIMER) == 0xff)) {
if (!lp->fast_poll) if (!lp->fast_poll)
printk(KERN_WARNING "%s: interrupt(s) dropped!\n", dev->name); printk(KERN_WARNING "%s: interrupt(s) dropped!\n", dev->name);
el3_interrupt(dev->irq, lp); el3_interrupt(dev->irq, dev);
lp->fast_poll = HZ; lp->fast_poll = HZ;
} }
if (lp->fast_poll) { if (lp->fast_poll) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment