]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: mt76: mt7996: fix monitor mode
authorFelix Fietkau <nbd@nbd.name>
Thu, 2 Jan 2025 16:35:08 +0000 (17:35 +0100)
committerFelix Fietkau <nbd@nbd.name>
Tue, 14 Jan 2025 12:42:29 +0000 (13:42 +0100)
Enable sniffer mode via MCU command in order to properly enable promiscuous
mode on the device.

Link: https://patch.msgid.link/20250102163508.52945-24-nbd@nbd.name
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/main.c
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h

index e8a9394e5437873f0121922c267c4c36d477aa60..69dd565d831900fa344e214042a74b2e5b265741 100644 (file)
@@ -368,6 +368,7 @@ static void mt7996_set_monitor(struct mt7996_phy *phy, bool enabled)
        mt76_rmw_field(dev, MT_DMA_DCR0(phy->mt76->band_idx),
                       MT_DMA_DCR0_RXD_G5_EN, enabled);
        mt7996_phy_set_rxfilter(phy);
+       mt7996_mcu_set_sniffer_mode(phy, enabled);
 }
 
 static int mt7996_add_interface(struct ieee80211_hw *hw,
index 6abd666ff19d7993c01fe3f71b618ad1e96585f8..58fc06a6953986ea44e2b6c72f556cd068be95a7 100644 (file)
@@ -4496,6 +4496,27 @@ int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id)
                                 sizeof(req), true);
 }
 
+int mt7996_mcu_set_sniffer_mode(struct mt7996_phy *phy, bool enabled)
+{
+       struct mt7996_dev *dev = phy->dev;
+       struct {
+               u8 band_idx;
+               u8 _rsv[3];
+               __le16 tag;
+               __le16 len;
+               u8 enable;
+               u8 _pad[3];
+       } __packed req = {
+               .band_idx = phy->mt76->band_idx,
+               .tag = 0,
+               .len = cpu_to_le16(sizeof(req) - 4),
+               .enable = enabled,
+       };
+
+       return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(SNIFFER), &req,
+                                sizeof(req), true);
+}
+
 int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
 {
 #define TX_POWER_LIMIT_TABLE_RATE      0
index 18ae2e3ad71b4c59c470ee0068b77fb6eed405f6..1cfcac51a338188c125e7c1a06937fda7bf2ebc9 100644 (file)
@@ -621,6 +621,7 @@ void mt7996_mcu_rx_event(struct mt7996_dev *dev, struct sk_buff *skb);
 void mt7996_mcu_exit(struct mt7996_dev *dev);
 int mt7996_mcu_get_all_sta_info(struct mt7996_phy *phy, u16 tag);
 int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id);
+int mt7996_mcu_set_sniffer_mode(struct mt7996_phy *phy, bool enabled);
 
 static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
 {