From 9f85ada593cfa6a2928c06a53140891b7f7fd690 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 8 Dec 2015 15:59:36 +0100 Subject: [PATCH] mt7603: configure rx filter Signed-off-by: Felix Fietkau --- mt7603.h | 2 ++ mt7603_init.c | 1 + mt7603_main.c | 33 +++++++++++++++++++++++++++++++++ mt7603_regs.h | 24 ++++++++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/mt7603.h b/mt7603.h index f42b377c..46fb44b7 100644 --- a/mt7603.h +++ b/mt7603.h @@ -55,6 +55,8 @@ struct mt7603_dev { u32 irqmask; spinlock_t irq_lock; + u32 rxfilter; + struct mt7603_mcu mcu; struct mt76_queue q_rx; struct mt76_queue q_tx[__MT_TXQ_MAX]; diff --git a/mt7603_init.c b/mt7603_init.c index 590dd7cf..6c9ff23b 100644 --- a/mt7603_init.c +++ b/mt7603_init.c @@ -97,6 +97,7 @@ mt7603_init_hardware(struct mt7603_dev *dev) if (ret) return ret; + dev->rxfilter = mt76_rr(dev, MT_WF_RFCR); set_bit(MT76_STATE_INITIALIZED, &dev->mt76.state); ret = mt7603_mac_start(dev); diff --git a/mt7603_main.c b/mt7603_main.c index 32f1e413..a0cf4878 100644 --- a/mt7603_main.c +++ b/mt7603_main.c @@ -45,6 +45,39 @@ static void mt7603_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags, unsigned int *total_flags, u64 multicast) { + struct mt7603_dev *dev = hw->priv; + u32 flags = 0; + +#define MT76_FILTER(_flag, _hw) do { \ + flags |= *total_flags & FIF_##_flag; \ + dev->rxfilter &= ~(_hw); \ + dev->rxfilter |= !(flags & FIF_##_flag) * (_hw); \ + } while (0) + + dev->rxfilter |= MT_WF_RFCR_DROP_STBC_MULTI; + dev->rxfilter &= ~(MT_WF_RFCR_DROP_OTHER_BEACON | + MT_WF_RFCR_DROP_MCAST_FILTERED | + MT_WF_RFCR_DROP_MCAST | + MT_WF_RFCR_DROP_BCAST); + + MT76_FILTER(OTHER_BSS, MT_WF_RFCR_DROP_OTHER_BSS | + MT_WF_RFCR_DROP_OTHER_UC | + MT_WF_RFCR_DROP_OTHER_TIM | + MT_WF_RFCR_DROP_A3_MAC | + MT_WF_RFCR_DROP_A3_BSSID | + MT_WF_RFCR_DROP_A2_BSSID); + + MT76_FILTER(FCSFAIL, MT_WF_RFCR_DROP_FCSFAIL); + + MT76_FILTER(CONTROL, MT_WF_RFCR_DROP_UNWANTED_CTL | + MT_WF_RFCR_DROP_CTS | + MT_WF_RFCR_DROP_RTS | + MT_WF_RFCR_DROP_CTL_RSV | + MT_WF_RFCR_DROP_NDPA); + + *total_flags = flags; + mt76_wr(dev, MT_WF_RFCR, dev->rxfilter); + } static void diff --git a/mt7603_regs.h b/mt7603_regs.h index d933ae40..bcc919f0 100644 --- a/mt7603_regs.h +++ b/mt7603_regs.h @@ -98,6 +98,30 @@ #define MT_WF_RMAC_BASE 0x21800 #define MT_WF_RMAC(ofs) (MT_WF_RMAC_BASE + (ofs)) + +#define MT_WF_RFCR MT_WF_RMAC(0x000) +#define MT_WF_RFCR_DROP_STBC_MULTI BIT(0) +#define MT_WF_RFCR_DROP_FCSFAIL BIT(1) +#define MT_WF_RFCR_DROP_VERSION BIT(3) +#define MT_WF_RFCR_DROP_PROBEREQ BIT(4) +#define MT_WF_RFCR_DROP_MCAST BIT(5) +#define MT_WF_RFCR_DROP_BCAST BIT(6) +#define MT_WF_RFCR_DROP_MCAST_FILTERED BIT(7) +#define MT_WF_RFCR_DROP_A3_MAC BIT(8) +#define MT_WF_RFCR_DROP_A3_BSSID BIT(9) +#define MT_WF_RFCR_DROP_A2_BSSID BIT(10) +#define MT_WF_RFCR_DROP_OTHER_BEACON BIT(11) +#define MT_WF_RFCR_DROP_FRAME_REPORT BIT(12) +#define MT_WF_RFCR_DROP_CTL_RSV BIT(13) +#define MT_WF_RFCR_DROP_CTS BIT(14) +#define MT_WF_RFCR_DROP_RTS BIT(15) +#define MT_WF_RFCR_DROP_DUPLICATE BIT(16) +#define MT_WF_RFCR_DROP_OTHER_BSS BIT(17) +#define MT_WF_RFCR_DROP_OTHER_UC BIT(18) +#define MT_WF_RFCR_DROP_OTHER_TIM BIT(19) +#define MT_WF_RFCR_DROP_NDPA BIT(20) +#define MT_WF_RFCR_DROP_UNWANTED_CTL BIT(21) + #define MT_WF_RMAC_RMACDR MT_WF_RMAC(0x078) #define MT_WF_RMAC_MAXMINLEN MT_WF_RMAC(0x098) #define MT_WF_RMAC_TMR_PA MT_WF_RMAC(0x0e0)