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.