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);
                        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 {                                   \
                             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);