wifi: mt76: mt7915: fix monitor mode issues
authorFelix Fietkau <nbd@nbd.name>
Thu, 31 Aug 2023 13:13:01 +0000 (15:13 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sat, 30 Sep 2023 18:03:03 +0000 (20:03 +0200)
Enable receiving other-unicast packets
Disable RX header translation in order to proprerly receive data packets.
Fixes warnings and missed packets when rx decap offload is enabled

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/main.c
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
drivers/net/wireless/mediatek/mt76/mt7915/regs.h

index 55809d9f7a7b680c8c456c7b5ea78eb502693c5a..240483154faad9f6ba9538214391cf8e131a2d9d 100644 (file)
@@ -483,16 +483,22 @@ static int mt7915_config(struct ieee80211_hw *hw, u32 changed)
        if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
                bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
                bool band = phy->mt76->band_idx;
+               u32 rxfilter = phy->rxfilter;
 
-               if (!enabled)
-                       phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
-               else
-                       phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
+               if (!enabled) {
+                       rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
+                       dev->monitor_mask &= ~BIT(band);
+               } else {
+                       rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
+                       dev->monitor_mask |= BIT(band);
+               }
 
                mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN,
                               enabled);
+               mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_MDP_DCR0_RX_HDR_TRANS_EN,
+                              !dev->monitor_mask);
                mt76_testmode_reset(phy->mt76, true);
-               mt76_wr(dev, MT_WF_RFCR(band), phy->rxfilter);
+               mt76_wr(dev, MT_WF_RFCR(band), rxfilter);
        }
 
        mutex_unlock(&dev->mt76.mutex);
@@ -527,6 +533,7 @@ static void mt7915_configure_filter(struct ieee80211_hw *hw,
                        MT_WF_RFCR1_DROP_BA |
                        MT_WF_RFCR1_DROP_CFEND |
                        MT_WF_RFCR1_DROP_CFACK;
+       u32 rxfilter;
        u32 flags = 0;
 
 #define MT76_FILTER(_flag, _hw) do {                                   \
@@ -561,7 +568,12 @@ static void mt7915_configure_filter(struct ieee80211_hw *hw,
                             MT_WF_RFCR_DROP_NDPA);
 
        *total_flags = flags;
-       mt76_wr(dev, MT_WF_RFCR(band), phy->rxfilter);
+       rxfilter = phy->rxfilter;
+       if (hw->conf.flags & IEEE80211_CONF_MONITOR)
+               rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
+       else
+               rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
+       mt76_wr(dev, MT_WF_RFCR(band), rxfilter);
 
        if (*total_flags & FIF_CONTROL)
                mt76_clear(dev, MT_WF_RFCR1(band), ctl_flags);
index 0456e56f634804c3df0573a6363e28329ac6f8d9..795c3e6f80ca1de8bd9c9d5b16858203ea6c7479 100644 (file)
@@ -295,6 +295,8 @@ struct mt7915_dev {
        bool muru_debug;
        bool ibf;
 
+       u8 monitor_mask;
+
        struct dentry *debugfs_dir;
        struct rchan *relay_fwlog;
 
index 588cd87e24e9bef620e257d36d3ce3e9b5e1d164..89ac8e6707b8f6ea8bb3377fb3d94364bad935d0 100644 (file)
@@ -172,6 +172,7 @@ enum offs_rev {
 
 #define MT_MDP_DCR0                    MT_MDP(0x000)
 #define MT_MDP_DCR0_DAMSDU_EN          BIT(15)
+#define MT_MDP_DCR0_RX_HDR_TRANS_EN    BIT(19)
 
 #define MT_MDP_DCR1                    MT_MDP(0x004)
 #define MT_MDP_DCR1_MAX_RX_LEN         GENMASK(15, 3)