OSDN Git Service

mt76: mt7921: introduce support for hardware beacon filter
authorSean Wang <sean.wang@mediatek.com>
Wed, 27 Jan 2021 19:33:47 +0000 (03:33 +0800)
committerFelix Fietkau <nbd@nbd.name>
Fri, 29 Jan 2021 17:09:58 +0000 (18:09 +0100)
Introduce support for hw beacon filter available in the mt7921 firmware.

According to mt7921e firmware, enabling hardware filter would rely on
mt7921_mcu_uni_bss_bcnft and disabling hardware filter still rely on legacy
mt7921_mcu_set_bss_pm.

Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Co-developed-by: Soul Huang <Soul.Huang@mediatek.com>
Signed-off-by: Soul Huang <Soul.Huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h

index 913b560..768456c 100644 (file)
@@ -2500,3 +2500,78 @@ int mt7921_mcu_uni_bss_ps(struct mt7921_dev *dev, struct ieee80211_vif *vif)
        return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
                                 &ps_req, sizeof(ps_req), true);
 }
+
+int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif,
+                            bool enable)
+{
+       struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
+       struct {
+               struct {
+                       u8 bss_idx;
+                       u8 pad[3];
+               } __packed hdr;
+               struct bcnft_tlv {
+                       __le16 tag;
+                       __le16 len;
+                       __le16 bcn_interval;
+                       u8 dtim_period;
+                       u8 pad;
+               } __packed bcnft;
+       } __packed bcnft_req = {
+               .hdr = {
+                       .bss_idx = mvif->mt76.idx,
+               },
+               .bcnft = {
+                       .tag = cpu_to_le16(UNI_BSS_INFO_BCNFT),
+                       .len = cpu_to_le16(sizeof(struct bcnft_tlv)),
+                       .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
+                       .dtim_period = vif->bss_conf.dtim_period,
+               },
+       };
+
+       if (vif->type != NL80211_IFTYPE_STATION)
+               return 0;
+
+       return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
+                                &bcnft_req, sizeof(bcnft_req), true);
+}
+
+int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
+                         bool enable)
+{
+       struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
+       struct {
+               u8 bss_idx;
+               u8 dtim_period;
+               __le16 aid;
+               __le16 bcn_interval;
+               __le16 atim_window;
+               u8 uapsd;
+               u8 bmc_delivered_ac;
+               u8 bmc_triggered_ac;
+               u8 pad;
+       } req = {
+               .bss_idx = mvif->mt76.idx,
+               .aid = cpu_to_le16(vif->bss_conf.aid),
+               .dtim_period = vif->bss_conf.dtim_period,
+               .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
+       };
+       struct {
+               u8 bss_idx;
+               u8 pad[3];
+       } req_hdr = {
+               .bss_idx = mvif->mt76.idx,
+       };
+       int err;
+
+       if (vif->type != NL80211_IFTYPE_STATION)
+               return 0;
+
+       err = mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_ABORT, &req_hdr,
+                               sizeof(req_hdr), false);
+       if (err < 0 || !enable)
+               return err;
+
+       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_CONNECTED, &req,
+                                sizeof(req), false);
+}
index 2103e1d..de3a9aa 100644 (file)
@@ -211,6 +211,7 @@ enum {
        UNI_BSS_INFO_QBSS = 15,
        UNI_BSS_INFO_UAPSD = 19,
        UNI_BSS_INFO_PS = 21,
+       UNI_BSS_INFO_BCNFT = 22,
 };
 
 enum {
index f4435cc..161e328 100644 (file)
@@ -356,4 +356,8 @@ int mt7921_mcu_cancel_hw_scan(struct mt7921_phy *phy,
                              struct ieee80211_vif *vif);
 u32 mt7921_get_wtbl_info(struct mt7921_dev *dev, u16 wlan_idx);
 int mt7921_mcu_uni_bss_ps(struct mt7921_dev *dev, struct ieee80211_vif *vif);
+int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif,
+                            bool enable);
+int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
+                         bool enable);
 #endif