From f9607d33d8bfd172bc0964258f8da6609535531c Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 15 Dec 2015 20:41:37 +0100 Subject: [PATCH] mt7603: control mac stop/start from mac80211 Signed-off-by: Felix Fietkau --- mt7603.h | 3 +++ mt7603_init.c | 28 +++++++++++++++------------- mt7603_main.c | 2 ++ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/mt7603.h b/mt7603.h index 1e69612c..e44c16cd 100644 --- a/mt7603.h +++ b/mt7603.h @@ -108,6 +108,9 @@ static inline void mt7603_irq_disable(struct mt7603_dev *dev, u32 mask) mt7603_set_irq_mask(dev, mask, 0); } +void mt7603_mac_start(struct mt7603_dev *dev); +void mt7603_mac_stop(struct mt7603_dev *dev); + int mt7603_set_channel(struct mt7603_dev *dev, struct cfg80211_chan_def *def); int mt7603_mcu_set_channel(struct mt7603_dev *dev); int mt7603_mcu_reg_read(struct mt7603_dev *dev, u32 reg, u32 *val, bool rf); diff --git a/mt7603_init.c b/mt7603_init.c index b13bdf09..e5bcad88 100644 --- a/mt7603_init.c +++ b/mt7603_init.c @@ -92,26 +92,32 @@ mt7603_mac_reset(struct mt7603_dev *dev) /* Configure all rx packets to HIF */ mt76_wr(dev, MT_DMA_RCFR0, 0xc0200000); - return 0; -} - -int mt7603_mac_start(struct mt7603_dev *dev) -{ wait_for_wpdma(dev); udelay(50); - mt76_clear(dev, MT_WF_ARB_SCR, MT_WF_ARB_TX_DISABLE | MT_WF_ARB_RX_DISABLE); - mt76_wr(dev, MT_WF_ARB_TX_START_0, ~0); - mt76_set(dev, MT_WF_ARB_RQCR, MT_WF_ARB_RQCR_RX_START); - mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_TX_DMA_EN | MT_WPDMA_GLO_CFG_RX_DMA_EN); mt7603_irq_enable(dev, MT_INT_RX_DONE_ALL | MT_INT_TX_DONE_ALL); + return 0; } +void mt7603_mac_start(struct mt7603_dev *dev) +{ + mt76_clear(dev, MT_WF_ARB_SCR, MT_WF_ARB_TX_DISABLE | MT_WF_ARB_RX_DISABLE); + mt76_wr(dev, MT_WF_ARB_TX_START_0, ~0); + mt76_set(dev, MT_WF_ARB_RQCR, MT_WF_ARB_RQCR_RX_START); +} + +void mt7603_mac_stop(struct mt7603_dev *dev) +{ + mt76_set(dev, MT_WF_ARB_SCR, MT_WF_ARB_TX_DISABLE | MT_WF_ARB_RX_DISABLE); + mt76_wr(dev, MT_WF_ARB_TX_START_0, 0); + mt76_clear(dev, MT_WF_ARB_RQCR, MT_WF_ARB_RQCR_RX_START); +} + static void mt7603_dma_sched_init(struct mt7603_dev *dev) { @@ -235,10 +241,6 @@ mt7603_init_hardware(struct mt7603_dev *dev) dev->rxfilter = mt76_rr(dev, MT_WF_RFCR); set_bit(MT76_STATE_INITIALIZED, &dev->mt76.state); - ret = mt7603_mac_start(dev); - if (ret) - return ret; - ret = mt7603_mcu_init(dev); if (ret) return ret; diff --git a/mt7603_main.c b/mt7603_main.c index 52389b27..961c0aff 100644 --- a/mt7603_main.c +++ b/mt7603_main.c @@ -19,6 +19,7 @@ mt7603_start(struct ieee80211_hw *hw) struct mt7603_dev *dev = hw->priv; mt76_clear(dev, MT_AGG_TMP, GENMASK(31, 16)); + mt7603_mac_start(dev); return 0; } @@ -28,6 +29,7 @@ mt7603_stop(struct ieee80211_hw *hw) { struct mt7603_dev *dev = hw->priv; + mt7603_mac_stop(dev); mt76_set(dev, MT_AGG_TMP, GENMASK(31, 16)); }