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)
 {
 
 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;
 
        /* 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
 
        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));