Skip to content

Commit

Permalink
axnet_cs: use spin_lock_irqsave in ax_interrupt
Browse files Browse the repository at this point in the history
Use spin_lock_irqsave instead of spin_lock in ax_interrupt because
the interrupt handler can also be invoked from ei_watchdog.

Signed-off-by: Ken Kawasaki <ken_kawasaki@spring.nifty.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ken Kawasaki authored and David S. Miller committed Jul 13, 2010
1 parent 336a283 commit ab83a38
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions drivers/net/pcmcia/axnet_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1168,6 +1168,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id)
int interrupts, nr_serviced = 0, i;
struct ei_device *ei_local;
int handled = 0;
unsigned long flags;

e8390_base = dev->base_addr;
ei_local = netdev_priv(dev);
Expand All @@ -1176,7 +1177,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id)
* Protect the irq test too.
*/

spin_lock(&ei_local->page_lock);
spin_lock_irqsave(&ei_local->page_lock, flags);

if (ei_local->irqlock)
{
Expand All @@ -1188,7 +1189,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id)
dev->name, inb_p(e8390_base + EN0_ISR),
inb_p(e8390_base + EN0_IMR));
#endif
spin_unlock(&ei_local->page_lock);
spin_unlock_irqrestore(&ei_local->page_lock, flags);
return IRQ_NONE;
}

Expand Down Expand Up @@ -1261,7 +1262,7 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id)
ei_local->irqlock = 0;
outb_p(ENISR_ALL, e8390_base + EN0_IMR);

spin_unlock(&ei_local->page_lock);
spin_unlock_irqrestore(&ei_local->page_lock, flags);
return IRQ_RETVAL(handled);
}

Expand Down

0 comments on commit ab83a38

Please sign in to comment.