diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 9597a03..71b3033 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -949,6 +949,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) { int retval = -ENOMEM; + spin_lock_init(&rt2x00dev->irqmask_lock); mutex_init(&rt2x00dev->csr_mutex); set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index e295c59..74dd783 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c @@ -327,9 +327,11 @@ void rt2x00pci_remove(struct pci_dev *pci_dev) /* * Free all allocated data. */ + spin_lock_irq(&rt2x00dev->irqmask_lock); rt2x00lib_remove_dev(rt2x00dev); rt2x00pci_free_reg(rt2x00dev); ieee80211_free_hw(hw); + spin_unlock_irq(&rt2x00dev->irqmask_lock); /* * Free the PCI device data. */ diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 5fcd614..7be779c 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c @@ -2258,6 +2258,7 @@ static irqreturn_t rt61pci_interrupt_thread(int irq, void *dev_instance) /* Enable interrupts again. */ rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_ON_ISR); + spin_unlock(&rt2x00dev->irqmask_lock); return IRQ_HANDLED; } @@ -2268,6 +2269,7 @@ static irqreturn_t rt61pci_interrupt(int irq, void *dev_instance) u32 reg_mcu; u32 reg; + spin_lock(&rt2x00dev->irqmask_lock); /* * Get the interrupt sources & saved to local variable. * Write register value back to clear pending interrupts.