aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2013-10-17 03:42:25 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-10-18 14:06:59 -0400
commit1052e3a6ae461c5ebcc1f346382ca9bc3a93e1dd (patch)
tree1e0add88f94c00572483ba9f43d26fe9476283e9
parent7573afdf807e684de0fd9b1845d24ad0c7d3094d (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.c163
-rw-r--r--drivers/net/wireless/rt2x00/rt2800mmio.h6
-rw-r--r--drivers/net/wireless/rt2x00/rt2800pci.c159
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}
690EXPORT_SYMBOL_GPL(rt2800mmio_queue_init); 690EXPORT_SYMBOL_GPL(rt2800mmio_queue_init);
691 691
692/*
693 * Initialization functions.
694 */
695bool 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}
710EXPORT_SYMBOL_GPL(rt2800mmio_get_entry_state);
711
712void 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}
740EXPORT_SYMBOL_GPL(rt2800mmio_clear_entry);
741
742int 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}
806EXPORT_SYMBOL_GPL(rt2800mmio_init_queues);
807
808int 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, &reg);
816 rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX0, 1);
817 rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX1, 1);
818 rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX2, 1);
819 rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX3, 1);
820 rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX4, 1);
821 rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX5, 1);
822 rt2x00_set_field32(&reg, 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, &reg);
837 rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
838 rt2x00_set_field32(&reg, 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(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
846 rt2x00_set_field32(&reg, 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}
853EXPORT_SYMBOL_GPL(rt2800mmio_init_registers);
854
692MODULE_AUTHOR(DRV_PROJECT); 855MODULE_AUTHOR(DRV_PROJECT);
693MODULE_VERSION(DRV_VERSION); 856MODULE_VERSION(DRV_VERSION);
694MODULE_DESCRIPTION("rt2800 MMIO library"); 857MODULE_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);
153void rt2800mmio_stop_queue(struct data_queue *queue); 153void rt2800mmio_stop_queue(struct data_queue *queue);
154void rt2800mmio_queue_init(struct data_queue *queue); 154void rt2800mmio_queue_init(struct data_queue *queue);