diff options
author | Helmut Schaa <helmut.schaa@googlemail.com> | 2011-03-03 13:45:16 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-03-04 14:06:48 -0500 |
commit | 0aa13b2e06fbb8327c7acb4ccf684b2b65c302ce (patch) | |
tree | 2393be04e8ea1015a8a67b52eaa13b33204aa532 /drivers/net/wireless/rt2x00/rt2800pci.c | |
parent | 567108ebd352f21640c536ea3b39584f9e7c28f8 (diff) |
rt2x00: Revise irqmask locking for PCI devices
The PCI device irqmask is locked by a spin_lock. Currently
spin_lock_irqsave is used everywhere. To reduce the locking overhead
replace spin_lock_irqsave in hard irq context with spin_lock and in
soft irq context with spin_lock_irq.
Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 49ea189c9821..b58484a80b7c 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -765,18 +765,17 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev) | |||
765 | static void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev, | 765 | static void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev, |
766 | struct rt2x00_field32 irq_field) | 766 | struct rt2x00_field32 irq_field) |
767 | { | 767 | { |
768 | unsigned long flags; | ||
769 | u32 reg; | 768 | u32 reg; |
770 | 769 | ||
771 | /* | 770 | /* |
772 | * Enable a single interrupt. The interrupt mask register | 771 | * Enable a single interrupt. The interrupt mask register |
773 | * access needs locking. | 772 | * access needs locking. |
774 | */ | 773 | */ |
775 | spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags); | 774 | spin_lock_irq(&rt2x00dev->irqmask_lock); |
776 | rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®); | 775 | rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®); |
777 | rt2x00_set_field32(®, irq_field, 1); | 776 | rt2x00_set_field32(®, irq_field, 1); |
778 | rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); | 777 | rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); |
779 | spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags); | 778 | spin_unlock_irq(&rt2x00dev->irqmask_lock); |
780 | } | 779 | } |
781 | 780 | ||
782 | static void rt2800pci_txstatus_tasklet(unsigned long data) | 781 | static void rt2800pci_txstatus_tasklet(unsigned long data) |
@@ -862,7 +861,6 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance) | |||
862 | { | 861 | { |
863 | struct rt2x00_dev *rt2x00dev = dev_instance; | 862 | struct rt2x00_dev *rt2x00dev = dev_instance; |
864 | u32 reg, mask; | 863 | u32 reg, mask; |
865 | unsigned long flags; | ||
866 | 864 | ||
867 | /* Read status and ACK all interrupts */ | 865 | /* Read status and ACK all interrupts */ |
868 | rt2800_register_read(rt2x00dev, INT_SOURCE_CSR, ®); | 866 | rt2800_register_read(rt2x00dev, INT_SOURCE_CSR, ®); |
@@ -905,11 +903,11 @@ static irqreturn_t rt2800pci_interrupt(int irq, void *dev_instance) | |||
905 | * Disable all interrupts for which a tasklet was scheduled right now, | 903 | * Disable all interrupts for which a tasklet was scheduled right now, |
906 | * the tasklet will reenable the appropriate interrupts. | 904 | * the tasklet will reenable the appropriate interrupts. |
907 | */ | 905 | */ |
908 | spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags); | 906 | spin_lock(&rt2x00dev->irqmask_lock); |
909 | rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®); | 907 | rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®); |
910 | reg &= mask; | 908 | reg &= mask; |
911 | rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); | 909 | rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); |
912 | spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags); | 910 | spin_unlock(&rt2x00dev->irqmask_lock); |
913 | 911 | ||
914 | return IRQ_HANDLED; | 912 | return IRQ_HANDLED; |
915 | } | 913 | } |