@@ -562,6 +562,12 @@ static void __mt7915_configure_filter(struct ieee80211_hw *hw,
MT_WF_RFCR1_DROP_BF_POLL |
MT_WF_RFCR1_DROP_BA |
MT_WF_RFCR1_DROP_CFEND |
+ MT_WF_RFCR1_DROP_PS_BFRPOL |
+ MT_WF_RFCR1_DROP_PS_NDPA |
+ MT_WF_RFCR1_DROP_NO2ME_TF |
+ MT_WF_RFCR1_DROP_NON_MUBAR_TF |
+ MT_WF_RFCR1_DROP_RXS_BRP |
+ MT_WF_RFCR1_DROP_TF_BFRP |
MT_WF_RFCR1_DROP_CFACK;
u32 flags = 0;
bool is_promisc = *total_flags & FIF_CONTROL || phy->monitor_vif ||
@@ -587,7 +593,9 @@ static void __mt7915_configure_filter(struct ieee80211_hw *hw,
MT_WF_RFCR_DROP_BCAST |
MT_WF_RFCR_DROP_DUPLICATE |
MT_WF_RFCR_DROP_A2_BSSID |
- MT_WF_RFCR_DROP_UNWANTED_CTL |
+ MT_WF_RFCR_DROP_UNWANTED_CTL | /* 0 means drop */
+ MT_WF_RFCR_IND_FILTER_EN_OF_31_23_BIT |
+ MT_WF_RFCR_DROP_DIFFBSSIDMGT_CTRL |
MT_WF_RFCR_DROP_STBC_MULTI);
phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
@@ -602,8 +610,22 @@ static void __mt7915_configure_filter(struct ieee80211_hw *hw,
MT_WF_RFCR_DROP_RTS |
MT_WF_RFCR_DROP_CTL_RSV |
MT_WF_RFCR_DROP_NDPA);
- if (is_promisc)
+ if (is_promisc) {
phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
+ phy->rxfilter |= MT_WF_RFCR_IND_FILTER_EN_OF_31_23_BIT;
+ if (flags & FIF_CONTROL) {
+ phy->rxfilter |= MT_WF_RFCR_DROP_UNWANTED_CTL; /* 1 means receive */
+ phy->rxfilter |= MT_WF_RFCR_SECOND_BCN_EN;
+ phy->rxfilter |= MT_WF_RFCR_RX_MGMT_FRAME_CTRL;
+ phy->rxfilter |= MT_WF_RFCR_RX_SAMEBSSIDPRORESP_CTRL;
+ phy->rxfilter |= MT_WF_RFCR_RX_DIFFBSSIDPRORESP_CTRL;
+ phy->rxfilter |= MT_WF_RFCR_RX_SAMEBSSIDBCN_CTRL;
+ phy->rxfilter |= MT_WF_RFCR_RX_SAMEBSSIDNULL_CTRL;
+ phy->rxfilter |= MT_WF_RFCR_RX_DIFFBSSIDNULL_CTRL;
+ phy->rxfilter &= ~(MT_WF_RFCR_DROP_DIFFBSSIDMGT_CTRL);
+ }
+ phy->rxfilter |= MT_WF_RFCR_RX_DATA_FRAME_CTRL;
+ }
*total_flags = flags;
mt76_wr(dev, MT_WF_RFCR(band), phy->rxfilter);
@@ -547,6 +547,16 @@ enum offs_rev {
#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_RFCR_IND_FILTER_EN_OF_31_23_BIT BIT(22)
+#define MT_WF_RFCR_SECOND_BCN_EN BIT(23)
+#define MT_WF_RFCR_RX_MGMT_FRAME_CTRL BIT(24)
+#define MT_WF_RFCR_RX_DATA_FRAME_CTRL BIT(25)
+#define MT_WF_RFCR_RX_SAMEBSSIDPRORESP_CTRL BIT(26)
+#define MT_WF_RFCR_RX_DIFFBSSIDPRORESP_CTRL BIT(27)
+#define MT_WF_RFCR_RX_SAMEBSSIDBCN_CTRL BIT(28)
+#define MT_WF_RFCR_RX_SAMEBSSIDNULL_CTRL BIT(29)
+#define MT_WF_RFCR_RX_DIFFBSSIDNULL_CTRL BIT(30)
+#define MT_WF_RFCR_DROP_DIFFBSSIDMGT_CTRL BIT(31)
#define MT_WF_RFCR1(_band) MT_WF_RMAC(_band, 0x004)
#define MT_WF_RFCR1_DROP_ACK BIT(4)
@@ -554,6 +564,12 @@ enum offs_rev {
#define MT_WF_RFCR1_DROP_BA BIT(6)
#define MT_WF_RFCR1_DROP_CFEND BIT(7)
#define MT_WF_RFCR1_DROP_CFACK BIT(8)
+#define MT_WF_RFCR1_DROP_PS_BFRPOL BIT(11)
+#define MT_WF_RFCR1_DROP_PS_NDPA BIT(12)
+#define MT_WF_RFCR1_DROP_NO2ME_TF BIT(22)
+#define MT_WF_RFCR1_DROP_NON_MUBAR_TF BIT(23)
+#define MT_WF_RFCR1_DROP_RXS_BRP BIT(25)
+#define MT_WF_RFCR1_DROP_TF_BFRP BIT(30)
#define MT_WF_RMAC_RSVD0(_band) MT_WF_RMAC(_band, 0x02e0)
#define MT_WF_RMAC_RSVD0_EIFS_CLR BIT(21)