|
@@ -930,13 +930,15 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
|
|
struct net_device *dev = dev_id;
|
|
struct net_device *dev = dev_id;
|
|
board_info_t *db = netdev_priv(dev);
|
|
board_info_t *db = netdev_priv(dev);
|
|
int int_status;
|
|
int int_status;
|
|
|
|
+ unsigned long flags;
|
|
u8 reg_save;
|
|
u8 reg_save;
|
|
|
|
|
|
dm9000_dbg(db, 3, "entering %s\n", __func__);
|
|
dm9000_dbg(db, 3, "entering %s\n", __func__);
|
|
|
|
|
|
/* A real interrupt coming */
|
|
/* A real interrupt coming */
|
|
|
|
|
|
- spin_lock(&db->lock);
|
|
|
|
|
|
+ /* holders of db->lock must always block IRQs */
|
|
|
|
+ spin_lock_irqsave(&db->lock, flags);
|
|
|
|
|
|
/* Save previous register address */
|
|
/* Save previous register address */
|
|
reg_save = readb(db->io_addr);
|
|
reg_save = readb(db->io_addr);
|
|
@@ -972,7 +974,7 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
|
|
/* Restore previous register address */
|
|
/* Restore previous register address */
|
|
writeb(reg_save, db->io_addr);
|
|
writeb(reg_save, db->io_addr);
|
|
|
|
|
|
- spin_unlock(&db->lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&db->lock, flags);
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
}
|
|
}
|