aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2800pci.c
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2011-08-22 14:28:50 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-08-22 14:28:50 -0400
commitb38d355eaa223e420d0c45ff7a3279ea811552c5 (patch)
tree4a6b3341e1b8b72afdc19e3b9bfe8c40219c04aa /drivers/net/wireless/rt2x00/rt2800pci.c
parentca1ba7caa68520864e4b9227e67f3bbc6fed373b (diff)
parentaf2bf4b4ee58d262a9a5c1d4ce6f81835058f8b5 (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.c46
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, &reg); 203 rt2x00pci_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
211 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1); 204 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1);
212 rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1); 205 rt2x00_set_field32(&reg, 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, &reg); 434 rt2x00pci_register_read(rt2x00dev, INT_SOURCE_CSR, &reg);
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
819static void rt2800pci_tbtt_tasklet(unsigned long data) 809static 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
826static void rt2800pci_rxdone_tasklet(unsigned long data) 817static 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
842static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev) 834static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)