mt76: mt7915: enable U-APSD on AP side
Enable U-APSD support for AP interface. Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
35296ed28a
commit
4bf04d33f5
2 changed files with 49 additions and 2 deletions
|
|
@ -1440,6 +1440,38 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
|||
he->pkt_ext = 2;
|
||||
}
|
||||
|
||||
static void
|
||||
mt7915_mcu_sta_uapsd_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct sta_rec_uapsd *uapsd;
|
||||
struct tlv *tlv;
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
|
||||
return;
|
||||
|
||||
tlv = mt7915_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
|
||||
uapsd = (struct sta_rec_uapsd *)tlv;
|
||||
|
||||
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
|
||||
uapsd->dac_map |= BIT(3);
|
||||
uapsd->tac_map |= BIT(3);
|
||||
}
|
||||
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
|
||||
uapsd->dac_map |= BIT(2);
|
||||
uapsd->tac_map |= BIT(2);
|
||||
}
|
||||
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
|
||||
uapsd->dac_map |= BIT(1);
|
||||
uapsd->tac_map |= BIT(1);
|
||||
}
|
||||
if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
|
||||
uapsd->dac_map |= BIT(0);
|
||||
uapsd->tac_map |= BIT(0);
|
||||
}
|
||||
uapsd->max_sp = sta->max_sp;
|
||||
}
|
||||
|
||||
static void
|
||||
mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||
{
|
||||
|
|
@ -1513,7 +1545,7 @@ mt7915_mcu_add_mu(struct mt7915_dev *dev, struct ieee80211_vif *vif,
|
|||
|
||||
static void
|
||||
mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
|
||||
struct ieee80211_sta *sta)
|
||||
struct ieee80211_sta *sta, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct tlv *tlv;
|
||||
|
||||
|
|
@ -1540,6 +1572,9 @@ mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
|
|||
/* starec he */
|
||||
if (sta->he_cap.has_he)
|
||||
mt7915_mcu_sta_he_tlv(skb, sta);
|
||||
|
||||
/* starec uapsd */
|
||||
mt7915_mcu_sta_uapsd_tlv(skb, sta, vif);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -2176,7 +2211,7 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
|
|||
|
||||
mt7915_mcu_sta_basic_tlv(skb, vif, sta, enable);
|
||||
if (enable && sta)
|
||||
mt7915_mcu_sta_tlv(dev, skb, sta);
|
||||
mt7915_mcu_sta_tlv(dev, skb, sta, vif);
|
||||
|
||||
sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
|
||||
|
||||
|
|
|
|||
|
|
@ -645,6 +645,17 @@ struct sta_rec_vht {
|
|||
u8 rsv[3];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_uapsd {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 dac_map;
|
||||
u8 tac_map;
|
||||
u8 max_sp;
|
||||
u8 rsv0;
|
||||
__le16 listen_interval;
|
||||
u8 rsv1[2];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_muru {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
|
|
@ -951,6 +962,7 @@ enum {
|
|||
sizeof(struct sta_rec_he) + \
|
||||
sizeof(struct sta_rec_ba) + \
|
||||
sizeof(struct sta_rec_vht) + \
|
||||
sizeof(struct sta_rec_uapsd) + \
|
||||
sizeof(struct tlv) + \
|
||||
MT7915_WTBL_UPDATE_MAX_SIZE)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue