diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2400pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 39 |
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, ®); | 648 | rt2x00pci_register_read(rt2x00dev, CSR14, ®); |
654 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 1); | 649 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 1); |
655 | rt2x00_set_field32(®, CSR14_TBCN, 1); | 650 | rt2x00_set_field32(®, 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, ®); | 978 | rt2x00pci_register_read(rt2x00dev, CSR7, ®); |
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, ®); | 1343 | rt2x00pci_register_read(rt2x00dev, CSR8, ®); |
1353 | rt2x00_set_field32(®, CSR8_TXDONE_TXRING, 0); | 1344 | rt2x00_set_field32(®, CSR8_TXDONE_TXRING, 0); |
1354 | rt2x00_set_field32(®, CSR8_TXDONE_ATIMRING, 0); | 1345 | rt2x00_set_field32(®, CSR8_TXDONE_ATIMRING, 0); |
1355 | rt2x00_set_field32(®, CSR8_TXDONE_PRIORING, 0); | 1346 | rt2x00_set_field32(®, 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 | ||
1361 | static void rt2400pci_tbtt_tasklet(unsigned long data) | 1353 | static 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 | ||
1368 | static void rt2400pci_rxdone_tasklet(unsigned long data) | 1361 | static 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 | ||