diff options
author | John W. Linville <linville@tuxdriver.com> | 2011-08-22 14:28:50 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-08-22 14:28:50 -0400 |
commit | b38d355eaa223e420d0c45ff7a3279ea811552c5 (patch) | |
tree | 4a6b3341e1b8b72afdc19e3b9bfe8c40219c04aa /drivers/net/wireless/rt2x00/rt2800pci.c | |
parent | ca1ba7caa68520864e4b9227e67f3bbc6fed373b (diff) | |
parent | af2bf4b4ee58d262a9a5c1d4ce6f81835058f8b5 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Conflicts:
drivers/staging/ath6kl/miscdrv/ar3kps/ar3kpsparser.c
drivers/staging/ath6kl/os/linux/ar6000_drv.c
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index ebc17ad61de..cabf249aa55 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -200,13 +200,6 @@ static void rt2800pci_start_queue(struct data_queue *queue) | |||
200 | rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg); | 200 | rt2x00pci_register_write(rt2x00dev, MAC_SYS_CTRL, reg); |
201 | break; | 201 | break; |
202 | case QID_BEACON: | 202 | case QID_BEACON: |
203 | /* | ||
204 | * Allow beacon tasklets to be scheduled for periodic | ||
205 | * beacon updates. | ||
206 | */ | ||
207 | tasklet_enable(&rt2x00dev->tbtt_tasklet); | ||
208 | tasklet_enable(&rt2x00dev->pretbtt_tasklet); | ||
209 | |||
210 | rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, ®); | 203 | rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, ®); |
211 | rt2x00_set_field32(®, BCN_TIME_CFG_TSF_TICKING, 1); | 204 | rt2x00_set_field32(®, BCN_TIME_CFG_TSF_TICKING, 1); |
212 | rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 1); | 205 | rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 1); |
@@ -269,10 +262,13 @@ static void rt2800pci_stop_queue(struct data_queue *queue) | |||
269 | rt2x00pci_register_write(rt2x00dev, INT_TIMER_EN, reg); | 262 | rt2x00pci_register_write(rt2x00dev, INT_TIMER_EN, reg); |
270 | 263 | ||
271 | /* | 264 | /* |
272 | * Wait for tbtt tasklets to finish. | 265 | * Wait for current invocation to finish. The tasklet |
266 | * won't be scheduled anymore afterwards since we disabled | ||
267 | * the TBTT and PRE TBTT timer. | ||
273 | */ | 268 | */ |
274 | tasklet_disable(&rt2x00dev->tbtt_tasklet); | 269 | tasklet_kill(&rt2x00dev->tbtt_tasklet); |
275 | tasklet_disable(&rt2x00dev->pretbtt_tasklet); | 270 | tasklet_kill(&rt2x00dev->pretbtt_tasklet); |
271 | |||
276 | break; | 272 | break; |
277 | default: | 273 | default: |
278 | break; | 274 | break; |
@@ -437,14 +433,6 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev, | |||
437 | if (state == STATE_RADIO_IRQ_ON) { | 433 | if (state == STATE_RADIO_IRQ_ON) { |
438 | rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, ®); | 434 | rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, ®); |
439 | rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg); | 435 | rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg); |
440 | |||
441 | /* | ||
442 | * Enable tasklets. The beacon related tasklets are | ||
443 | * enabled when the beacon queue is started. | ||
444 | */ | ||
445 | tasklet_enable(&rt2x00dev->txstatus_tasklet); | ||
446 | tasklet_enable(&rt2x00dev->rxdone_tasklet); | ||
447 | tasklet_enable(&rt2x00dev->autowake_tasklet); | ||
448 | } | 436 | } |
449 | 437 | ||
450 | spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags); | 438 | spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags); |
@@ -472,12 +460,13 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev, | |||
472 | 460 | ||
473 | if (state == STATE_RADIO_IRQ_OFF) { | 461 | if (state == STATE_RADIO_IRQ_OFF) { |
474 | /* | 462 | /* |
475 | * Ensure that all tasklets are finished before | 463 | * Wait for possibly running tasklets to finish. |
476 | * disabling the interrupts. | ||
477 | */ | 464 | */ |
478 | tasklet_disable(&rt2x00dev->txstatus_tasklet); | 465 | tasklet_kill(&rt2x00dev->txstatus_tasklet); |
479 | tasklet_disable(&rt2x00dev->rxdone_tasklet); | 466 | tasklet_kill(&rt2x00dev->rxdone_tasklet); |
480 | tasklet_disable(&rt2x00dev->autowake_tasklet); | 467 | tasklet_kill(&rt2x00dev->autowake_tasklet); |
468 | tasklet_kill(&rt2x00dev->tbtt_tasklet); | ||
469 | tasklet_kill(&rt2x00dev->pretbtt_tasklet); | ||
481 | } | 470 | } |
482 | } | 471 | } |
483 | 472 | ||
@@ -813,14 +802,16 @@ static void rt2800pci_pretbtt_tasklet(unsigned long data) | |||
813 | { | 802 | { |
814 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; | 803 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; |
815 | rt2x00lib_pretbtt(rt2x00dev); | 804 | rt2x00lib_pretbtt(rt2x00dev); |
816 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_PRE_TBTT); | 805 | if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) |
806 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_PRE_TBTT); | ||
817 | } | 807 | } |
818 | 808 | ||
819 | static void rt2800pci_tbtt_tasklet(unsigned long data) | 809 | static void rt2800pci_tbtt_tasklet(unsigned long data) |
820 | { | 810 | { |
821 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; | 811 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; |
822 | rt2x00lib_beacondone(rt2x00dev); | 812 | rt2x00lib_beacondone(rt2x00dev); |
823 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_TBTT); | 813 | if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) |
814 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_TBTT); | ||
824 | } | 815 | } |
825 | 816 | ||
826 | static void rt2800pci_rxdone_tasklet(unsigned long data) | 817 | static void rt2800pci_rxdone_tasklet(unsigned long data) |
@@ -828,7 +819,7 @@ static void rt2800pci_rxdone_tasklet(unsigned long data) | |||
828 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; | 819 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; |
829 | if (rt2x00pci_rxdone(rt2x00dev)) | 820 | if (rt2x00pci_rxdone(rt2x00dev)) |
830 | tasklet_schedule(&rt2x00dev->rxdone_tasklet); | 821 | tasklet_schedule(&rt2x00dev->rxdone_tasklet); |
831 | else | 822 | else if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) |
832 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE); | 823 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE); |
833 | } | 824 | } |
834 | 825 | ||
@@ -836,7 +827,8 @@ static void rt2800pci_autowake_tasklet(unsigned long data) | |||
836 | { | 827 | { |
837 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; | 828 | struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; |
838 | rt2800pci_wakeup(rt2x00dev); | 829 | rt2800pci_wakeup(rt2x00dev); |
839 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_AUTO_WAKEUP); | 830 | if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) |
831 | rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_AUTO_WAKEUP); | ||
840 | } | 832 | } |
841 | 833 | ||
842 | static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev) | 834 | static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev) |