Commit 0b9daf11 authored by David S. Miller's avatar David S. Miller

MYRI_SBUS: Replace cli/sti with spinlocking.

parent e3676f76
...@@ -546,8 +546,11 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -546,8 +546,11 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
struct myri_eth *mp = (struct myri_eth *) dev->priv; struct myri_eth *mp = (struct myri_eth *) dev->priv;
unsigned long lregs = mp->lregs; unsigned long lregs = mp->lregs;
struct myri_channel *chan = &mp->shmem->channel; struct myri_channel *chan = &mp->shmem->channel;
unsigned long flags;
u32 status; u32 status;
spin_lock_irqsave(&mp->irq_lock, flags);
status = sbus_readl(lregs + LANAI_ISTAT); status = sbus_readl(lregs + LANAI_ISTAT);
DIRQ(("myri_interrupt: status[%08x] ", status)); DIRQ(("myri_interrupt: status[%08x] ", status));
if (status & ISTAT_HOST) { if (status & ISTAT_HOST) {
...@@ -569,6 +572,8 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -569,6 +572,8 @@ static void myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
myri_enable_irq(lregs, mp->cregs); myri_enable_irq(lregs, mp->cregs);
} }
DIRQ(("\n")); DIRQ(("\n"));
spin_unlock_irqrestore(&mp->irq_lock, flags);
} }
static int myri_open(struct net_device *dev) static int myri_open(struct net_device *dev)
...@@ -622,7 +627,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -622,7 +627,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
return 1; return 1;
} }
save_and_cli(flags); spin_lock_irqsave(&mp->irq_lock, flags);
DHDR(("xmit[skbdata(%p)]\n", skb->data)); DHDR(("xmit[skbdata(%p)]\n", skb->data));
#ifdef DEBUG_HEADER #ifdef DEBUG_HEADER
...@@ -669,7 +674,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -669,7 +674,7 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
DTX(("tbusy=0, returning 0\n")); DTX(("tbusy=0, returning 0\n"));
netif_start_queue(dev); netif_start_queue(dev);
restore_flags(flags); spin_unlock_irqrestore(&mp->irq_lock, flags);
return 0; return 0;
} }
...@@ -900,6 +905,7 @@ static int __init myri_ether_init(struct net_device *dev, struct sbus_dev *sdev, ...@@ -900,6 +905,7 @@ static int __init myri_ether_init(struct net_device *dev, struct sbus_dev *sdev,
printk("%s: MyriCOM MyriNET Ethernet ", dev->name); printk("%s: MyriCOM MyriNET Ethernet ", dev->name);
mp = (struct myri_eth *) dev->priv; mp = (struct myri_eth *) dev->priv;
spin_lock_init(&mp->irq_lock);
mp->myri_sdev = sdev; mp->myri_sdev = sdev;
/* Clean out skb arrays. */ /* Clean out skb arrays. */
......
...@@ -269,6 +269,7 @@ struct myri_eth { ...@@ -269,6 +269,7 @@ struct myri_eth {
/* These are frequently accessed, keep together /* These are frequently accessed, keep together
* to obtain good cache hit rates. * to obtain good cache hit rates.
*/ */
spinlock_t irq_lock;
struct myri_shmem *shmem; /* Shared data structures. */ struct myri_shmem *shmem; /* Shared data structures. */
unsigned long cregs; /* Control register space. */ unsigned long cregs; /* Control register space. */
struct recvq *rqack; /* Where we ack rx's. */ struct recvq *rqack; /* Where we ack rx's. */
......
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