u8 *ieee80211_ie_build_he_cap(u8 *pos,
                              const struct ieee80211_sta_he_cap *he_cap,
                              u8 *end);
+void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata,
+                                   struct sk_buff *skb);
 u8 *ieee80211_ie_build_he_oper(u8 *pos);
 int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef,
                             const struct ieee80211_supported_band *sband,
 
        return 0;
 }
 
+int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data *sdata,
+                           struct sk_buff *skb)
+{
+       ieee80211_ie_build_he_6ghz_cap(sdata, skb);
+       return 0;
+}
+
 static void ieee80211_mesh_path_timer(struct timer_list *t)
 {
        struct ieee80211_sub_if_data *sdata =
                   2 + sizeof(struct ieee80211_vht_operation) +
                   ie_len_he_cap +
                   2 + 1 + sizeof(struct ieee80211_he_operation) +
+                  2 + 1 + sizeof(struct ieee80211_he_6ghz_capa) +
                   ifmsh->ie_len;
 
        bcn = kzalloc(sizeof(*bcn) + head_len + tail_len, GFP_KERNEL);
            mesh_add_vht_oper_ie(sdata, skb) ||
            mesh_add_he_cap_ie(sdata, skb, ie_len_he_cap) ||
            mesh_add_he_oper_ie(sdata, skb) ||
+           mesh_add_he_6ghz_cap_ie(sdata, skb) ||
            mesh_add_vendor_ies(sdata, skb))
                goto out_free;
 
 
                       struct sk_buff *skb, u8 ie_len);
 int mesh_add_he_oper_ie(struct ieee80211_sub_if_data *sdata,
                        struct sk_buff *skb);
+int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data *sdata,
+                           struct sk_buff *skb);
 void mesh_rmc_free(struct ieee80211_sub_if_data *sdata);
 int mesh_rmc_init(struct ieee80211_sub_if_data *sdata);
 void ieee80211s_init(void);
 
                            2 + sizeof(struct ieee80211_vht_operation) +
                            ie_len_he_cap +
                            2 + 1 + sizeof(struct ieee80211_he_operation) +
+                           2 + 1 + sizeof(struct ieee80211_he_6ghz_capa) +
                            2 + 8 + /* peering IE */
                            sdata->u.mesh.ie_len);
        if (!skb)
                    mesh_add_vht_cap_ie(sdata, skb) ||
                    mesh_add_vht_oper_ie(sdata, skb) ||
                    mesh_add_he_cap_ie(sdata, skb, ie_len_he_cap) ||
-                   mesh_add_he_oper_ie(sdata, skb))
+                   mesh_add_he_oper_ie(sdata, skb) ||
+                   mesh_add_he_6ghz_cap_ie(sdata, skb))
                        goto free;
        }
 
 
                                      he_cap->he_cap_elem.phy_cap_info);
        pos = skb_put(skb, he_cap_size);
        ieee80211_ie_build_he_cap(pos, he_cap, pos + he_cap_size);
+
+       ieee80211_ie_build_he_6ghz_cap(sdata, skb);
 }
 
 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
                        2 + 1 + sizeof(struct ieee80211_he_cap_elem) + /* HE */
                                sizeof(struct ieee80211_he_mcs_nss_supp) +
                                IEEE80211_HE_PPE_THRES_MAX_LEN +
+                       2 + 1 + sizeof(struct ieee80211_he_6ghz_capa) +
                        assoc_data->ie_len + /* extra IEs */
                        (assoc_data->fils_kek_len ? 16 /* AES-SIV */ : 0) +
                        9, /* WMM */
 
        return pos;
 }
 
+void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata,
+                                   struct sk_buff *skb)
+{
+       struct ieee80211_supported_band *sband;
+       const struct ieee80211_sband_iftype_data *iftd;
+       enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif);
+       u8 *pos;
+       u16 cap;
+
+       sband = ieee80211_get_sband(sdata);
+       if (!sband)
+               return;
+
+       iftd = ieee80211_get_sband_iftype_data(sband, iftype);
+       if (WARN_ON(!iftd))
+               return;
+
+       cap = le16_to_cpu(iftd->he_6ghz_capa.capa);
+       cap &= ~IEEE80211_HE_6GHZ_CAP_SM_PS;
+
+       switch (sdata->smps_mode) {
+       case IEEE80211_SMPS_AUTOMATIC:
+       case IEEE80211_SMPS_NUM_MODES:
+               WARN_ON(1);
+               /* fall through */
+       case IEEE80211_SMPS_OFF:
+               cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
+                                      IEEE80211_HE_6GHZ_CAP_SM_PS);
+               break;
+       case IEEE80211_SMPS_STATIC:
+               cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_STATIC,
+                                      IEEE80211_HE_6GHZ_CAP_SM_PS);
+               break;
+       case IEEE80211_SMPS_DYNAMIC:
+               cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
+                                      IEEE80211_HE_6GHZ_CAP_SM_PS);
+               break;
+       }
+
+       pos = skb_put(skb, 2 + 1 + sizeof(cap));
+       *pos++ = WLAN_EID_EXTENSION;
+       *pos++ = 1 + sizeof(cap);
+       *pos++ = WLAN_EID_EXT_HE_6GHZ_CAPA;
+       put_unaligned_le16(cap, pos);
+}
+
 u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
                               const struct cfg80211_chan_def *chandef,
                               u16 prot_mode, bool rifs_mode)