diff options
| author | Gabor Juhos <juhosg@openwrt.org> | 2013-10-17 03:42:25 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2013-10-18 14:06:59 -0400 |
| commit | 1052e3a6ae461c5ebcc1f346382ca9bc3a93e1dd (patch) | |
| tree | 1e0add88f94c00572483ba9f43d26fe9476283e9 | |
| parent | 7573afdf807e684de0fd9b1845d24ad0c7d3094d (diff) | |
rt2x00: rt2800pci: move initialization functions to the rt2800mmio module
Move the functions into a separate module, in order
to make those usable from other modules.
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800mmio.c | 163 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800mmio.h | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 159 |
3 files changed, 169 insertions, 159 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800mmio.c b/drivers/net/wireless/rt2x00/rt2800mmio.c index c42bea56ec15..7e8c22445b7b 100644 --- a/drivers/net/wireless/rt2x00/rt2800mmio.c +++ b/drivers/net/wireless/rt2x00/rt2800mmio.c | |||
| @@ -689,6 +689,169 @@ void rt2800mmio_queue_init(struct data_queue *queue) | |||
| 689 | } | 689 | } |
| 690 | EXPORT_SYMBOL_GPL(rt2800mmio_queue_init); | 690 | EXPORT_SYMBOL_GPL(rt2800mmio_queue_init); |
| 691 | 691 | ||
| 692 | /* | ||
| 693 | * Initialization functions. | ||
| 694 | */ | ||
| 695 | bool rt2800mmio_get_entry_state(struct queue_entry *entry) | ||
| 696 | { | ||
| 697 | struct queue_entry_priv_mmio *entry_priv = entry->priv_data; | ||
| 698 | u32 word; | ||
| 699 | |||
| 700 | if (entry->queue->qid == QID_RX) { | ||
| 701 | rt2x00_desc_read(entry_priv->desc, 1, &word); | ||
| 702 | |||
| 703 | return (!rt2x00_get_field32(word, RXD_W1_DMA_DONE)); | ||
| 704 | } else { | ||
| 705 | rt2x00_desc_read(entry_priv->desc, 1, &word); | ||
| 706 | |||
| 707 | return (!rt2x00_get_field32(word, TXD_W1_DMA_DONE)); | ||
| 708 | } | ||
| 709 | } | ||
| 710 | EXPORT_SYMBOL_GPL(rt2800mmio_get_entry_state); | ||
| 711 | |||
| 712 | void rt2800mmio_clear_entry(struct queue_entry *entry) | ||
| 713 | { | ||
| 714 | struct queue_entry_priv_mmio *entry_priv = entry->priv_data; | ||
| 715 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
| 716 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | ||
| 717 | u32 word; | ||
| 718 | |||
| 719 | if (entry->queue->qid == QID_RX) { | ||
| 720 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
| 721 | rt2x00_set_field32(&word, RXD_W0_SDP0, skbdesc->skb_dma); | ||
| 722 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
| 723 | |||
| 724 | rt2x00_desc_read(entry_priv->desc, 1, &word); | ||
| 725 | rt2x00_set_field32(&word, RXD_W1_DMA_DONE, 0); | ||
| 726 | rt2x00_desc_write(entry_priv->desc, 1, word); | ||
| 727 | |||
| 728 | /* | ||
| 729 | * Set RX IDX in register to inform hardware that we have | ||
| 730 | * handled this entry and it is available for reuse again. | ||
| 731 | */ | ||
| 732 | rt2x00mmio_register_write(rt2x00dev, RX_CRX_IDX, | ||
| 733 | entry->entry_idx); | ||
| 734 | } else { | ||
| 735 | rt2x00_desc_read(entry_priv->desc, 1, &word); | ||
| 736 | rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 1); | ||
| 737 | rt2x00_desc_write(entry_priv->desc, 1, word); | ||
| 738 | } | ||
| 739 | } | ||
| 740 | EXPORT_SYMBOL_GPL(rt2800mmio_clear_entry); | ||
| 741 | |||
| 742 | int rt2800mmio_init_queues(struct rt2x00_dev *rt2x00dev) | ||
| 743 | { | ||
| 744 | struct queue_entry_priv_mmio *entry_priv; | ||
| 745 | |||
| 746 | /* | ||
| 747 | * Initialize registers. | ||
| 748 | */ | ||
| 749 | entry_priv = rt2x00dev->tx[0].entries[0].priv_data; | ||
| 750 | rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR0, | ||
| 751 | entry_priv->desc_dma); | ||
| 752 | rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT0, | ||
| 753 | rt2x00dev->tx[0].limit); | ||
| 754 | rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX0, 0); | ||
| 755 | rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX0, 0); | ||
| 756 | |||
| 757 | entry_priv = rt2x00dev->tx[1].entries[0].priv_data; | ||
| 758 | rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR1, | ||
| 759 | entry_priv->desc_dma); | ||
| 760 | rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT1, | ||
| 761 | rt2x00dev->tx[1].limit); | ||
| 762 | rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX1, 0); | ||
| 763 | rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX1, 0); | ||
| 764 | |||
| 765 | entry_priv = rt2x00dev->tx[2].entries[0].priv_data; | ||
| 766 | rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR2, | ||
| 767 | entry_priv->desc_dma); | ||
| 768 | rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT2, | ||
| 769 | rt2x00dev->tx[2].limit); | ||
| 770 | rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX2, 0); | ||
| 771 | rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX2, 0); | ||
| 772 | |||
| 773 | entry_priv = rt2x00dev->tx[3].entries[0].priv_data; | ||
| 774 | rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR3, | ||
| 775 | entry_priv->desc_dma); | ||
| 776 | rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT3, | ||
| 777 | rt2x00dev->tx[3].limit); | ||
| 778 | rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX3, 0); | ||
| 779 | rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX3, 0); | ||
| 780 | |||
| 781 | rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR4, 0); | ||
| 782 | rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT4, 0); | ||
| 783 | rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX4, 0); | ||
| 784 | rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX4, 0); | ||
| 785 | |||
| 786 | rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR5, 0); | ||
| 787 | rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT5, 0); | ||
| 788 | rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX5, 0); | ||
| 789 | rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX5, 0); | ||
| 790 | |||
| 791 | entry_priv = rt2x00dev->rx->entries[0].priv_data; | ||
| 792 | rt2x00mmio_register_write(rt2x00dev, RX_BASE_PTR, | ||
| 793 | entry_priv->desc_dma); | ||
| 794 | rt2x00mmio_register_write(rt2x00dev, RX_MAX_CNT, | ||
| 795 | rt2x00dev->rx[0].limit); | ||
| 796 | rt2x00mmio_register_write(rt2x00dev, RX_CRX_IDX, | ||
| 797 | rt2x00dev->rx[0].limit - 1); | ||
| 798 | rt2x00mmio_register_write(rt2x00dev, RX_DRX_IDX, 0); | ||
| 799 | |||
| 800 | rt2800_disable_wpdma(rt2x00dev); | ||
| 801 | |||
| 802 | rt2x00mmio_register_write(rt2x00dev, DELAY_INT_CFG, 0); | ||
| 803 | |||
| 804 | return 0; | ||
| 805 | } | ||
| 806 | EXPORT_SYMBOL_GPL(rt2800mmio_init_queues); | ||
| 807 | |||
| 808 | int rt2800mmio_init_registers(struct rt2x00_dev *rt2x00dev) | ||
| 809 | { | ||
| 810 | u32 reg; | ||
| 811 | |||
| 812 | /* | ||
| 813 | * Reset DMA indexes | ||
| 814 | */ | ||
| 815 | rt2x00mmio_register_read(rt2x00dev, WPDMA_RST_IDX, ®); | ||
| 816 | rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX0, 1); | ||
| 817 | rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX1, 1); | ||
| 818 | rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX2, 1); | ||
| 819 | rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX3, 1); | ||
| 820 | rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX4, 1); | ||
| 821 | rt2x00_set_field32(®, WPDMA_RST_IDX_DTX_IDX5, 1); | ||
| 822 | rt2x00_set_field32(®, WPDMA_RST_IDX_DRX_IDX0, 1); | ||
| 823 | rt2x00mmio_register_write(rt2x00dev, WPDMA_RST_IDX, reg); | ||
| 824 | |||
| 825 | rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f); | ||
| 826 | rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00); | ||
| 827 | |||
| 828 | if (rt2x00_is_pcie(rt2x00dev) && | ||
| 829 | (rt2x00_rt(rt2x00dev, RT3090) || | ||
| 830 | rt2x00_rt(rt2x00dev, RT3390) || | ||
| 831 | rt2x00_rt(rt2x00dev, RT3572) || | ||
| 832 | rt2x00_rt(rt2x00dev, RT3593) || | ||
| 833 | rt2x00_rt(rt2x00dev, RT5390) || | ||
| 834 | rt2x00_rt(rt2x00dev, RT5392) || | ||
| 835 | rt2x00_rt(rt2x00dev, RT5592))) { | ||
| 836 | rt2x00mmio_register_read(rt2x00dev, AUX_CTRL, ®); | ||
| 837 | rt2x00_set_field32(®, AUX_CTRL_FORCE_PCIE_CLK, 1); | ||
| 838 | rt2x00_set_field32(®, AUX_CTRL_WAKE_PCIE_EN, 1); | ||
| 839 | rt2x00mmio_register_write(rt2x00dev, AUX_CTRL, reg); | ||
| 840 | } | ||
| 841 | |||
| 842 | rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003); | ||
| 843 | |||
| 844 | reg = 0; | ||
| 845 | rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_CSR, 1); | ||
| 846 | rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1); | ||
| 847 | rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, reg); | ||
| 848 | |||
| 849 | rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000); | ||
| 850 | |||
| 851 | return 0; | ||
| 852 | } | ||
| 853 | EXPORT_SYMBOL_GPL(rt2800mmio_init_registers); | ||
| 854 | |||
| 692 | MODULE_AUTHOR(DRV_PROJECT); | 855 | MODULE_AUTHOR(DRV_PROJECT); |
| 693 | MODULE_VERSION(DRV_VERSION); | 856 | MODULE_VERSION(DRV_VERSION); |
| 694 | MODULE_DESCRIPTION("rt2800 MMIO library"); | 857 | MODULE_DESCRIPTION("rt2800 MMIO library"); |
diff --git a/drivers/net/wireless/rt2x00/rt2800mmio.h b/drivers/net/wireless/rt2x00/rt2800mmio.h index 676df2e62d45..392895a3208e 100644 --- a/drivers/net/wireless/rt2x00/rt2800mmio.h +++ b/drivers/net/wireless/rt2x00/rt2800mmio.h | |||
| @@ -153,4 +153,10 @@ void rt2800mmio_kick_queue(struct data_queue *queue); | |||
| 153 | void rt2800mmio_stop_queue(struct data_queue *queue); | 153 | void rt2800mmio_stop_queue(struct data_queue *queue); |
| 154 | void rt2800mmio_queue_init(struct data_queue *queue); | 154 | void rt2800mmio_queue_init(struct data_queue *queue); |
