200
200
rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
204
* Allow beacon tasklets to be scheduled for periodic
207
tasklet_enable(&rt2x00dev->tbtt_tasklet);
208
tasklet_enable(&rt2x00dev->pretbtt_tasklet);
203
210
rt2800_register_read(rt2x00dev, BCN_TIME_CFG, ®);
204
211
rt2x00_set_field32(®, BCN_TIME_CFG_TSF_TICKING, 1);
205
212
rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 1);
206
213
rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_GEN, 1);
207
214
rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
216
rt2800_register_read(rt2x00dev, INT_TIMER_EN, ®);
217
rt2x00_set_field32(®, INT_TIMER_EN_PRE_TBTT_TIMER, 1);
218
rt2800_register_write(rt2x00dev, INT_TIMER_EN, reg);
250
261
rt2x00_set_field32(®, BCN_TIME_CFG_TBTT_ENABLE, 0);
251
262
rt2x00_set_field32(®, BCN_TIME_CFG_BEACON_GEN, 0);
252
263
rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
265
rt2800_register_read(rt2x00dev, INT_TIMER_EN, ®);
266
rt2x00_set_field32(®, INT_TIMER_EN_PRE_TBTT_TIMER, 0);
267
rt2800_register_write(rt2x00dev, INT_TIMER_EN, reg);
270
* Wait for tbtt tasklets to finish.
272
tasklet_disable(&rt2x00dev->tbtt_tasklet);
273
tasklet_disable(&rt2x00dev->pretbtt_tasklet);
408
429
if (state == STATE_RADIO_IRQ_ON) {
409
430
rt2800_register_read(rt2x00dev, INT_SOURCE_CSR, ®);
410
431
rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
434
* Enable tasklets. The beacon related tasklets are
435
* enabled when the beacon queue is started.
437
tasklet_enable(&rt2x00dev->txstatus_tasklet);
438
tasklet_enable(&rt2x00dev->rxdone_tasklet);
439
tasklet_enable(&rt2x00dev->autowake_tasklet);
442
spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
413
443
rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®);
414
444
rt2x00_set_field32(®, INT_MASK_CSR_RXDELAYINT, 0);
415
445
rt2x00_set_field32(®, INT_MASK_CSR_TXDELAYINT, 0);
430
460
rt2x00_set_field32(®, INT_MASK_CSR_RX_COHERENT, 0);
431
461
rt2x00_set_field32(®, INT_MASK_CSR_TX_COHERENT, 0);
432
462
rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg);
463
spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
465
if (state == STATE_RADIO_IRQ_OFF) {
467
* Ensure that all tasklets are finished before
468
* disabling the interrupts.
470
tasklet_disable(&rt2x00dev->txstatus_tasklet);
471
tasklet_disable(&rt2x00dev->rxdone_tasklet);
472
tasklet_disable(&rt2x00dev->autowake_tasklet);
435
476
static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
452
493
rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
453
494
rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
496
if (rt2x00_rt(rt2x00dev, RT5390)) {
497
rt2800_register_read(rt2x00dev, AUX_CTRL, ®);
498
rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1);
499
rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1);
500
rt2800_register_write(rt2x00dev, AUX_CTRL, reg);
455
503
rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
457
505
rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
476
524
static void rt2800pci_disable_radio(struct rt2x00_dev *rt2x00dev)
480
rt2800_disable_radio(rt2x00dev);
482
rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001280);
484
rt2800_register_read(rt2x00dev, WPDMA_RST_IDX, ®);
485
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, 1);
486
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, 1);
487
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX2, 1);
488
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX3, 1);
489
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX4, 1);
490
rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX5, 1);
491
rt2x00_set_field32(®, WPDMA_RST_IDX_DRX_IDX0, 1);
492
rt2800_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
494
rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
495
rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
526
if (rt2x00_is_soc(rt2x00dev)) {
527
rt2800_disable_radio(rt2x00dev);
528
rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0);
529
rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0);
498
533
static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev,
499
534
enum dev_state state)
502
* Always put the device to sleep (even when we intend to wakeup!)
503
* if the device is booting and wasn't asleep it will return
504
* failure when attempting to wakeup.
506
rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0xff, 2);
508
536
if (state == STATE_AWAKE) {
509
rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKUP, 0, 0);
537
rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKUP, 0, 0x02);
510
538
rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKUP);
539
} else if (state == STATE_SLEEP) {
540
rt2800_register_write(rt2x00dev, H2M_MAILBOX_STATUS, 0xffffffff);
541
rt2800_register_write(rt2x00dev, H2M_MAILBOX_CID, 0xffffffff);
542
rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0x01, 0xff, 0x01);
765
static void rt2800pci_enable_interrupt(struct rt2x00_dev *rt2x00dev,
766
struct rt2x00_field32 irq_field)
771
* Enable a single interrupt. The interrupt mask register
772
* access needs locking.
774
spin_lock_irq(&rt2x00dev->irqmask_lock);
775
rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®);
776
rt2x00_set_field32(®, irq_field, 1);
777
rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg);
778
spin_unlock_irq(&rt2x00dev->irqmask_lock);
735
781
static void rt2800pci_txstatus_tasklet(unsigned long data)
737
783
rt2800pci_txdone((struct rt2x00_dev *)data);
740
static irqreturn_t rt2800pci_interrupt_thread(int irq, void *dev_instance)
742
struct rt2x00_dev *rt2x00dev = dev_instance;
743
u32 reg = rt2x00dev->irqvalue[0];
746
* 1 - Pre TBTT interrupt.
748
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT))
749
rt2x00lib_pretbtt(rt2x00dev);
752
* 2 - Beacondone interrupt.
754
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TBTT))
755
rt2x00lib_beacondone(rt2x00dev);
758
* 3 - Rx ring done interrupt.
760
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_RX_DONE))
761
rt2x00pci_rxdone(rt2x00dev);
764
* 4 - Auto wakeup interrupt.
766
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_AUTO_WAKEUP))
767
rt2800pci_wakeup(rt2x00dev);
769
/* Enable interrupts again. */
770
rt2x00dev->ops->lib->set_device_state(rt2x00dev,
771
STATE_RADIO_IRQ_ON_ISR);
786
* No need to enable the tx status interrupt here as we always
787
* leave it enabled to minimize the possibility of a tx status
788
* register overflow. See comment in interrupt handler.
792
static void rt2800pci_pretbtt_tasklet(unsigned long data)
794
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
795
rt2x00lib_pretbtt(rt2x00dev);
796
rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_PRE_TBTT);
799
static void rt2800pci_tbtt_tasklet(unsigned long data)
801
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
802
rt2x00lib_beacondone(rt2x00dev);
803
rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_TBTT);
806
static void rt2800pci_rxdone_tasklet(unsigned long data)
808
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
809
rt2x00pci_rxdone(rt2x00dev);
810
rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE);
813
static void rt2800pci_autowake_tasklet(unsigned long data)
815
struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
816
rt2800pci_wakeup(rt2x00dev);
817
rt2800pci_enable_interrupt(rt2x00dev, INT_MASK_CSR_AUTO_WAKEUP);
776
820
static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
829
872
if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
830
873
return IRQ_HANDLED;
832
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS))
876
* Since INT_MASK_CSR and INT_SOURCE_CSR use the same bits
877
* for interrupts and interrupt masks we can just use the value of
878
* INT_SOURCE_CSR to create the interrupt mask.
882
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
833
883
rt2800pci_txstatus_interrupt(rt2x00dev);
835
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT) ||
836
rt2x00_get_field32(reg, INT_SOURCE_CSR_TBTT) ||
837
rt2x00_get_field32(reg, INT_SOURCE_CSR_RX_DONE) ||
838
rt2x00_get_field32(reg, INT_SOURCE_CSR_AUTO_WAKEUP)) {
840
* All other interrupts are handled in the interrupt thread.
841
* Store irqvalue for use in the interrupt thread.
843
rt2x00dev->irqvalue[0] = reg;
846
* Disable interrupts, will be enabled again in the
849
rt2x00dev->ops->lib->set_device_state(rt2x00dev,
850
STATE_RADIO_IRQ_OFF_ISR);
853
* Leave the TX_FIFO_STATUS interrupt enabled to not lose any
856
rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®);
857
rt2x00_set_field32(®, INT_MASK_CSR_TX_FIFO_STATUS, 1);
858
rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg);
860
ret = IRQ_WAKE_THREAD;
885
* Never disable the TX_FIFO_STATUS interrupt.
887
rt2x00_set_field32(&mask, INT_MASK_CSR_TX_FIFO_STATUS, 1);
890
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT))
891
tasklet_hi_schedule(&rt2x00dev->pretbtt_tasklet);
893
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TBTT))
894
tasklet_hi_schedule(&rt2x00dev->tbtt_tasklet);
896
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_RX_DONE))
897
tasklet_schedule(&rt2x00dev->rxdone_tasklet);
899
if (rt2x00_get_field32(reg, INT_SOURCE_CSR_AUTO_WAKEUP))
900
tasklet_schedule(&rt2x00dev->autowake_tasklet);
903
* Disable all interrupts for which a tasklet was scheduled right now,
904
* the tasklet will reenable the appropriate interrupts.
906
spin_lock(&rt2x00dev->irqmask_lock);
907
rt2800_register_read(rt2x00dev, INT_MASK_CSR, ®);
909
rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg);
910
spin_unlock(&rt2x00dev->irqmask_lock);
976
1026
static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
977
1027
.irq_handler = rt2800pci_interrupt,
978
.irq_handler_thread = rt2800pci_interrupt_thread,
979
.txstatus_tasklet = rt2800pci_txstatus_tasklet,
1028
.txstatus_tasklet = rt2800pci_txstatus_tasklet,
1029
.pretbtt_tasklet = rt2800pci_pretbtt_tasklet,
1030
.tbtt_tasklet = rt2800pci_tbtt_tasklet,
1031
.rxdone_tasklet = rt2800pci_rxdone_tasklet,
1032
.autowake_tasklet = rt2800pci_autowake_tasklet,
980
1033
.probe_hw = rt2800pci_probe_hw,
981
1034
.get_firmware_name = rt2800pci_get_firmware_name,
982
1035
.check_firmware = rt2800_check_firmware,
996
1049
.write_tx_desc = rt2800pci_write_tx_desc,
997
1050
.write_tx_data = rt2800_write_tx_data,
998
1051
.write_beacon = rt2800_write_beacon,
1052
.clear_beacon = rt2800_clear_beacon,
999
1053
.fill_rxdone = rt2800pci_fill_rxdone,
1000
1054
.config_shared_key = rt2800_config_shared_key,
1001
1055
.config_pairwise_key = rt2800_config_pairwise_key,
1079
1133
{ PCI_DEVICE(0x1814, 0x3592), PCI_DEVICE_DATA(&rt2800pci_ops) },
1080
1134
{ PCI_DEVICE(0x1814, 0x3593), PCI_DEVICE_DATA(&rt2800pci_ops) },
1136
#ifdef CONFIG_RT2800PCI_RT53XX
1137
{ PCI_DEVICE(0x1814, 0x5390), PCI_DEVICE_DATA(&rt2800pci_ops) },
1084
1141
#endif /* CONFIG_PCI */