aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2400pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2400pci.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 76bcc354797..daa32fc9398 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -645,11 +645,6 @@ static void rt2400pci_start_queue(struct data_queue *queue)
645 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); 645 rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
646 break; 646 break;
647 case QID_BEACON: 647 case QID_BEACON:
648 /*
649 * Allow the tbtt tasklet to be scheduled.
650 */
651 tasklet_enable(&rt2x00dev->tbtt_tasklet);
652
653 rt2x00pci_register_read(rt2x00dev, CSR14, &reg); 648 rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
654 rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1); 649 rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 1);
655 rt2x00_set_field32(&reg, CSR14_TBCN, 1); 650 rt2x00_set_field32(&reg, CSR14_TBCN, 1);
@@ -715,7 +710,7 @@ static void rt2400pci_stop_queue(struct data_queue *queue)
715 /* 710 /*
716 * Wait for possibly running tbtt tasklets. 711 * Wait for possibly running tbtt tasklets.
717 */ 712 */
718 tasklet_disable(&rt2x00dev->tbtt_tasklet); 713 tasklet_kill(&rt2x00dev->tbtt_tasklet);
719 break; 714 break;
720 default: 715 default:
721 break; 716 break;
@@ -982,12 +977,6 @@ static void rt2400pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
982 if (state == STATE_RADIO_IRQ_ON) { 977 if (state == STATE_RADIO_IRQ_ON) {
983 rt2x00pci_register_read(rt2x00dev, CSR7, &reg); 978 rt2x00pci_register_read(rt2x00dev, CSR7, &reg);
984 rt2x00pci_register_write(rt2x00dev, CSR7, reg); 979 rt2x00pci_register_write(rt2x00dev, CSR7, reg);
985
986 /*
987 * Enable tasklets.
988 */
989 tasklet_enable(&rt2x00dev->txstatus_tasklet);
990 tasklet_enable(&rt2x00dev->rxdone_tasklet);
991 } 980 }
992 981
993 /* 982 /*
@@ -1011,8 +1000,9 @@ static void rt2400pci_toggle_irq(struct rt2x00_dev *rt2x00dev,
1011 * Ensure that all tasklets are finished before 1000 * Ensure that all tasklets are finished before
1012 * disabling the interrupts. 1001 * disabling the interrupts.
1013 */ 1002 */
1014 tasklet_disable(&rt2x00dev->txstatus_tasklet); 1003 tasklet_kill(&rt2x00dev->txstatus_tasklet);
1015 tasklet_disable(&rt2x00dev->rxdone_tasklet); 1004 tasklet_kill(&rt2x00dev->rxdone_tasklet);
1005 tasklet_kill(&rt2x00dev->tbtt_tasklet);
1016 } 1006 }
1017} 1007}
1018 1008
@@ -1347,22 +1337,25 @@ static void rt2400pci_txstatus_tasklet(unsigned long data)
1347 /* 1337 /*
1348 * Enable all TXDONE interrupts again. 1338 * Enable all TXDONE interrupts again.
1349 */ 1339 */
1350 spin_lock_irq(&rt2x00dev->irqmask_lock); 1340 if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) {
1341 spin_lock_irq(&rt2x00dev->irqmask_lock);
1351 1342
1352 rt2x00pci_register_read(rt2x00dev, CSR8, &reg); 1343 rt2x00pci_register_read(rt2x00dev, CSR8, &reg);
1353 rt2x00_set_field32(&reg, CSR8_TXDONE_TXRING, 0); 1344 rt2x00_set_field32(&reg, CSR8_TXDONE_TXRING, 0);
1354 rt2x00_set_field32(&reg, CSR8_TXDONE_ATIMRING, 0); 1345 rt2x00_set_field32(&reg, CSR8_TXDONE_ATIMRING, 0);
1355 rt2x00_set_field32(&reg, CSR8_TXDONE_PRIORING, 0); 1346 rt2x00_set_field32(&reg, CSR8_TXDONE_PRIORING, 0);
1356 rt2x00pci_register_write(rt2x00dev, CSR8, reg); 1347 rt2x00pci_register_write(rt2x00dev, CSR8, reg);
1357 1348
1358 spin_unlock_irq(&rt2x00dev->irqmask_lock); 1349 spin_unlock_irq(&rt2x00dev->irqmask_lock);
1350 }
1359} 1351}
1360 1352
1361static void rt2400pci_tbtt_tasklet(unsigned long data) 1353static void rt2400pci_tbtt_tasklet(unsigned long data)
1362{ 1354{
1363 struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; 1355 struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
1364 rt2x00lib_beacondone(rt2x00dev); 1356 rt2x00lib_beacondone(rt2x00dev);
1365 rt2400pci_enable_interrupt(rt2x00dev, CSR8_TBCN_EXPIRE); 1357 if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
1358 rt2400pci_enable_interrupt(rt2x00dev, CSR8_TBCN_EXPIRE);
1366} 1359}
1367 1360
1368static void rt2400pci_rxdone_tasklet(unsigned long data) 1361static void rt2400pci_rxdone_tasklet(unsigned long data)
@@ -1370,7 +1363,7 @@ static void rt2400pci_rxdone_tasklet(unsigned long data)
1370 struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; 1363 struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
1371 if (rt2x00pci_rxdone(rt2x00dev)) 1364 if (rt2x00pci_rxdone(rt2x00dev))
1372 tasklet_schedule(&rt2x00dev->rxdone_tasklet); 1365 tasklet_schedule(&rt2x00dev->rxdone_tasklet);
1373 else 1366 else if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
1374 rt2400pci_enable_interrupt(rt2x00dev, CSR8_RXDONE); 1367 rt2400pci_enable_interrupt(rt2x00dev, CSR8_RXDONE);
1375} 1368}
1376 1369