mt76: mt7921: introduce support for hardware beacon filter
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>
This commit is contained in:
parent
56d965da13
commit
4086ee28e2
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue