arg.pref_tx_streams = ar->num_tx_chains;
        arg.pref_rx_streams = ar->num_rx_chains;
+       arg.punct_bitmap = 0xFFFFFFFF;
 
        arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
 
        const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
        const struct ieee80211_eht_mcs_nss_supp_bw *bw;
+       struct ath12k_vif *arvif = (struct ath12k_vif *)vif->drv_priv;
        u32 *rx_mcs, *tx_mcs;
 
        if (!sta->deflink.he_cap.has_he || !eht_cap->has_eht)
                arg->peer_eht_mcs_count++;
                break;
        }
+
+       arg->punct_bitmap = ~arvif->punct_bitmap;
 }
 
 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
            changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
                ath12k_mac_fils_discovery(arvif, info);
 
+       if (changed & BSS_CHANGED_EHT_PUNCTURING)
+               arvif->punct_bitmap = info->eht_puncturing;
+
        mutex_unlock(&ar->conf_mutex);
 }
 
        arg.vdev_id = arvif->vdev_id;
        arg.dtim_period = arvif->dtim_period;
        arg.bcn_intval = arvif->beacon_interval;
+       arg.punct_bitmap = ~arvif->punct_bitmap;
 
        arg.freq = chandef->chan->center_freq;
        arg.band_center_freq1 = chandef->center_freq1;
        arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
 
        ath12k_dbg(ab, ATH12K_DBG_MAC,
-                  "mac vdev %d start center_freq %d phymode %s\n",
+                  "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
                   arg.vdev_id, arg.freq,
-                  ath12k_mac_phymode_str(arg.mode));
+                  ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
 
        ret = ath12k_wmi_vdev_start(ar, &arg, restart);
        if (ret) {
                   "mac chanctx assign ptr %pK vdev_id %i\n",
                   ctx, arvif->vdev_id);
 
+       arvif->punct_bitmap = link_conf->eht_puncturing;
+
        /* for some targets bss peer must be created before vdev_start */
        if (ab->hw_params->vdev_start_delay &&
            arvif->vdev_type != WMI_VDEV_TYPE_AP &&
                                      NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
        }
 
+       wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_PUNCT);
+
        ath12k_reg_init(ar);
 
        if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
 
        cmd->cac_duration_ms = cpu_to_le32(arg->cac_duration_ms);
        cmd->regdomain = cpu_to_le32(arg->regdomain);
        cmd->he_ops = cpu_to_le32(arg->he_ops);
+       cmd->punct_bitmap = cpu_to_le32(arg->punct_bitmap);
 
        if (!restart) {
                if (arg->ssid) {
 
        cmd->peer_new_assoc = cpu_to_le32(arg->peer_new_assoc);
        cmd->peer_associd = cpu_to_le32(arg->peer_associd);
+       cmd->punct_bitmap = cpu_to_le32(arg->punct_bitmap);
 
        ath12k_wmi_copy_peer_flags(cmd, arg,
                                   test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED,
 
        __le32 he_ops;
        __le32 cac_duration_ms;
        __le32 regdomain;
+       __le32 min_data_rate;
+       __le32 mbssid_flags;
+       __le32 mbssid_tx_vdev_id;
+       __le32 eht_ops;
+       __le32 punct_bitmap;
 } __packed;
 
 #define MGMT_TX_DL_FRM_LEN                  64
        u32 pref_rx_streams;
        u32 pref_tx_streams;
        u32 num_noa_descriptors;
+       u32 min_data_rate;
+       u32 mbssid_flags;
+       u32 mbssid_tx_vdev_id;
+       u32 punct_bitmap;
 };
 
 struct ath12k_wmi_peer_create_arg {
        u32 peer_eht_rx_mcs_set[WMI_MAX_EHTCAP_RATE_SET];
        u32 peer_eht_tx_mcs_set[WMI_MAX_EHTCAP_RATE_SET];
        struct ath12k_wmi_ppe_threshold_arg peer_eht_ppet;
+       u32 punct_bitmap;
 };
 
 struct wmi_peer_assoc_complete_cmd {
        __le32 bss_max_idle_option;
        __le32 auth_mode;
        __le32 peer_flags_ext;
-       __le32 puncture_20mhz_bitmap;
+       __le32 punct_bitmap;
        __le32 peer_eht_cap_mac[WMI_MAX_EHTCAP_MAC_SIZE];
        __le32 peer_eht_cap_phy[WMI_MAX_EHTCAP_PHY_SIZE];
        __le32 peer_eht_ops;